2009-02-16 19 views
10

यागनी "सिद्धांत" कहता है कि आपको "आवश्यकता नहीं है" के रूप में आपको आवश्यकतानुसार कार्यक्षमता प्रदान करने पर ध्यान केंद्रित नहीं करना चाहिए।यागनी का उल्लंघन कब करें?

मैं आम तौर पर किसी भी नियम के ऊपर सामान्य ज्ञान का उपयोग करता हूं, इससे कोई फर्क नहीं पड़ता कि कुछ समय बाद मुझे लगता है कि अगर आपके पास अच्छे कारण हैं, तो यह डिज़ाइन या भविष्य के सबूत पर कुछ उपयोगी है, भले ही यह संभव हो इसका इस्तेमाल करें।

वास्तविक मामले मैं अपने हाथ में है अभी और अधिक या कम इस तरह है:

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

यह भी तथ्य है कि आवेदन संभवतः (लेकिन निश्चित रूप से) भविष्य में अन्य ग्राहकों द्वारा उपयोग नहीं किया जाएगा, जो स्वामित्व समाधान तक पहुंच नहीं पाएंगे और इसलिए, एक और समाधान की आवश्यकता होगी। मुझे पता है कि आवेदन के लिए किसी अन्य ग्राहक की संभावना अधिक है।

तो, आपकी सोच क्या है? क्या मुझे सिर्फ मालिकाना प्रोटोकॉल के लिए डिज़ाइन करना चाहिए और जब मुझे वास्तव में इसकी ज़रूरत है तो मुझे रिफैक्टरिंग, इंटरफ़ेस निष्कर्षण छोड़ना चाहिए और क्या मुझे डिज़ाइन अब भविष्य के लिए सोच रहा है?

नोट: बस स्पष्ट होना, मैं (YAGNI उल्लंघन करने के लिए जब) सामान्य प्रश्न के विचारों के सभी प्रकार के सुनने में रुचि है, लेकिन मैं वास्तव में चाहते कुछ सलाह या मेरे वर्तमान दुविधा :)

पर विचार की तरह
+1

यह आज http://programmers.stackexchange.com पर अधिक उचित रूप से पूछा गया है ... –

+0

कल्पना करें कि COBOL डेटिंग सिस्टम जो वर्ष के लिए केवल 2 अंक उपयोग करते हैं। यह YAGNI का उल्लंघन करने के लिए एक अच्छा क्षेत्र होगा :) –

उत्तर

7

IMHO

  • मैं YAGNI पहले जाओ कहेंगे। का उपयोग करके एनओआरएम विनिर्देश के बिना इसे 'काम करने वाली सबसे सरल चीज़ के बिना काम करें।
  • अगला तुलना करें कि भविष्य में 'डिज़ाइन परिवर्तन' करने की लागत परिवर्तन को बदलने से काफी अधिक है। क्या आपका वर्तमान समाधान रिवर्सिबल है? यदि आप कल या कुछ महीनों के बाद आसानी से बदलाव कर सकते हैं तो इसे अभी न करें। यदि आपको अब अपरिवर्तनीय डिज़ाइन निर्णय लेने की आवश्यकता नहीं है ..पिछले जिम्मेदार पल तक देरी

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

यह भी देखें: टी & एम। पॉपपेन्डिएक की दुबला किताबें ऊपर बुलेट # 2 की दुविधा को समझाने में बेहतर हैं।

3

मुझे लगता है कि जब आप कुछ सीखना चाहते हैं तो YAGNI अनुचित हो सकता है :) YAGNI पेशेवरों के लिए अच्छा है, लेकिन छात्रों के लिए नहीं। जब आप सीखना चाहते हैं तो आपको हमेशा इसकी आवश्यकता होगी।

2

मुझे चिंता नहीं होगी। तथ्य यह है कि आप "यागनी" के बारे में जानते हैं, इसका मतलब है कि आप पहले ही व्यावहारिक रूप से सोच रहे हैं।

मैं कहूंगा कि, यहां पोस्ट की गई किसी भी चीज़ के बावजूद, आप किसी ऐसे तरीके से बेहतर कोड के साथ आने की संभावना रखते हैं जो उसी तरह से अपने अभ्यास का विश्लेषण नहीं कर रहा है।

