क्या कोडिंग की इस विधि का वर्णन करने के लिए एक एंटीपैटर्न है? [बन्द है]


26

मेरे पास एक कोडबेस है जहां प्रोग्रामर चीजों को उन क्षेत्रों में लपेटने के लिए जाता है जो समझ में नहीं आते हैं। उदाहरण के लिए, हमारे पास एक त्रुटि लॉग है जिसे आप लॉग इन कर सकते हैं

ErrorLog.Log(ex, "friendly message");

उन्होंने सटीक कार्य को पूरा करने के लिए विभिन्न अन्य साधनों को जोड़ा। ईजी

SomeClass.Log(ex, "friendly message");

जो बस घूमता है और पहली विधि कहता है। यह बिना किसी अतिरिक्त लाभ के जटिलता का स्तर जोड़ता है। क्या इसका वर्णन करने के लिए एक विरोधी पैटर्न है?


36
), "बुरा कोडिंग" यह कवर
Oded

12
निर्भर करता है। क्या यह लॉगिंग लाइब्रेरी के लिए एक आवरण है? अगर कभी मौका मिला तो इसे अदला-बदली किया जा सकता है, यह वास्तव में एक अच्छा अभ्यास है ...
ऋग्वेद

3
@lortabac: "baklava कोड" के साथ समस्या यह है कि यह वास्तव में अच्छा और स्वादिष्ट लगता है, और इसलिए वांछनीय है।
FrustratedWithFormsDesigner

10
जब आप उन्हें जोड़ते हैं तो यह प्रोग्रामर क्या कहता है? उनके तर्क को समझते हुए उन्हें शिक्षित करना आसान बनाना चाहिए।
कीथ

3
परोक्ष के स्तर की तरह लगता है , जो अच्छा हो सकता है जब आप दो वर्गों के बीच युग्मन से बचना चाहते हैं, जैसा कि @Rig ने बताया। शायद यह सिर्फ एक सांकेतिक शब्दों में बदलनेवाला दुख था patternitis - बस एक समस्या यह है कि वहाँ नहीं है, KISS का उल्लंघन हल करने के लिए कुछ पैटर्न कोशिश कर रहा।
फ्यूहरमैनटर

जवाबों:


54

उचित रूप से व्यापक होने पर कुछ खराब कोडिंग आदत को एंटीपैटर्न कहना ही सार्थक है।

बाकी हम सिर्फ "बकवास कोड" कहते हैं ...


अगर मुझे इस विशेष बुरी आदत के लिए एक नाम सुझाना था, तो यह "ऑब्सेसिव एब्स्ट्रक्शन डिसऑर्डर" :-) होगा


9
मैंने हमेशा "Indirection Hell" का उपयोग किया है।
दान नीली

27

नहीं, यह एक विरोधी पैटर्न नहीं है, लेकिन मैं निम्नलिखित मुद्दों को उठाऊंगा।

एकल जिम्मेदारी प्रधान का उल्लंघन

एसआरपी का कहना है कि एक वर्ग को बदलने का एक कारण होना चाहिए। लकड़हारा विधि जोड़ने का मतलब है कि वर्ग को भी बदलना होगा यदि लॉगिंग तर्क को बदलना चाहिए।

किसी is-aरिश्ते का उल्लंघन

बेस कक्षाएं टूलबॉक्स नहीं हैं जहां आप कई सुविधा विधियों को जोड़ सकते हैं।

प्रभावी ढंग से जोड़े को सभी विरासत वाले वर्गों को कार्यान्वयन के लिए विरासत में मिला है जो आधार वर्ग के पास है।

रचना के साथ तुलना करें।


1
"सिंगल रिस्पॉन्सिबिलिटी इश्यू"? SRP? शायद आपको सिंगल रिस्पांसिबिलिटी प्रिंसिपल लिखने का मतलब था? बस दोनों को यहां जोड़ रहा हूं। :)
zxcdw

8

ऐसा नहीं है कि यह स्वीकार्य है, लेकिन यह सिर्फ एक अधूरा refactoring हो सकता है। हो सकता है कि SomeClass.log () के पास अपना तर्क है जिसे पहले लागू किया गया था। और बाद में उन्हें एहसास हुआ कि उन्हें ErrorLog.Log () का उपयोग करना चाहिए। इसलिए 100 स्थानों को बदलने के बजाय जहां SomeClass.Log () कहा जाता है, वे सिर्फ ErrorLog.Log () में प्रत्यायोजित होते हैं। व्यक्तिगत रूप से मैं ErrorLog.Log () या कम से कम टिप्पणी SomeClass.log () कहने के लिए सभी संदर्भों को बदल दूंगा कि यह उस तरीके को क्यों दर्शाता है।

बस कुछ विचार करने के लिए।


7

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


3
मैंने एक ही बात का वर्णन करने के लिए "प्याज कोड" भी सुना है।
जस्टिन निस्नेर

4

मैं इसे एकल जिम्मेदारी सिद्धांत के लिए एक अपराध के रूप में वर्णित करना सुनिश्चित नहीं कर रहा हूं, क्योंकि अगर ErrorLog विधि हस्ताक्षर (विधि जिसे कुछक्लिक द्वारा कहा जाता है) में कोई बदलाव होता है, तो इस पद्धति को कॉल करने वाला प्रत्येक क्लाइंट कोड विफल हो जाएगा।

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


फिर भी बुरा अभ्यास क्योंकि: 1) यह 2 को बदलने की संभावना नहीं है) अगर यह बदलता है, तो वे केवल एक ही नाम के साथ एक आवरण वर्ग का निर्माण कर सकते हैं और आयात बदल सकते हैं।
केविन क्लाइन

