जटिलता को कब हटाया जाना चाहिए?


14

जरूरत से ज्यादा अच्छा अभ्यास नहीं होने से पहले डिजाइन पैटर्न को लागू करके समय से पहले जटिलता का परिचय देना।

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

हालाँकि एक बार जब यह जटिलता शुरू हो जाती है और जब आप इसे हटाते हैं तो यह एक विजेता की तरह काम करता है?

उदाहरण। मेरे पास क्लाइंट के लिए एक एप्लीकेशन है। जब मूल रूप से वहां बनाया जाता है जहां कर्मचारियों को देने के कई तरीके हैं। मैंने पूरी प्रक्रिया को अच्छा और साफ रखने के लिए रणनीति पैटर्न और कारखाने का उपयोग किया। समय के साथ कुछ निश्चित तरीकों को बढ़ाएं जहां एप्लिकेशन स्वामी द्वारा जोड़ा या हटाया गया।

समय बीतता है और नया मालिक संभल जाता है। यह नया मालिक कठिन नाक वाला है, सब कुछ सरल रखता है और केवल एक ही रास्ता देता है कि वह एक भार दे।

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

तो क्या अब मैं रणनीति कार्यान्वयन को हटा दूं? मुझे नहीं लगता कि यह नया मालिक कभी भी बदलेगा कि कैसे उठाया जाता है। लेकिन एप्लिकेशन ने स्वयं प्रदर्शित किया है कि ऐसा हो सकता है।

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

मैं स्वीकार करता हूं कि इस संदेह का एक छोटा हिस्सा यह है क्योंकि यह बहुत अधिक संभावना है कि नया मालिक अब मेरा उपयोग नहीं करने जा रहा है। मुझे वास्तव में परवाह नहीं है कि कोई और इसे ले जाएगा क्योंकि यह एक बड़ा आय जनरेटर नहीं है।

लेकिन मैं 2 (संबंधित) चीजों की परवाह करता हूं

  1. मैं थोड़ा ध्यान रखता हूं कि नए अनुचर को कोड को समझने की कोशिश करते समय थोड़ा कठिन सोचना होगा। जटिलता जटिलता है और मैं मेरे बाद आने वाले मनोवैज्ञानिक पागल को गुस्सा नहीं करना चाहता।

  2. लेकिन इससे भी अधिक मैं इस जटिलता को देखकर एक प्रतियोगी के बारे में चिंता करता हूं और सोचता हूं कि मैं नौकरियों पर अपने घंटे लगाने के लिए डिजाइन पैटर्न लागू करता हूं। फिर इस अफवाह को फैलाकर मेरे अन्य व्यवसाय को चोट पहुंचाई। (मैंने इस उल्लेख को सुना है।)

इसलिए...

सामान्य तौर पर पहले से ही जटिलता को हटा दिया जाना चाहिए भले ही यह काम करता हो और जटिलता के लिए ऐतिहासिक रूप से प्रदर्शन की आवश्यकता हो, लेकिन आपको कोई संकेत नहीं है कि भविष्य में इसकी आवश्यकता होगी?

यहां तक ​​कि अगर ऊपर दिए गए प्रश्न का आम तौर पर "नहीं" उत्तर दिया जाता है, तो क्या परियोजना को किसी प्रतियोगी (या अजनबी) को सौंपना इस "गैर-जरूरी" जटिलता को दूर करना बुद्धिमानी है?

जवाबों:


7

कुछ मायनों में, मुझे लगता है कि यह काफी हद तक एक व्यावसायिक निर्णय है और जरूरी नहीं कि कोड के आधार पर ही हो। विचार करने योग्य कुछ बातें:

  • क्या आपको परिवर्तन करने के लिए भुगतान किया जा रहा है?
  • क्या वर्तमान में कोड उम्मीद के मुताबिक काम करता है?
  • क्या कोड के साथ कोई सुरक्षा या प्रदर्शन समस्याएँ हैं?
  • क्या तकनीकी ऋण की राशि इसे तय करने की लागत से अधिक है?
  • यदि आप कोड को छोड़ते हैं तो वास्तविक रूप से क्या होने की संभावना है?
  • भविष्य की ऐसी कौन सी समस्याएं हैं जो बिना रिफलेक्टर के साथ या बिना फसल कर सकती हैं?
  • आपके और आपके व्यवसाय के लिए कितना दायित्व है?

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

