क्या उस फ़ंक्शन को कॉल करना बेहतर है, जिसका उस बिंदु पर प्रभाव नहीं है, यदि यह कोड स्पष्टता में सुधार करता है?


60

मेरे कार्यक्रम (iOS ऐप) में मेरे तीन विचार हैं। उनमें से केवल एक ही समय में कभी सक्रिय होता है इसलिए मैं उनमें से दो के लिए दृश्यता बंद कर देता हूं और दृश्यता को स्विच करता हूं क्योंकि उपयोगकर्ता बटन दबाता है। दृश्य दृश्य के रूप में आरंभीकृत होते हैं इसलिए मैंने मुख्य दृश्य शो से पहले दृश्यता को कोड में बंद कर दिया।

मैं कर सकता हूँ

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

विचारों में से दो के लिए, लेकिन अब तीसरा (ऐप की शुरुआत में दिखाई देने वाला एक) संबोधित नहीं किया जाता है। मैंने ए लगा दिया

[view3 setAlpha:1.0f];

पहले दो के बाद, क्योंकि मुझे लगता है कि यह स्पष्ट है कि वास्तव में तीन विचार हैं, दो नहीं जैसा कि कोड को देखते समय कोई सोच सकता है। अन्य प्रोग्रामर यह कैसे करते हैं? क्या यह विशुद्ध रूप से वरीयता है या कुछ सम्मेलन हैं?

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

जवाबों:


134

आपके पास एक आक्रमणकारी है:

केवल एक ही दृश्य (3 में से) कभी सक्रिय (और दृश्यमान) होता है।

फिर, मेरा सुझाव है कि आप एक गतिविधि और एक बार में सभी विचारों की दृश्यता स्विच करने के लिए एक फ़ंक्शन प्रदान करते हैं:

[setActiveView viewID:2]

यह कार्य करेगा:

  • जाँच करें कि क्या दृश्य पहले से ही सक्रिय है, अनावश्यक काम से बचें
  • सक्रिय और दृश्य के रूप में दृश्य सेट करें
  • अन्य 2 विचारों को निष्क्रिय और अदृश्य के रूप में सेट करें

कच्चे कॉल के बारे में इसके कई फायदे हैं setVisibility:

  • दोस्ताना: इसे अनावश्यक रूप से कॉल करना एक प्रदर्शन मुद्दा नहीं बनता है
  • रक्षात्मक: इसका एकल पैरामीटर बॉट करने के लिए बहुत कठिन है, जबकि इसके लिए setVisibilityयह याद रखना कठिन है कि मूल्यों की सीमा क्या है 0.0f - 1.0fऔर केवल एक को सेट करना है1.0f
  • लचीला: अगले आदमी गलती से विचारों में से एक को नहीं भूल सकता
  • अनुकूलनीय: किसी दृश्य को जोड़ने / हटाने के लिए सभी एप्लिकेशन कोड की छानबीन करने की आवश्यकता नहीं है, जहां स्विच, एक एकल फ़ंक्शन (यह एक) को अपडेट करने की आवश्यकता है

आदर्श रूप से, आक्रमणकारी को लागू करने में मदद करने के लिए, किसी अन्य फ़ंक्शन को इस सेटिंग के साथ गड़बड़ करने में सक्षम नहीं होना चाहिए ...


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

4
@ केविन: यह वास्तव में निर्भर करता है। कभी-कभी आप एक संग्रह पर पुनरावृत्ति करके समस्या को हल कर सकते हैं, कभी-कभी नहीं, लेकिन मुख्य सिद्धांत दोहराव से बचने और हमलावरों को संरक्षित करना आसान बनाने के लिए है। चीजों के ठीक से काम करने के लिए अधिक "मैनुअल" क्रियाओं को याद रखने की आवश्यकता है, आपके पास कम संभावना है कि चीजें ठीक से काम करेंगी। मुझे यहां अस्पष्ट होने से नफरत है, लेकिन कई अलग-अलग परिस्थितियां हैं जो मुझे डरता है कि एक "सामान्य" नियम सिर्फ आपको भटकाएगा।
मैथ्यू एम।

23
"हमलावरों को संरक्षित करना आसान है" एक सामान्य नियम है जो याद रखने योग्य है।
Gusdor

1
@ स्वर: मुझे नहीं पता कि एक वैश्विक चर के उपयोग को प्रोत्साहित करना "इसे सही करना" है, लेकिन वास्तव में यदि आप जानते हैं कि वास्तव में जो पहले सक्रिय था, तो आपको केवल दो विचारों को अपडेट करने की आवश्यकता है। एक अन्य समाधान प्रत्येक दृश्य के लिए अपनी दृश्यता को याद रखना है और setVisibilityकुछ भी नहीं करने के लिए यदि दृश्यता पहले से ही अनुरोध की गई है, जो जिम्मेदारी को नीचे ले जाती है।
मैथ्यू एम।