2
+1। और यहां "अंकल बॉब" (रॉबर्ट मार्टिन) कोड के माध्यम से उन्हें तितर बितर करने के बजाय सीमित संख्या में मॉड्यूल में निर्भरता को केंद्रीकृत करने के पक्ष में बहस कर रहे हैं
MarkJ

3

या हम इसे एक "चाय के क्षण" के रूप में देख सकते हैं :)

आपका डेवलपर एक अच्छे विचार के लिए आधा हो सकता है। मान लीजिए आप चाहते हैं कि आपकी सभी व्यावसायिक वस्तुएँ बुद्धिमान लॉगिंग में सक्षम हों। आप परिभाषित कर सकते हैं:

   public interface IBusinessObjectLogger
   {
       void Log(Exception ex, string logMessage)
   }

अब अपनी वस्तुओं के लिए आंतरिक आप ErrorLog ऑब्जेक्ट का उपयोग वास्तव में लॉगिंग करने के लिए कर सकते हैं जबकि SomeClass कोड लॉग संदेश में ऑब्जेक्ट विशिष्ट मान जोड़ता है। इसके बाद आप अपने लॉगिंग API को फ़ाइल आधारित, db आधारित या संदेश आधारित लॉगिंग कार्यक्षमता को लागू करने के लिए आगे बढ़ा सकते हैं, जो आपको व्यावसायिक वस्तुओं को स्पर्श किए बिना।


3

मुझे यकीन नहीं है कि यह स्वचालित रूप से बुराई है।

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


2

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

यह शायद व्यापक कोडबेस के ज्ञान के बिना आवश्यकता के अनुसार किसी के कोडिंग का परिणाम है: "ठीक है, इस कोड को एक त्रुटि दर्ज करने की आवश्यकता है, लेकिन वह फ़ंक्शन कोड का प्राथमिक उद्देश्य नहीं है। इसलिए, मुझे एक विधि / वर्ग की आवश्यकता है जो ऐसा करेगा। मेरे लिए"। यह सोचने का एक अच्छा तरीका है; लेकिन, ErrorLog जाने बिना, उन्होंने SomeClass बनाया। फिर उन्होंने कुछ बाद के बिंदु पर ErrorLog पाया, और जिस पद्धति को वे डालते थे, उसके सभी उपयोगों को बदलने के बजाय, उन्होंने अपने तरीके को ErrorLog कहा। यही वह जगह है जहाँ यह एक समस्या बन जाती है।


2

दुर्घटना जटिलता वह जटिलता है जो कंप्यूटर प्रोग्राम या उनकी विकास प्रक्रिया में उत्पन्न होती है जो समस्या को हल करने के लिए गैर-जरूरी है। जबकि आवश्यक जटिलता अंतर्निहित और अपरिहार्य है, समस्या को हल करने के लिए चुने गए दृष्टिकोण के कारण आकस्मिक जटिलता होती है।

http://en.wikipedia.org/wiki/Accidental_complexity


1

यह फेकल पैटर्न का दुरुपयोग / गलतफहमी हो सकती है । मैंने इसी तरह की चीजों को एक कोडबेस में देखा है, जिसके साथ मैंने काम किया है। डेवलपर्स ने एक चरण के माध्यम से जाना जब वे ओओ डिजाइन के व्यापक सिद्धांतों को समझने के बिना डिजाइन पैटर्न के बारे में पागल थे।

मुखौटा पैटर्न का दुरुपयोग अनुप्रयोग की परतों में अमूर्तता के स्तरों के धुंधला होने के परिणामस्वरूप होता है।


1

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

इसके अंतर्गत आने वाले पैटर्न प्रॉक्सी , डेलिगेट , डेकोरेटर , कम्पोजिट या कुछ ऐसे होते हैं, जिन्हें कॉल को रैप करना, छिपाना या वितरित करना होता है। यह विकास की अधूरी स्थिति में ऐसी चीजों में से एक हो सकता है।


0

मैं सांस्कृतिक अंतर होने की कल्पना कर सकता था। शायद इस विशेष कोड आधार में डुप्लिकेट कार्यक्षमता होने का एक अच्छा कारण है। मैं इस तरह के होने के कारण लिखने में आसानी कर सकता था। मुझ में पायथन प्रोग्रामर अभी भी यह कहेगा कि यह बुरा है, क्योंकि " एक होना चाहिए - और अधिमानतः इसे करने के लिए केवल एक - स्पष्ट तरीका है " , लेकिन कुछ पर्ल लोग इस तथ्य के आदी हो सकते हैं कि " एक से अधिक हैं इसे करने का तरीका ”।


1
प्रारंभिक लेखन में आसानी नकल का एक अच्छा कारण नहीं है। बुरा कोड पहली बार के आसपास लिखना आसान हो सकता है, लेकिन यह लंबे समय में कोड लिखना आसान नहीं बनाता है। नया आदमी आने वाली डुप्लिकेट कार्यक्षमता के साथ क्या करता है? वह किस विधि से पुकारता है? वह उन्हें देखने और उन्हें पढ़ने में समय बर्बाद करता है, केवल खोजने के लिए वे एक ही काम करते हैं।
काज़ार्क

हो सकता है कि यह कोड मूल रूप से एक प्रोटोटाइप के रूप में था जो तब मिला (ab) एक वेतन वृद्धि के रूप में इस्तेमाल किया गया था। उस मामले में, प्रारंभिक लेखन के लिए अनुकूलन मान्य होता, मुझे लगता है।
Bengt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.