2009-11-29 16 views
15

मैं अब थोड़ी देर के लिए इस सवाल पर विचार किया गया है ...आईबी इंटरफ़ेस को निब या कोड में डिज़ाइन करना?

एक तरफ, इंटरफ़ेस बिल्डर इंटरफेस और तार कोड में वस्तुओं के साथ तत्वों अप डिजाइन करने के लिए एक बहुत आसान तरीका प्रदान करता है।

दूसरी ओर, बड़ी परियोजनाओं में, इंटरफ़ेस बिल्डर को बनाए रखने में परेशानी हो जाती है।

किसी भी सुझाव की सराहना की जाएगी।

+3

आपके पास एक वैध प्रश्न है। आईबी में इंटरफेस का प्रबंधन एक अलग प्रतिमान है जिसके लिए नए कौशल और परिचितता की आवश्यकता होती है। हालांकि, एहसास है कि आईबी के बिना हाथ से इंटरफेस बनाना एक दुर्लभ कौशल है, और इस तरह के कोड से निपटने में सक्षम लोगों को ढूंढने या खोजने में लोगों की तलाश है। मैं अनुमान लगाता हूं कि आईबी में बनाए रखने के लिए बड़ी परियोजनाएं वास्तव में आसान हैं, लेकिन यह अभी भी एक ट्रेडऑफ है - बातचीत हमेशा आईबी में दिखाई नहीं देती है, लेकिन जब आप इसे कोड में करते हैं, तो यह अतिरिक्त गोंद कोड जोड़ता है और क्षमता को हटा देता है आपके लिए चीजों को अनुकूलित करने के लिए ओएस और रनटाइम के लिए। –

उत्तर

17

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

हालांकि, कहानी आज के आईफोन एसडीके के साथ बहुत अलग है। हालांकि अभी भी कुछ कष्टप्रद आईबी कीड़े हैं, लेकिन मैंने इंटरफेस बिल्डर का उपयोग करने के प्रति अपने दृष्टिकोण के साथ लगभग 180˚ किया है। आपकी परियोजनाओं में इंटरफ़ेस बिल्डर का उपयोग करना एक अच्छा विचार नहीं है, मैंने पाया है। यह अब एक अच्छा उपकरण है, और आपको इसका लाभ उठाना चाहिए।

अब, मुझे गलत नहीं मिलता है - मैं अभी भी मजबूती से शिविर का मानना ​​है कि आप कुछ भी आप इंटरफ़ेस बिल्डर में क्या अकेले कोड का उपयोग कर लागू करने के लिए सक्षम होना चाहिए में हूँ और मुझे लगता है कि ऐसा करने में सक्षम किया जा रहा है तो अमूल्य है । एक क्रैच के रूप में इंटरफ़ेस बिल्डर का उपयोग न करें - अंत में आप केवल खुद को (और आपकी उत्पादकता या आपके उत्पादों की गुणवत्ता) को चोट पहुंचाएंगे। आईबी के खींचें और ड्रॉप ब्योरा आप करने की आवश्यकता होगी क्या के 90% के लिए महान हैं, आप कुछ कस्टम जब कि लागू करने के लिए केवल कोड में किया जा सकता, या तो आप चाहें तो आप का पालन किया या आभारी था करेंगे इस सलाह का पालन करने के लिए। मैं इतनी देर से आईबी से नफरत करने के लिए भाग्यशाली था कि मैंने खुद को सिखाया कि अकेले कोड में सबकुछ कैसे करें, और उसके बाद उस ज्ञान को आईबी पर लागू किया जाए।

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

+3

+1 बहुत अच्छी तरह से डाल दिया।आईबी और एमवीसी को समझना आपको आवश्यकता होने पर जो भी चाहिए, उसे करने की अनुमति देता है, लेकिन हाथ से इंटरफेस करना आम तौर पर लाभ के बजाय एक विकलांगता होगी। बुद्धिमान कदम यह है कि आप अपने डेवलपर्स के अनुभव, गैर-मानक कार्यक्षमता की मात्रा, जिसे आप कार्यान्वित करने की योजना बना रहे हैं, और परियोजना के आधार पर निर्णय लेना है। इन सभी कारकों के साथ भी, मैं हमेशा इसे पहले आईबी में करता हूं, फिर केवल इसे हाथ से करें यदि आप इसे आईबी में नहीं कर सकते हैं। –

8

का उपयोग करते हुए बिल्डरों आप कोड है कि आप अन्यथा बनाए रखने के लिए और कम आप बेहतर बनाए रखने की जरूरत की आवश्यकता होगी की मुक्त करता है।

