पेश है अतिरिक्त स्थानीय चर टिप्पणी प्रतिस्थापन के रूप में


12

क्या जो हो रहा है उसका वर्णन करने के लिए अतिरिक्त, तकनीकी रूप से शानदार, स्थानीय चर का उपयोग करना अच्छी शैली है?

उदाहरण के लिए:

bool easyUnderstandableIsTrue = (/* rather cryptic boolean expessions */);

if(easyUnderstandableIsTrue)
{
    // ...
}

जब तकनीकी ओवरहेड की बात आती है तो मैं उम्मीद करता हूं कि कंपाइलर इस अतिरिक्त लाइन को ऑप्टिमाइज़ करें। लेकिन क्या इसे एक अनावश्यक कोड ब्लोट माना जाता है? मेरी नजर में यह बासी टिप्पणियों के जोखिम को कम करता है।


10
"क्या हो रहा है, यह वर्णन करने के लिए अतिरिक्त, तकनीकी रूप से शानदार, स्थानीय चर का उपयोग करना अच्छी शैली है?"। हाँ। वास्तव में यहां बहुत कुछ नहीं कहा जा सकता है।
डेविड अरनो

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

मेरा मानना ​​है कि इसे मार्टिन फाउलर की रिफ्लेक्टरिंग की सूची में समेकित सशर्त अभिव्यक्ति कहा जाता है
ब्रैंडिन

जवाबों:


16

एक अतिरिक्त चर होने की लागत क्या है? अधिकांश भाषाओं में, संकलित और व्याख्यायित दोनों भाषाओं में कोई नहीं।

इसका क्या फायदा है?

  • इसी तरह से एक अलग विधि के लिए गुप्त बूलियन अभिव्यक्ति निकालने के लिए, आप डुप्लिकेट कोड के जोखिम को कम कर रहे हैं , लेकिन एक अलग विधि के मामले में थोड़ा कम है। यदि सशर्त अभिव्यक्ति को स्वयं विधि के अंदर पुन: उपयोग किया जाता है, तो आप चर का पुन: उपयोग करने में सक्षम होंगे; यदि अभिव्यक्ति एक अलग विधि में प्रकट होती है, तो आप नहीं करेंगे।

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

  • आप कोड के साथ सिंक से बाहर निकलने के प्रलेखन के जोखिम को कम कर रहे हैं । डेवलपर्स टिप्पणियों से अधिक आसानी से चर और विधियों के नाम अपडेट करते हैं। इस प्रकार, कोड को देखना असामान्य नहीं है जैसे:

    // Find if the user is an actual author in order to allow her to edit the message.
    if (currentUser.isAdministrator || (message.author == currentUser && !message.locked))

अभिव्यक्ति संभवतः के साथ शुरू हुई if (message.author == currentUser), और फिर लॉक किए गए संदेशों और प्रशासकों के मामले को संभालने के लिए विकसित हुई, जिन्हें लेखक होने की ज़रूरत नहीं है और बंद सामान के बारे में परवाह नहीं है; हालाँकि, टिप्पणी में उन परिवर्तनों में से कोई भी प्रतिबिंबित नहीं हुआ है।

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

ध्यान दें कि यदि आपकी बूलियन अभिव्यक्ति अत्यधिक जटिल हो जाती है: ool

  • इसे एक अलग विधि से निकालें , और:
  • इसे कई सरल बूलियन अभिव्यक्तियों में प्रतिबिंबित करें।

ऊपर दिया गया उदाहरण है:

class Message
{
    ...
    public boolean canBeEditedBy(User user)
    {
        ...
        if (user.isAdministrator) {
            return true;
        }

        return this.author == user && !this.locked;
    }
}

...
if (message.canBeEditedBy(currentUser)) // See? Much more readable now!
{
    ...
}

¹ स्रोत: ज्यादातर व्यावसायिक सॉफ्टवेयर विकसित करने वाले मेरे साथियों का मेरा अपना अवलोकन; YMMV। एक वास्तविक शोध अलग-अलग परिणाम दिखा सकता है। व्यक्तिगत रूप से, मुझे लगता है कि जब डेवलपर्स कोड पढ़ते हैं, तो वे कोड पर ध्यान केंद्रित कर रहे हैं , और टिप्पणियां दस्तावेज हैं, कोड नहीं; इसलिए, वे आमतौर पर टिप्पणियों को नहीं पढ़ते हैं, इसलिए उन्हें उनसे अपडेट करने की उम्मीद करना मुश्किल होगा।

Simple अत्यधिक जटिल सीमा को एक सरल सूत्र के साथ परिभाषित किया गया है: यदि आपके कोड की समीक्षा करने वाले आधे डेवलपर्स आपकी हत्या का इरादा व्यक्त करते हैं, तो दहलीज तक पहुंच जाती है। ऊपर बूलियन अभिव्यक्ति काफी सरल है, जिसे पुन: निर्माण करने की आवश्यकता होती है; हालाँकि, एक पंक्ति में चार भाग if ((a && b) || (c && d))इसे संभावित रूप से परिष्कृत कर सकते हैं। ध्यान दें कि यदि अभिव्यक्ति समतल है, तो भागों की संख्या ज्यादातर अप्रासंगिक है: if (a || b || c || d || ... || z)पर्याप्त पठनीय है।

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