2011-09-09 14 views
32

मैं वितरित करने के लिए फ्रेमवर्क ए फ्रेमवर्क एक फ्रेमवर्क बी पर निर्भर करता है मैं फ्रेमवर्क एक शामिल करने के लिए केवल जरूरत के लिए अपने ढांचे का एक उपयोगकर्ता चाहते हैं, लेकिन अभी भी फ्रेमवर्क बी को प्रोग्रामेटिक एक्सेसछतरी ढांचे को क्यों हतोत्साहित किया जाता है?

एप्पल यह सब समय करता है चाहता हूँ "अम्ब्रेला फ़्रेमवर्क" की अवधारणा का उपयोग कर, लेकिन डॉक्स में इस विषय है:

छाता फ़्रेमवर्क

बनाएं मत करो हालांकि यह संभव है Xcode का उपयोग कर छाता चौखटे बनाने के लिए है, तो कर अधिकांश डी के लिए अनावश्यक है velopers और अनुशंसित नहीं है। ऐप्पल ऑपरेटिंग सिस्टम में पुस्तकालयों के बीच कुछ परस्पर निर्भरताओं को मुखौटा करने के लिए छतरी ढांचे का उपयोग करता है। लगभग सभी मामलों में, आपको होना चाहिए जो आपके कोड को एकल, मानक फ्रेमवर्क बंडल में शामिल करने में सक्षम हो। वैकल्पिक रूप से, यदि आपका कोड पर्याप्त मॉड्यूलर था, तो आप एकाधिक ढांचे बना सकते हैं, लेकिन उस स्थिति में, मॉड्यूल के बीच निर्भरता न्यूनतम या nonexistent होगी और उनके लिए छतरी बनाने की गारंटी नहीं देनी चाहिए।

यह दृष्टिकोण क्यों निराश है? ऐप्पल की परस्पर निर्भर ढांचे की समस्या के लिए यह एक अच्छा समाधान क्यों बनाता है लेकिन मेरे लिए नहीं?

+0

मैं भी यह जानना चाहता हूं। गिट रिपोजिटरी के साथ स्वचालित निर्माण की स्थापना, आश्रित परियोजनाओं में सिम्लिंक, ढांचे/हेडर खोज पथ और सभी मजेदार चीजें ढांचे और परियोजनाओं की संख्या बढ़ने पर बहुत मज़ेदार हो सकती हैं। – Minthos

+7

आप सबूत के बिना मान रहे हैं कि छाता ढांचे * * * "ऐप्पल की समस्या के लिए एक अच्छा समाधान है"। मेरी अनौपचारिक राय यह है कि विपरीत सत्य है: पुराना ओएसएक्स, या पुराने संस्करणों के लिए ओएसएक्स के नए संस्करणों की तुलना में आईओएस की तुलना में, मुझे ढांचे के कोरग्राफिक्स चलने * आउट * जैसे स्टैंडवर्कल फ्रेमवर्क में ढांचे दिखाई देते हैं। मुझे लगता है कि "छाता" का विचार कोको के बढ़ते दर्द को कम करने के लिए एक अच्छा झुकाव था, लेकिन कभी भी "ऐप्पल की समस्या के लिए अच्छा समाधान" नहीं था; और शायद वे आपको एक ही गड़बड़ में पकड़े जाने से दूर चेतावनी दे रहे हैं। – Quuxplusone

+0

मैं इस सवाल को ऑफ-विषय के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि यह विषय बहुत पुराना है। वर्तमान में, आईओएस एसडीके 8.0 और ऊपर, गतिशील ढांचे, और त्वरित वाक्यविन्यास प्रदान करते हैं। तो, यह सवाल अब उपयोगी नहीं है। – AechoLiu

उत्तर

43

छाता ढांचे केवल तभी समझ में आते हैं जब आप सभी शामिल ढांचे का एकमात्र वितरक हैं, और आप एक ही संस्करण वाले पैकेज के रूप में सभी ढांचे को पैकेजिंग करेंगे जो एक साथ अपग्रेड किए जाएंगे। यदि यह आपकी स्थिति है, तो यह ठीक है, लेकिन यह एक बहुत असामान्य स्थिति है। कोको विकास दुनिया में, यह किसी के लिए बेहद असामान्य है लेकिन ऐप्पल इस स्थिति में होना चाहिए।