आईबी द्वारा बनाया गया लेआउट कुछ रखरखाव की आवश्यकता होती है, लेकिन यह अपने आप प्रलेखन और अपने स्वयं के ऑनलाइन समर्थन (मंचों, सूची, आदि) के साथ एक मानक उपकरण है। किसी और कभी भी अपने कोड में कूद करने की जरूरत है, तो आप लगभग गारंटी ले सकते हैं कि वे आईबी के साथ अनुभव है, लेकिन जरूरी नहीं कि अपने लेआउट इमारत की विशेष शैली।

7

यह आपकी वरीयता पर निर्भर करता है।

मैं इसे कोड में लिखना पसंद करता हूं।

  1. मुझे कोड का पुन: उपयोग करना है।
  2. एक एक्सआईबी/एनआईबी का उपयोग आम तौर पर एक परिभाषा नियम तोड़ता है (यदि आप कोई अनुकूलन कर रहे हैं)।
  3. एक्सआईबी/एनआईबी रखरखाव अक्सर अधिक कठिन और त्रुटि प्रवण (ओडीआर) होता है। मैं वास्तव में प्रत्येक बटन के लिए बटन शैलियों (उदाहरण) को बनाए रखने से नापसंद करता हूं।
  4. परिपत्र संदर्भ अधिक संभावना है।
  5. कोड/ऑब्जेक्ट्स/ib उदाहरण अक्सर कम पुन: प्रयोज्य/मॉड्यूलर होते हैं। हालांकि मैं एक ui वस्तु से बचने के लिए प्रकार हूं जो सबकुछ कर सकता है।
  6. डिफर्ड/संदिग्ध प्रारंभिक आदेश क्लाइंट के लिए एक बहुत डरावनी स्थिति के लिए बनाता है, जिसे उन्हें किसी ऑब्जेक्ट को कभी भी उपयोग के लिए तैयार नहीं किया जाना चाहिए या पूरी तरह से प्रारंभ नहीं किया जाना चाहिए (जब तक कि आप उन चेक को बनाए रखना पसंद न करें, जो समय बर्बाद करने का एक अच्छा तरीका है)।
  7. यदि प्रदर्शन महत्वपूर्ण है, तो अनुमान लगाएं कि तेज़ कौन सा है?
  8. संसाधन प्रबंधन बनाम लिंकर ... गंभीरता से, मैंने बंडल में निब्स के अस्तित्व को सत्यापित करने के लिए उप-कार्यक्रम और परीक्षण लिखे हैं।

आईबी, प्रोटोटाइप और ब्राउज़िंग वस्तु क्षमताओं और दिखावे के लिए महान (मैं एक ग्राफिक डिजाइनर नहीं कर रहा हूँ) है, हालांकि मुझे लगता है कि यह सबसे आसान है बस कोड में यह लिखने के लिए एक बार प्रोटोटाइप मौजूद है अगर आप में से किसी इरादा नहीं है इसे बनाए रखना या पुन: उपयोग करना।

मेरी सिफारिश: अत्यधिक पुन: प्रयोज्य और स्थिर कोड पुस्तकालय लिखें, और मुख्य रूप से प्रोटोटाइप और एक-ऑफ के लिए आईबी का उपयोग करें।


जवाब:

Sbrocket: मैं तुम क्यों जोर है कि वृत्तीय संदर्भ अधिक महत्वपूर्ण व्यक्ति का उपयोग करने का एक परिणाम के रूप होने की संभावना है जानने के लिए उत्सुक हूँ।

हाय स्क्रब्रेट: मैं यह कहकर शुरू करूंगा कि मैंने प्रोजेक्ट बिल्डर दिनों (एक्सकोड के पूर्ववर्ती) के बाद इंटरफ़ेस बिल्डर का उपयोग किया है।

विश्वसनीय संरचित स्वामित्व, पहचान, और प्रारंभिकता की कमी। मैं आईवी कनेक्शन होने के लिए ivars चाहता हूं क्योंकि यह 'वर्तमान संदर्भ' से परे कई वर्गों का उपयोग करना मुश्किल बनाता है, दूसरे शब्दों में, यह संसाधन को कोड (आदर्श रूप से अक्सर) से जोड़ता है। चूंकि आप प्रारंभिकरण आदेश को परिभाषित नहीं कर सकते हैं या आईबी में प्रारंभिक या अतिरिक्त प्रारंभिक तर्क परिभाषित नहीं कर सकते हैं, इसलिए आपको वस्तुओं को एक-दूसरे के बारे में जानना चाहिए, परिपत्र निर्भरता और संदर्भ बनाना चाहिए।

Sbrocket: या क्यों आलसी आरंभीकरण (यह सोचते हैं कि तथ्य यह है कि आप क्या कर रहे हैं की चर्चा करते हुए में है) तो डरावना है जब इसकी अपेक्षाकृत आसान (या कई मामलों में स्वत: वास्तव में) यह सुनिश्चित करें कि वस्तु प्रारंभ और जुड़ा हुआ है।

