2011-09-07 12 views
5

मुझे इस कोड का सामना करना पड़ा जिसमें एक विधि कॉल, उदाहरण के लिए ClassA.search (ए, बी, ध्वज) 3 नियंत्रकों द्वारा उपयोग किया जा रहा है। यह विधि का एक सरलीकृत संस्करण है:क्या यह विधि का पुन: उपयोग/साझा करने का एक अच्छा तरीका है?

public List<Result> search(Object a, Object b, boolean flag) { 
    //do some code logic here, common to the 3 controllers 
    //at the middle there is: 
    if (flag) { 
     //code that affects 2 Controllers 
    } else { 
     //code affects only 1 
    } 
    //some more common code 
    //some more code with the flag if else 
} 

क्या यह एक अच्छा विचार है क्योंकि कोड का पुन: उपयोग किया जाता है? या फिर भी कोड पुन: उपयोग करने में सक्षम होने का एक बेहतर तरीका है लेकिन विधि कॉलर (क्लाइंट) कोड अनुकूलन के लिए इस ध्वज को नहीं पेश करें (जैसे इसे 3 अलग-अलग तरीकों से विभाजित कर सकते हैं लेकिन फिर भी एक सामान्य कोड रिफैक्टर विधि घोषित करने में सक्षम हो सकते हैं)?

उत्तर

6

पहले, निकालने कार्यों के साथ लाइनों टिप्पणी की:

public void search(Object a, Object b, boolean flag) 
{ 
    commonToThree(); 
    if (flag) 
    { 
     affectTwoControllers(); 
    } 
    else 
    { 
     affectsOnlyOne(); 
    } 
    alsoCommon(); 
} 

अब flag बूलियन तर्क है, जो एक कोड गंध है से छुटकारा पाने:

public void searchWithTrueFlag(Object a, Object b) { 
    commonToThree(); 
    affectTwoControllers(); 
    alsoCommon(); 
} 

public void searchWithFalseFlag(Object a, Object b) { 
    commonToThree(); 
    affectsOnlyOne(); 
    alsoCommon(); 
} 
+0

मैं इस के साथ सहमत होगा बशर्ते आप इसे काम करने के लिए स्थानीय चर को फ़ील्ड में बदलना न करें। –

+0

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

+0

यह सच है हालांकि फ़ील्ड (और एक कन्स्ट्रक्टर?) के साथ एक वर्ग जोड़ना एक झंडा से बचने के लिए बहुत काम है। ;) –

3

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

यह हमेशा संभव नहीं है, लेकिन आम तौर पर ऐसा करने के लिए बेहतर कोड पैदावार:

functionOne: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

functionTwo: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

हमेशा की तरह, यह सामान्यीकृत दावों करना मुश्किल है: यह स्पष्ट रूप से हमेशा संभव/व्यावहारिक नहीं है।

+1

+1: कोड के तीन खंड किसी स्थानीय चर को साझा नहीं करते हैं तो यह अच्छा है।(या केवल एक छोटी संख्या साझा करें) –

+1

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

+1

@ अर्नआउट एंजेलन, मैं इस बात से सहमत हूं कि यह काम करने के लिए खेतों को जोड़ना एक अच्छा विचार नहीं है। –

0

यह करने का यह अपेक्षाकृत सरल तरीका है। विकल्प हैं लेकिन वे अधिक जटिल होने की संभावना है। (जैसे कि विज़िटर को पास करना या नियंत्रक की विधि को कॉल करना, यह कहने के लिए कि उस नियंत्रक के लिए क्या करना है)

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

0

मैं जवाब देने के लिए कोशिश कर रहा है एक अलग दृष्टिकोण काफ़ी होगा यह प्रश्न सामान्य तरीके से:

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

हमेशा किसी को अपने कोड को पढ़ने के लिए कल्पना करें (या स्वयं को इसे कुछ हफ्तों से करना है) और जितनी जल्दी संभव हो सके समझने के लिए। इसलिए, यह विशेष मामले पर निर्भर करता है, अगर कुछ लाइनों की प्रतिलिपि बनाना या उन्हें एक सामान्य विधि में निकालना बेहतर है।

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

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

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