1
@MatthieuM। मैंने जल्दबाजी में लिखा था, लेकिन वास्तव में मेरा भी यही मतलब था। यदि आप पिछली स्थिति को जानते हैं तो आपको केवल अधिकतम 2 दृश्य अपडेट करने की आवश्यकता है। कैसे याद रखें कि राज्य एक और मामला है; ;-) जिम्मेदारी को नीचे ले जाने के लिए: यदि दृश्य-वर्ग इसके लिए प्रावधान नहीं करता है, तो आपको उस संपत्ति को जोड़ने के लिए कक्षा को किसी अन्य ऑब्जेक्ट में लपेटने की आवश्यकता होगी। यह एक साफ समाधान है, लेकिन शायद थोड़ा ओवरकिल है।
Tonny

12

वैकल्पिक विचार: यदि आपका लक्ष्य होने वाले कीड़ों को रोकना है, क्योंकि लोग तीन विचारों को भूल जाते हैं और उनमें से केवल दो के साथ कुछ ऐसा करते हैं जो उन्हें वास्तव में उन सभी के साथ करना चाहिए, तो एक ऐसा कार्य करें जिसे भूलना असंभव है:

setViewVisibilities(0.0f, 0.0f, 1.0f)

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

इस मामले में जहां के लिए view3यह दृश्यता बदल गया है की जरूरत नहीं है, आप कुछ व्यवहार जहां एक विशेष मूल्य गुजर तरह जोड़ सकते हैं -1.0या nilया उन पंक्तियों के साथ कुछ का अर्थ है "सब पर दृश्य दृश्यता नहीं बदलते हैं"। यह अनावश्यक रूप से विज़न सेट करने की समस्या के आसपास हो जाता है।


9
यदि ओपी 10+ विचारों तक पहुंच जाता है, तो पैरामीटर-प्रति-दृश्य बनाए रखना असंभव हो जाता है। संकलन-समय की त्रुटियों के बारे में आपकी बात सही है, लेकिन दुर्भाग्य से यह बहुत ही अचूक समाधान है।
क्रिस क्रेफ़िस

3
@ChrisCirefice: यदि विचारों की संख्या बढ़ती है, तो आप किसी प्रकार का "ViewState" ऑब्जेक्ट / क्लास बना सकते हैं, जो इस अपरिवर्तनीय को लागू करता है। फिर स्विचिंग आदि के लिए उपयोग करें कि इतने सारे विचारों के साथ, किसी प्रकार की प्रबंधक वस्तु शायद वैसे भी समझ में आती है।
साल्स्के

8

मेरा मानना ​​है कि टिप्पणी को यह कहते हुए जोड़ना कि कॉल अनावश्यक है (और क्यों) सबसे अच्छा है।

(शायद, तथ्य यह है कि एक कॉल अनावश्यक है, या आपको इसके बारे में टिप्पणी की आवश्यकता है, एक कोड गंध हो सकता है)


1
@Niall यदि संभव हो, तो एक टिप्पणी की तुलना में एक जोर भी बेहतर होगा।
200_सेक् स

9
टिप्पणियां
अचूक

2
@ केविन या आप ऐसे कोड लिख सकते हैं जो टिप्पणियों के बिना पूरी तरह से पठनीय हो।
Jan

1
@Jan टिप्पणियाँ केवल यह बताने से अधिक हैं कि कोड क्या करता है .......
केविन

2
@ केविन मैं कहूंगा कि कोड क्या है, यह समझाने के लिए टिप्पणियों का अस्तित्व कभी नहीं होना चाहिए , बल्कि यह समझाने के लिए कि यह क्यों कर रहा है। और ऐसी स्थितियों में अक्सर एक रिफ्लेक्टर को टिप्पणी की आवश्यकता के बिना आशय मिल जाएगा (जो कि जन की बात की तरह लगता है)।
RJFalconer

4

इस विशेष मामले में, @Mattieu एम के पास सही समाधान है।

अधिक सामान्य मामले में, जहां समान रूप से परिवर्तन नहीं होता है, आपको खुद से पूछना होगा: क्या कोई मौका है कि भावी प्रोग्रामर इसे गड़बड़ कर सकता है?

उत्तर आमतौर पर हाँ है। जिसका मतलब है, हां, आपको कॉल जोड़ना चाहिए। हो सकता है कि फ्रेमवर्क के कुछ भविष्य के संस्करण ऑन के बजाय सभी विचारों को बंद कर दें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.