पहली बात पर, छाता ढांचे केवल तभी समझ में आते हैं जब आप दिए गए ढांचे का एकमात्र वितरक हैं। उदाहरण के लिए, कहें कि आप अपने छतरी ढांचे के हिस्से के रूप में libcurl शामिल करना चाहते थे। अब कुछ अन्य पैकर भी अपने छतरी ढांचे के हिस्से के रूप में libcurl शामिल करना चाहता है। अब हमारे पास एक लिंक-टाइम टक्कर है जो या तो लिंक त्रुटियों या बदतर, अपरिभाषित रनटाइम व्यवहार का कारण बन सकती है। मैंने इन्हें खुद का पीछा किया है। वे बेहद अप्रिय हैं। इससे बचने का एकमात्र तरीका प्रत्येक ढांचे/पुस्तकालय का केवल एक संस्करण होना है। छाता ढांचे विपरीत को प्रोत्साहित करते हैं।

भले ही आप अपने स्वयं के कोड को उप-टुकड़ों में तोड़ रहे हों, इसका मतलब है कि अन्य विक्रेता आपके उप-ढांचे का उपयोग अपने स्वयं के छतरी ढांचे में कर सकते हैं, जिससे एक ही समस्या हो सकती है। याद रखें, अगर आप कहते हैं कि छतरी ढांचे का उपयोग करने के लिए तीसरे पक्ष के रूप में आपके लिए यह ठीक है, तो यह अन्य विक्रेताओं के लिए भी ठीक है।

दूसरे बिंदु पर, छतरी ढांचे केवल तभी समझ में आते हैं जब आप सभी उप-ढांचे के संस्करण को नियंत्रित करते हैं। ढांचे के एक अंतर-निर्भर सेट के एक टुकड़े को पैच करने की कोशिश करना लगभग हमेशा मेरे अनुभव में एक आपदा है।

ओएस विक्रेता के पास उनके सिस्टम के आकार और सर्वव्यापीता के कारण असामान्य स्थिति है। चीजें जो एक पैमाने पर समझ में आती हैं अक्सर दूसरे पर समझ में नहीं आती हैं। NSResponder इसके बारे में पूरी तरह से सही है। व्यापार-बंद अलग-अलग होते हैं जब आप एक पूर्ण, बहु-हजार पैकेज वातावरण प्रदान कर रहे हैं जो मंच के लिए लिखे गए प्रत्येक कार्यक्रम का आधार है। लेकिन यहां तक ​​कि ऐप्पल में केवल कुछ हद तक बड़े छतरी ढांचे हैं, और वे हमेशा पुस्तकालयों के चारों ओर रैपर होते हैं जो वे संस्करण प्रदान करते हैं और नियंत्रित करते हैं। यह ज्यादातर डेवलपर्स के काम को सरल बनाने के लिए है जो अन्यथा संकलन करने के लिए कुछ हासिल करने के लिए दर्जनों पुस्तकालयों और ढांचे का पीछा करना होगा। किसी तीसरे पक्ष की स्थिति नहीं है, और इसलिए यह बहुत दुर्लभ है कि किसी तीसरे पक्ष को इस समाधान की आवश्यकता है। अपने ग्राहक से दो पुस्तकालयों को जोड़ने के लिए पूछना पूरी तरह से अलग है, तो उन्हें 20 लिंक करने के लिए कहें। यदि आप 20 ढांचे प्रदान कर रहे हैं जो सभी एक साथ काम करते हैं और आप नियंत्रण करते हैं, तो शायद आपको छतरी का उपयोग करना चाहिए, लेकिन शायद आपके पास बहुत सारे ढांचे हैं तृतीय पक्ष।

मेरी अधिकांश चर्चा ओएस एक्स के मामले में है। आईओएस पर यह तीसरे पक्ष के लिए एक गैर-मुद्दा है। स्थिर पुस्तकालयों को टकराव के कारण अन्य स्थैतिक पुस्तकालयों को कभी भी लिंक नहीं करना चाहिए जो निश्चित रूप से घटित होंगे।

सिद्धांत रूप में, मैंने जिन मुद्दों पर चर्चा की है, वे यहां लिंकर की मौलिक तकनीकी सीमाएं हैं। लिंकर के पुस्तकालयों के कई संस्करणों को प्रबंधित करने का कोई अच्छा तरीका नहीं है और इसलिए टकराव एक गंभीर समस्या है। .NET असेंबली इस के आसपास अधिक लचीलापन प्रदान करने का प्रयास करें। मैं .NET विकास के साथ पर्याप्त परिचित नहीं हूं कि यह सफल रहा है या नहीं। बड़े बहु-घटक प्रणालियों के साथ मेरा अनुभव यह है कि अधिकांश समस्याओं के लिए सरल, कम लचीला समाधान सर्वोत्तम होते हैं। (लेकिन फिर, घास हमेशा हिरण है ....)

+0

अच्छी व्याख्या, धन्यवाद :) – Minthos

+0