संक्षेप में, लागत-लाभ विश्लेषण और दोनों रास्तों का जोखिम मूल्यांकन करें और कार्रवाई का सबसे सुरक्षित, सबसे कुशल और सबसे अधिक लाभदायक पाठ्यक्रम लें।


6

क्या इस कोड को नहीं हटाया जा रहा है और ग्राहक को विचार करने और भुगतान करने की आवश्यकता वाली सुविधा को कोड करने की भविष्य की आसानी के लिए इसे कुछ सरल से बदल दिया जा रहा है?

आपके पास कुछ उपयोगी हो सकता है जो दूसरे डेवलपर से सीख सकते हैं, लेकिन इसे प्लग इन करने के लिए किसी अन्य क्लाइंट के ऐप को खोजने की संभावना नहीं है।

प्रतियोगी कोड के बारे में गपशप करना कुछ ऐसा नहीं है जिसे आप रोक सकते हैं। वे ग्राहकों को नकारात्मक रूप से भर्ती करने की कोशिश में मूर्ख दिखेंगे।


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

3

एक आम कहावत है: "यदि यह टूट नहीं गया है, तो इसे ठीक न करें"।

इस नियम के पीछे कई तर्क हैं। उनमें से कुछ हो सकता है कि "सरलीकरण" नए, अलग और संभवतः बड़े कीड़े को शुरू करने का जोखिम उठाएगा, अन्य अधिक मूल्यवान प्रयासों से विकास के समय की एक विस्तृत राशि ले सकता है, और कुछ अप्रत्याशित भविष्य के व्यापार के अवसर के लिए पूरी तरह से गलत परिवर्तन हो सकता है। उठता है।

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


2

सबसे पहले, यदि ऐप को पहले से ही एक नए मालिक द्वारा लिया गया था, तो यह फिर से हो सकता है। और अगला मालिक फिर से उस जटिलता का उपयोग करना शुरू कर सकता है जिसे फिलहाल लाभ नहीं मिला है।

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

(संभावित) ग्राहक जो (नहीं) आपको पूरी तरह से प्रतियोगियों की अफवाहों पर आधारित हैं, IMHO वैसे भी होने के लायक नहीं हैं, जब तक कि आपको आय की सख्त जरूरत नहीं है। आपके पास अच्छे और तार्किक कारण हैं कि आपने ऐप को जिस तरह से लागू किया है, और किसी भी गंभीर ग्राहक को समझने की संभावना है। कोई है जो - या आपके बारे में पूछने के लिए भी परेशान नहीं करता है - वैसे भी आपके लिए नौकरी के लायक होने की तुलना में अधिक परेशानी का कारण होगा।


1

सामान्य तौर पर पहले से ही जटिलता को हटा दिया जाना चाहिए भले ही यह काम करता हो और जटिलता के लिए ऐतिहासिक रूप से प्रदर्शन की आवश्यकता हो, लेकिन आपको कोई संकेत नहीं है कि भविष्य में इसकी आवश्यकता होगी?

नहीं।

यहां तक ​​कि अगर ऊपर दिए गए प्रश्न का उत्तर आमतौर पर "नहीं" दिया जाता है, तो परियोजना को किसी प्रतियोगी (या अजनबी) को सौंपने के लिए इस "गैर-जरूरी" जटिलता को दूर करना बुद्धिमानी है

नहीं, इस तरह कम प्राथमिकता वाले कामों को ठीक करने में आपका समय क्यों बर्बाद होता है? वहां रहने वाले कोड के लिए कोई नुकसान नहीं।

अपने प्रश्न के रूप में: जटिलता को कब हटाया जाना चाहिए?

मेरा लेना है, अगर यह नहीं तोड़ा है, इसे ठीक नहीं है


0

जटिलता को दूर करने में सक्षम होने के लिए निम्नलिखित सही होना चाहिए:

  1. हटाए गए टुकड़े को कार्यक्रम से स्वतंत्र होना चाहिए। यदि प्रश्न में आसपास के कार्यक्रम से लेकर कोड तक कोई निर्भरता है, तो केवल जटिलता को हटाने से काम नहीं चलेगा
  2. दुर्भाग्य से, अगर यह जटिलता की तरह दिखता है, तो यह बहुत संभावना है कि टुकड़े स्वतंत्र नहीं हैं और निर्भरता आपके कार्यक्रम को तोड़ने वाली है जब आप टुकड़ा निकालते हैं
  3. सभी आश्रितों को हटाने में समय लगने वाला है, इसलिए उस समय पर विचार करने की आवश्यकता है जब आप अनुमान लगाते हैं कि ऑपरेशन प्रयास के लायक है या नहीं
  4. अधिकांश समय यह प्रयास के लायक नहीं है, लेकिन आप बस किसी भी नए कोड को पुराने का उपयोग नहीं करने का निर्णय लेंगे

