एक "सुविधा ईर्ष्या" कोड क्या है और इसे एक कोड गंध क्यों माना जाता है?


53

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


जवाबों:


88

फीचर ईर्ष्या एक ऐसी स्थिति का वर्णन करने के लिए इस्तेमाल किया जाने वाला शब्द है जिसमें किसी वस्तु को किसी अन्य वस्तु के क्षेत्र में प्राप्त करने के लिए किसी प्रकार की गणना करने या निर्णय लेने के लिए किया जाता है, न कि वस्तु को स्वयं गणना करने के लिए कहने के बजाय।

एक तुच्छ उदाहरण के रूप में, एक आयत का प्रतिनिधित्व करने वाले वर्ग पर विचार करें। आयत के उपयोगकर्ता को इसके क्षेत्र को जानना पड़ सकता है। प्रोग्रामर एक्सपोज widthऔर heightफील्ड कर सकता है और फिर Rectangleक्लास के बाहर कंपीटिशन कर सकता है । वैकल्पिक रूप से, खेतों को निजी Rectangleरख सकते हैं widthऔर heightएक getAreaविधि प्रदान कर सकते हैं । यह यकीनन एक बेहतर दृष्टिकोण है।

पहली स्थिति के साथ समस्या, और इसका कारण इसे कोड गंध माना जाता है, क्योंकि यह एनकैप्सुलेशन को तोड़ता है।

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


7
+1, हालाँकि आपका उदाहरण यथार्थवादी नहीं है, क्योंकि एक उपयोगी आयत वर्ग आम तौर पर चौड़ाई और ऊँचाई क्षेत्रों को उजागर करेगा।
डॉक्टर ब्राउन

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

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

1
@OskarN .: परिभाषा से हम उन कार्यों के बारे में बात कर रहे हैं जिनकी आवश्यकता है। यदि अन्य वर्ग उन्हें बार-बार लागू कर रहे हैं तो उन्हें स्पष्ट रूप से जरूरत है।
आरोनॉट जीप 24'13

1
@ ऑस्कर: यह निर्भर करता है; कभी-कभी निर्णय स्पष्ट होता है, कभी-कभी यह स्वाद का मामला होता है, और अक्सर यह अनुभव का मामला होता है। आपके लेख में, स्कॉट मेयर्स " कभी-कभी कम अधिक होता है" लिखने के अच्छे कारण हैं , और यह समझने में उन्हें कई साल लग गए कि कब "सदस्य कार्य करने के लिए निर्णय लेने के लिए अपने एल्गोरिथ्म को लागू करें"।
डॉक ब्राउन

1

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

इस तरह की कक्षाएं अभी भी कुछ आंतरिक तर्क रख सकती हैं लेकिन अधिक बार उन्हें कंटेनरों के रूप में उपयोग किया जाता है:

class YourUid {
 public:
  YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
  bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
  bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
  int id_in_workplace;
  int id_in_living_place;
 private:
  int id_in_FBI_database_;
  const DB* FBI_database_;
};

@jhewlett ने अपने उत्तर में इस लेख को यह साबित करने के लिए संदर्भित किया है कि आपको बड़े पैमाने पर अन्य वर्ग के सदस्यों का उपयोग नहीं करना चाहिए, लेकिन मेरे उदाहरण के साथ वकालत करने वाली एक अन्य कोड की स्थिति है।

लंबी पैरामीटर सूची। किसी दिए गए विधि में आपके लिए आवश्यक मापदंडों की संख्या को सीमित करें, या पैरामीटर को संयोजित करने के लिए किसी ऑब्जेक्ट का उपयोग करें।


1
यह पूछे गए प्रश्न का उत्तर कैसे देता है?
gnat

@gnat Q इस बारे में है कि इसे "कोड गंध" क्यों माना जाता है। टिप्पणियों में पूछताछ की गई कुछ सामान्य धारणाओं के साथ jhewlett एक A देता है। मेरा उत्तर सामान्य अभ्यास से "कोड गंध" को भेद करने के लिए 2 सेंट है।
रीगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.