क्या होगा यदि मैं सिर्फ अपने ढांचे को तीसरे पक्ष के ढांचे का उपयोग करना चाहता हूं? मैं कैसे सुनिश्चित करूं कि * मेरे * उपयोगकर्ता इससे भी लिंक हैं? – zneak

+2

अपने उपयोगकर्ता को इसमें शामिल करने और उससे जोड़ने का निर्देश देकर। गतिशील libs (ओएस एक्स और आईओएस 8) के साथ, सिस्टम-स्तरीय ढांचे को स्वयं लिंक करना ठीक है। लेकिन पहले तीसरे पक्ष के ढांचे, एकमात्र समझदार दृष्टिकोण ऐप डेवलपर के नियंत्रण में ऐप स्तर पर सभी लिंकिंग करना है। अपने कॉलर के लिए स्वतः लिंक करने के लिए, एक निर्भरता प्रबंधन प्रणाली होनी चाहिए, और इसमें कोई भी निर्मित नहीं है। कोकोपोड्स एक प्रदान करता है यदि आप और आपके कॉलर दोनों इसका उपयोग करना चुनते हैं। लेकिन कुछ को ऐप स्तर पर निर्भरता को संभालना चाहिए। आप इसे अपने कॉलर के ढांचे से नहीं कर सकते हैं। –

1

ऐप्पल के मामले में, वे बड़ी मात्रा में कोड वितरित कर रहे हैं, और उन उप-ढांचे को अक्सर अलग से संशोधित किया जाता है। यदि आप कई प्रकार के ढांचे को वितरित कर रहे हैं, तो आप आगे बढ़ना और छतरी ढांचा बनाना चाहते हैं। यदि नहीं, तो आपको शायद परेशानी की आवश्यकता नहीं है।

+3

यह ऐसा लगता है कि यह केवल पैमाने का प्रश्न है। यदि यह कई ढांचे के लिए एक अच्छा समाधान है, तो कुछ ढांचे के लिए भी एक अच्छा समाधान क्यों नहीं है? ऐसा कहने की तरह है कि ओओ डिज़ाइन केवल एक अच्छा विचार है यदि आपके पास बड़ी मात्रा में कोड है। हां, यह उस मामले के लिए अच्छा है, लेकिन यह भी अच्छा है भले ही आपके पास केवल कुछ कक्षाएं हों। –

+1

यदि कंटेनर जहाज माल के टन के लिए एक अच्छा समाधान है, तो यह किराने का सामान के कुछ बैग के लिए एक अच्छा समाधान क्यों नहीं है? – NSResponder

+4

देखो, मैं वास्तव में यहां समानता के युद्ध में नहीं आना चाहता हूं। मेरा प्राथमिक प्रश्न यह है: मैं एक ढांचे के रूप में कई ढांचे को वितरित करना चाहता हूं। ऐप्पल के लिए इसका अच्छा समाधान है, लेकिन वे इसके उपयोग को हतोत्साहित करते हैं। क्यूं कर? इस सवाल का एक अच्छा जवाब मुझे बताएगा कि छतरी ढांचे के बारे में समस्याग्रस्त क्या है जो इसे केवल ऐप्पल के ढांचे के लिए व्यवहार्य बनाता है। आपका जवाब बताता है कि ऐप्पल के लिए छाता ढांचे क्यों अच्छे हैं, लेकिन आप यह नहीं समझाते कि वे मेरे लिए क्यों बुरे हैं। –

5

एक मुद्दा यह है कि फ्रेमवर्क बी का संस्करण अब फ्रेमवर्क ए के संस्करण से जुड़ा हुआ है। यह कुछ मामलों में आप चाहते हैं और दूसरों को नहीं। यदि फ्रेमवर्क बी को एक ऐप द्वारा स्वतंत्र रूप से इस्तेमाल किया जा सकता है जो फ्रेमवर्क ए का उपयोग करना चाहता है तो वह ऐप खुद को ऐसी परिस्थिति में ढूंढ सकता है जहां बी में शामिल बी का संस्करण वह संस्करण नहीं है जिसे इसकी आवश्यकता है या चाहता है।

फ्रेमवर्क बी एक ढांचा है कि एक ऐप स्वतंत्र रूप से ए का उपयोग कर सकता है? यदि ऐसा है तो आप इस परिदृश्य में भाग सकते हैं। यदि बी ढांचा है जो ए के बाहर उपलब्ध नहीं है तो आपको इस परिदृश्य में भाग नहीं लेना चाहिए।

+0

यह एक उत्कृष्ट बिंदु है, धन्यवाद। मेरे मामले में यह कोई मुद्दा नहीं होगा, लेकिन मैं निश्चित रूप से देख सकता हूं कि यह एक कारक कैसा है। –

संबंधित मुद्दे