मैं आवेदसा में डेवलपर प्रचारक हूं। हमने मोबाइल ऐप डेवलपर्स के लिए टूल का एक अच्छा सेट बनाया है, जिसमें से एक बास सेवा प्रदान करता है जो पार्स, स्टैकमोब और अन्य की तुलना में थोड़ा अलग दृष्टिकोण लेता है। मुझे लगता है कि यह तीसरे पक्ष के एसडीके एपीआई से दूर सारणी की समस्या से निपटने के लिए एक सहायक परिप्रेक्ष्य प्रदान करता है जिससे आप अन्य प्रदाताओं या स्वयं के बैकएंड को प्रतिस्थापित कर सकें। /अस्वीकरण
क्या वहां ऐसा कुछ है? मैं पहले से ही सफलता के बिना खोज की है, लेकिन शायद मैं गलत दिशा में देख रहा हूँ
जबकि वहाँ वहाँ बाहर अन्य BAAS प्रदाताओं कि इसी तरह की और फर्क सुविधाओं प्रदान कर रहे हैं, मैं नहीं एक उत्पाद के बारे में पता वहाँ बाहर है कि पूरी तरह से कर रहा हूँ एक अज्ञेय तरीके से तीसरे पक्ष के प्रदाताओं को छोड़ देता है।
कुछ इस तरह के लिए सर्वोत्तम प्रथाओं क्या हैं?
मुझे लगता है कि आप सही दिशा में शुरू करने के लिए पहले से ही ठोस पैर पर दिख रहे हैं।
सबसे पहले, आप की भविष्यवाणी है कि आप विभिन्न वर्गों है कि एक बैकएंड-नास्तिक रास्ते में वस्तुओं और आवश्यक कार्यक्षमता को संपुटित की संख्या के साथ खत्म हो जाएगा में सही कर रहे हैं। निश्चित रूप से यह संख्या इस बात पर निर्भर करेगी कि आप किस प्रकार के अमूर्त और encapsulation के बाद जा रहे हैं। दृष्टिकोण आप भी रूपरेखा तरह से मैं के साथ-साथ इस तरह के एक परियोजना शुरू करना चाहते हैं, — उन वर्गों पर सभी वस्तुओं अपने आवेदन के साथ बातचीत करने की आवश्यकता होगी के लिए कक्षाओं का निर्माण, और लागू करने के लिए कस्टम तरीकों (या एक आधार वर्ग वे सभी का विस्तार) की तरह लगता है जो बैकएंड प्रदाता के साथ बातचीत करने का वास्तविक काम करेगा।
तो, अगर मैं एक ऐप्लिकेशन है जो, उदाहरण के लिए, एक Foo
, Bar
, और Baz
वस्तु था निर्माण किया गया था, मैं उन कक्षाओं अपने आंतरिक एपीआई के भाग के रूप में सभी आवश्यक मेरे ऐप के लिए आवश्यक कार्यक्षमता के साथ बना सकते हैं,। सभी एप्लिकेशन तर्क और कार्यात्मक आपरेशन केवल उन्हीं वर्गों के साथ बातचीत करेंगे, और सभी एप्लिकेशन तर्क और कार्यक्षमता डेटा बैकएंड-अज्ञेयवाद (कोई आंतरिक कार्यक्षमता अर्थ एक डेटा बैकएंड पर निर्भर कर सकता है हो सकता है, लेकिन वस्तु कक्षाएं एक सुसंगत इंटरफेस के संचालन की अनुमति दी है कि प्रदान करेगा डेटा हैंडलिंग विधियों को निजी रखते हुए प्रदर्शन किया जाना चाहिए)।
फिर, मैं संभवतः प्रत्येक वर्ग को BaseObject
कक्षा से प्राप्त कर दूंगा, जिसमें वास्तव में डेटा बैकएंड (प्रदाता-आधारित या मेरा स्वयं का कस्टम रिमोट बैकएंड) से बात की जाने वाली विधियां शामिल होंगी। BaseObject
वर्ग की तरह हो सकता है तरीकों saveObject
, getById:
, getObjects
(खोज/वस्तु को छानने के प्रदर्शन के लिए कुछ उचित मानकों के साथ)। तब, जब मैं भविष्य में अपने बैकएंड डेटा सेवा बदलना चाहते हैं, मैं केवल BaseObject
वर्ग तरीकों कि डेटा बातचीत संभाल, सभी मेरे ऐप तर्क & कार्यक्षमता Foo
, Bar
से जुड़ा हुआ है, जबकि अद्यतन करने पर ध्यान केंद्रित करना होगा, और Baz
कक्षाओं, और वास्तव में परवाह नहीं है कि दृश्यों के पीछे संचालन कैसे काम/सहेजें/अद्यतन/हटाएं।
अब, संभव के रूप में अपने आप पर आसान के रूप में चीजों को रखने के लिए, मैं अपने BAAS स्कीमा बाहर का निर्माण होता है आंतरिक वस्तु वर्ग नाम से मेल करने (जहां, BAAS आवश्यकताओं के आधार पर, मैं इस्तेमाल कर सकते हैं या तो एक isKindOfClass:
या NSStringFromClass:
कॉल)। इसका मतलब यह है कि अगर मैं पार्स उपयोग कर रहा था, मैं अपने save
विधि डेटा कार्रवाई करने के लिए वर्ग के नाम की NSStringFromClass:
मिल बनाना चाहते चाहते हैं। अगर मैं Applicasa की तरह एक सेवा है, जो डेटा बातचीत के लिए देशी वस्तुओं की एक कस्टम एसडीके उत्पन्न उपयोग कर रहा था, मैं पर isKindOfClass:
परिणाम कस्टम डेटा कार्यों के आधार के लिए चाहते हैं। अगर मैं और से अधिक लचीलापन चाहता हूं (शायद कई बैकएंड प्रदाताओं का उपयोग करने की अनुमति देने के लिए, या कुछ अन्य जटिल आवश्यकताएं), तो मैं सभी बच्चों की कक्षाओं को BaseObject
बताऊंगा कि किसी प्रकार के माध्यम से डेटा संचालन के लिए किस स्कीमा नाम का उपयोग करना है कस्टम विधि का, जैसे getSchemaName
। मैं शायद इसे BaseObject
विधि के रूप में परिभाषित करता हूं जो क्लास नाम को डिफ़ॉल्ट रूप से स्ट्रिंग के रूप में वापस कर देगा, लेकिन फिर आगे अनुकूलित करने के लिए बाल कक्षाओं पर लागू होगा।
- (BOOL) save {
// call backend-specific method for saving an object
BaasProviderObject *objectToSave = [BaasProviderObject
objectWithClassName:[self getSchemaName]];
// Transfer all object properties to BaasProviderObject properties
// Implement however it makes the most sense for BaasProvider
// After you've set all calling object properties to BaasProviderObject
// key-value pairs or object properties, you call the BaasProvider's save
[objectToSave save];
// Return a BOOL value to indicate actual success/failure
return YES; // you'll want this to come from BaaS
}
तब में, कहते हैं
, Foo
वर्ग, मैं इतना की तरह getSchemaName
लागू हो सकता है:: तो, एक BaseObject
save
विधि के अंदर कुछ इस तरह लग सकता है
- (NSString) getSchemaName {
// Return a custom NSString for BaasProvider schema
return @"dbFoo";
}
मुझे आशा है कि समझ में आता है ।
क्या मुझे पर्स एसडीके के साथ रहना चाहिए ताकि यह सुनिश्चित हो सके कि इसका उपयोग करने वाला कोड अच्छी तरह से पहचाना और निहित है?
बनाना इस तरह एक आंतरिक अमूर्त सामने काम भी पर्याप्त मात्रा में हो जाएगा, लेकिन यह अनिवार्य रूप से अपनी इच्छानुसार लचीलापन का एक बहुत लागू करने के लिए की पेशकश करेगा। आप कोरडाटा को कार्यान्वित कर सकते हैं, कोरडाटा को अस्वीकार कर सकते हैं, और जो भी आप वास्तव में करना चाहते हैं। एक डेटा-अज्ञेय तरीके से आंतरिक ऐप तर्क/कार्यक्षमता के निर्माण के लिए निश्चित फायदे हैं, भले ही यह आपके ऐप कोड की एक कस्टम शाखा कहें, यह देखने के लिए कि आप किसी अन्य प्रदाता को कैसे पसंद करते हैं, या आपको अपने स्वयं के डेटा समाधान के विकास के साथ काम करने का एक आसान मार्ग प्रदान करने के लिए)।
मुझे उम्मीद है कि इससे मदद मिलती है।
अच्छा धन्यवाद। इससे मेरे दिमाग में कुछ चीजें साफ हो गईं। मैं इसे नीचे के दृष्टिकोण में देख रहा था, इस बारे में सोच रहा हूं कि मेरे बाएएस प्रदाता को कैसे एन्कापुलेट करना है, इस पर ध्यान दिए बिना कि मैं जिस ऐप का निर्माण कर रहा हूं। आपका दृष्टिकोण मुझे दो मामलों के अलगाव में सुधार करने की इजाजत देता है जबकि बहुत अधिक काम नहीं कर रहा है। –