वे स्वतंत्र हैं और मैंने वास्तव में उन्हें हटा दिया है और सभी इकाई / एकीकरण / प्रतिगमन परीक्षण पास किए हैं। जटिलता केवल रणनीति के कार्यान्वयन के लिए कम से कम एक इंटरफ़ेस और उस इंटरफ़ेस के ठोस कार्यान्वयन की आवश्यकता होती है। दो दर्जन या इतने स्थानों पर जहां नए मालिक ने सभी को सरल बनाया है, एक ही वर्ग के साथ किया जा सकता है।
ElGringoGrande 1

0

मुझे लगता है कि यहाँ काम में कुछ बड़ा है ... स्केलेबिलिटी

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

तो, मैं कहता हूं कि कोड रखो और इसे दस्तावेज। यह अनुप्रयोग का उपयोग कैसे किया जा सकता है, इसकी एक विशेषता है।


0

सामान्य तौर पर पहले से ही जटिलता को हटा दिया जाना चाहिए भले ही यह काम करता हो और जटिलता के लिए ऐतिहासिक रूप से प्रदर्शन की आवश्यकता हो, लेकिन आपको कोई संकेत नहीं है कि भविष्य में इसकी आवश्यकता होगी?

जटिलता को दूर करने का एक प्रयास और जोखिम है। यदि वह अतिरिक्त प्रयास और अत्यधिक जटिल कोड को बनाए रखने के जोखिम से अधिक है, तो आप इसे बनाए रखें। अन्यथा, आप इसे हटा दें। हालांकि, उन जोखिमों का अनुमान लगाना कठिन है।

मैं जोड़ूंगा कि आप कोड में डिज़ाइन पैटर्न रणनीति का उपयोग करके दस्तावेज़ में अधिक कठिन रखरखाव के जोखिम को कम क्यों कर सकते हैं। मेरा व्यक्तिगत रूप से मानना ​​है कि किसी भी डिजाइन पैटर्न को एक स्पष्ट आवश्यकता (कार्यात्मक या गैर-कार्यात्मक) के लिए पहचाना जाना चाहिए।

यहां तक ​​कि अगर ऊपर दिए गए प्रश्न का आम तौर पर "नहीं" उत्तर दिया जाता है, तो क्या परियोजना को किसी प्रतियोगी (या अजनबी) को सौंपना इस "गैर-जरूरी" जटिलता को दूर करना बुद्धिमानी है?

पैडिंग घंटों के लिए प्रतियोगिता से अलग होने का आपका परिदृश्य ठीक यही कारण है कि आपको जटिलता का दस्तावेजीकरण करना चाहिए। यदि आप किसी भी पैटर्न का उपयोग करने के लिए दस्तावेज़ (और एक विशिष्ट ग्राहक आवश्यकता के साथ) का औचित्य साबित करते हैं, तो आप कवर किए जाते हैं। यदि आप किसी ग्राहक की आवश्यकता के साथ एक पैटर्न को सही नहीं ठहरा सकते हैं, तो यह ओवरडिजाइन या पैटर्नाइटिस जैसा दिखता है।

यदि आवश्यकताएं बदल जाती हैं, तो आप इसे जोखिम के कारण छोड़ने का औचित्य साबित कर सकते हैं कि आप कोड को तोड़ सकते हैं (या सर्जिकल रूप से पैटर्न को हटाने के लिए काम की मात्रा)।


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

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

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

ग्राहक देखभाल नहीं करता है या यहां तक ​​कि विवरण भी नहीं समझता है। नई स्वामिनी को अपने प्रक्रियाओं में KISS लागू करने के मामले में, यह उसे कम करने है आवश्यक जटिलता है, जो सॉफ्टवेयर समाधान पर प्रभाव पड़ता है, भी होना चाहिए।

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