पुन: डरावनी मैं आलसी प्रारंभिकता के बारे में बात नहीं कर रहा था। मैं स्थगित और संदिग्ध प्रारंभिक आदेश के बारे में बात कर रहा था।

निब प्रारंभिक अर्द्ध आदेश दिया गया है। वास्तविक आदेश/प्रक्रिया भिन्न हो सकती है, और इसका उपयोग पुन: प्रयोज्य आत्मनिर्भर कार्यक्रमों के भीतर विश्वसनीय रूप से नहीं किया जा सकता है ... फिर, आप बहुत अधिक कोड लिखना समाप्त कर देंगे जो नाजुक है, पुन: उपयोग करना असंभव है, भविष्यवाणी करने के लिए कभी भी आश्वस्त नहीं किया जा सकता है, और अवश्य ही हमेशा राज्य को मान्य करें (फिर भी परिपत्र निर्भरता के लिए एक और प्रविष्टि)। यदि यह एक बंद कार्यान्वयन नहीं है, तो जटिलताओं से परेशान क्यों हैं?

प्रोग्रामिंग के लिए यह दृष्टिकोण अराजक है और कार्यान्वयन (बदले में) किसी भी समय किसी भी चीज़ को संभालने के लिए तैयार होना चाहिए। खुद को दुर्घटनाओं से बचाने के लिए एक बात है, लेकिन इस संदर्भ में रक्षात्मक, उत्पादन स्तर कोड लिखने के लिए ... कोई रास्ता नहीं।

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

Sbrocket: मैं भी कुछ कठिन संख्या कि पता चलता है कि एनआईबी लोड हो रहा है धीमी है देखने के लिए दिलचस्पी होगी - ज़ाहिर है, यह पहली बार इस विचार से समझ बनाने के लिए प्रतीत होता है, लेकिन हम हमेशा प्रदर्शन के इस तरह के खराब भविष्यवक्ताओं रहे कुछ कठिन परीक्षण के बिना बाधाएं।

मैंने कभी नहीं कहा (स्पष्ट) है कि यह धीमी :) था

ठीक है, गंभीरता में, निब गैर अभिलेख एक आश्चर्यजनक रूप से धीमी प्रक्रिया (मेरे लिए), था, हालांकि धीमी और गैर अभिलेख समय की हमारे विचारों में नाटकीय रूप से भिन्न हो सकते हैं ।

उदाहरण: मेरे पास एक दस्तावेज़ आधारित ऐप था, और दस्तावेज़ लोडिंग की तुलना में निब लोडिंग कई गुना धीमी थी, जब दस्तावेज़ आकार कई बार निब आकार थे। कोड में कार्यान्वयन को स्थानांतरित करने से प्रक्रिया बहुत तेज हो गई। एक बार यह कोड पर था और मेरे पास प्रारंभिक आदेश का नियंत्रण था, मैंने एकाधिक मल्टीथ्रेडिंग जटिलताओं (चेकपॉइंट्स, ताले, रेस कंडीशन एंट्री इत्यादि) को हटा दिया, जिसने दस्तावेज़ को और भी तेज़ी से लोड किया।

अब आपके पास एक स्पष्ट उत्तर है, मैं आपको याद दिलाऊंगा कि आपके पास प्रदर्शन को मापने के लिए आवश्यक सभी टूल्स हैं।

याद रखें कि प्रदर्शन विश्लेषण और एन्हांसमेंट सीखा है।

+0

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

+0

यह आपके किसी भी अंक को अनिवार्य रूप से अस्वीकार नहीं करना है, यानी, मुझे आपके कुछ दिए गए बिंदुओं पर कुछ और विवरण देने में दिलचस्पी है। –

2

इंटरफ़ेस निर्माता जटिलता के एक निश्चित स्तर के लिए बहुत अच्छा है। चीजों के लिए कम या ज्यादा जटिल, मैं इसे कोड में करना चाहूंगा।

यदि आपके पास एक ऐसा इंटरफ़ेस है जिसका उपयोग एक से अधिक तरीकों से नहीं किया जाएगा, तो इसमें बहुत से तत्व नहीं हैं, और आईबी की तुलना में किसी भी मुश्किल लेआउट की आवश्यकता नहीं है।

लंबे समय तक, मैं लगभग कभी भी आईबी का उपयोग नहीं करता। परियोजनाओं की प्रकृति उतनी ही अधिक है जितनी मैं निजी वरीयता के रूप में काम करता हूं। निश्चित रूप से कुछ इंटरफेस हैं जो मैं सीधे आईबी के लिए जाता हूं, लेकिन मुझे थोड़ी देर में उनमें से एक बनाने की आवश्यकता नहीं है।

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