+0

मुझे यकीन है कि जोएल स्पॉस्की ने भी इसी तरह की भावना व्यक्त की है लेकिन मुझे पोस्ट नहीं मिल रहा है। जेफ एटवुड द्वारा यह एक है हालांकि: http://www.codinghorror.com/blog/archives/001020.html –

+0

आपको सोचना होगा http://www.joelonsoftware.com/articles/fog0000000018.html – kmkaplan

+0

नहीं यह नहीं था वह नहीं है। मुझे लगता है कि इसका अर्थ यह था कि, यदि आप इसे पढ़ रहे हैं और सोच रहे हैं कि क्या आप डेवलपर के रूप में अच्छा हैं, तो आप पहले ही जीत चुके हैं। यदि आप पढ़कर और सीखकर खुद को सुधारने का प्रयास कर रहे हैं, तो आप पहले से ही शीर्ष प्रतिशत में हैं। –

5

अपने कार्यक्रम को अच्छी तरह से संरचित करना (अमूर्तता, आदि) ऐसा कुछ नहीं है जो यागनी लागू होता है। आप हमेशा अपने कोड को अच्छी तरह से ढांचा बनाना चाहते हैं।

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

+1

हां - यागनी स्कोप नियंत्रण और डिजाइन के बारे में है। यह क्रैपी कोड लिखने का लाइसेंस नहीं है। –

3

मुझे लगता है कि यह बहुत सरल और स्पष्ट है:

YAGNI का उल्लंघन है जब आप जानते हैं कि, पूर्ण निश्चितता में , आप यह

8

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

प्रोटोकॉल के मामले में, बाद में परिवर्तन जोड़ने आमतौर पर सस्ता नहीं है। पुराने संस्करण तोड़ते हैं, इससे संचार विफलताओं और एन^2 परीक्षण मैट्रिक्स का कारण बन सकता है क्योंकि आपको हर दूसरे संस्करण के खिलाफ हर संस्करण का परीक्षण करना पड़ता है। इसे एकल कोडबेस से तुलना करें जहां नए संस्करणों को केवल अपने साथ काम करना होगा।

तो आपके मामले में, प्रोटोकॉल डिज़ाइन के लिए, मैं यागनी की अनुशंसा नहीं करता।

+0

मुझे आपकी चेतावनियों को समझ में नहीं आ रहा है। एक नए प्रोटोकॉल को जोड़ने से मौजूदा कार्यक्षमता को तोड़ना नहीं चाहिए, यही रिग्रेशन परीक्षण है। और आपको केवल "हर दूसरे संस्करण के खिलाफ हर संस्करण" का परीक्षण करना होगा यदि आप अलग-अलग प्रोटोकॉल का उपयोग करने के लिए ग्राहकों को इंटरऑपरेट करना चाहते हैं, आवश्यक प्रतीत नहीं होता है। तो: YAGNI। – sleske

0

मैं गिशू और निक से सहमत हूं।

एक प्रोटोकॉल बाद में अक्सर की तरह विचार करने के लिए सुराग का हिस्सा डिजाइनिंग

"लानत है, मैं इस तरह किया जाना चाहिए, अब मैं इस बदसूरत तरीके का उपयोग करने के लिए है" लेकिन यह भी जो इस प्रोटोकॉल के साथ इंटरफेस जाएगा पर निर्भर करता है ।
यदि आपका नियंत्रण दोनों समाप्त होता है, और वे एक ही समय में पर संस्करण बदल देंगे, तो आप हमेशा सामान्य कोड इंटरफ़ेस के साथ प्रोटोकॉल को फिर से सक्रिय कर सकते हैं।

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

0

कुछ ऐसे मामले हैं जहां यागनी अंतर्ज्ञान के खिलाफ जाने का अर्थ होता है।

यहाँ कुछ कर रहे हैं:

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

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

दावा, डीबग चेक, विफलताएं , आदि इस तरह के कोड को वास्तव में आपके आवेदन के लिए सही तरीके से काम करने की आवश्यकता नहीं है, लेकिन इससे यह सुनिश्चित करने में मदद मिलेगी कि आपका कोड ठीक से काम करता है और भविष्य में जब संशोधन किए जाते हैं।

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