समान विशेषताओं के लिए विभिन्न पैटर्न का उपयोग करना


10

मैं किसी प्रोजेक्ट पर एकमात्र डेवलपर हूं, जो किसी भी सॉफ्टवेयर प्रोजेक्ट के लिए, भविष्य में किसी और के द्वारा लिया जा सकता है।

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

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

लेकिन अलग-अलग पैटर्न का उपयोग करने का कोई वास्तविक कारण नहीं है, इस तथ्य को छोड़कर कि जब सुविधा ए का निर्माण किया गया था तो वह ए के समान पैटर्न का उपयोग करने के लिए पर्याप्त कुशल नहीं था।

ध्यान दें कि यह प्रश्न किसी समस्या के लिए सही पैटर्न चुनने के बारे में नहीं है ; यह समान समस्याओं को हल करने के लिए कोड बेस में दो पैटर्न सह-मौजूदा है, जिसे रिफ्लेक्टर के लिए पर्याप्त समय दिया जा सकता है।

  • क्या वह कोड गंध है?
  • स्रोत कोड को इस तरह रखने के नुकसान क्या हैं?
  • क्या मुझे केवल एक पैटर्न का उपयोग करना चाहिए? यानी Y का उपयोग करने के लिए रिफ्लेक्टर A या B लिखते समय X का उपयोग करते रहें?
  • कैसे, स्रोत में, मैं यह बता सकता हूं कि समान विशेषताओं के लिए दो अलग-अलग पैटर्न क्यों हैं, इसका कारण अनिवार्य रूप से कोई कारण नहीं है?
  • क्या मुझे इस बात की बहुत चिंता है कि अगला डेवलपर मेरे कोड के बारे में क्या सोचता है?

जवाबों:


7

यदि पैटर्न X और Y एक ही समस्या को हल करते हैं और न ही उद्देश्यपूर्ण रूप से बेहतर है, तो आपको एक पर फैसला करना चाहिए और उससे चिपकना चाहिए। यदि यह संभव है तो आपको उसी समस्या को हल करने के लिए लगातार उसी तरह से प्रयास करना चाहिए।

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

एक कोडबेस में एक ही समस्या के अलग-अलग समाधान करने के लिए नीचे दिए गए:

  • कोड को समझने में दोगुना समय लगेगा
  • जब आप पैटर्न को शामिल करते हैं, तो कुछ बदलाव होने पर कोड को संशोधित करने में दोगुना समय लगेगा
  • आपके पास कई कीड़े होंगे
  • वर्तमान और भविष्य के सहयोगी आपसे नफरत करेंगे

2

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

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


मैं इसे किसी प्रकार की टूडू सूची में या कम से कम कोड में एक नोट के अलावा देखूंगा।
जेफ ओ

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

ये एक अच्छा बिंदु है। यह साझा करने, सहयोग, संचार और उस सभी अन्य मज़ेदार सामानों को शामिल करने के लिए एक सादे टोडो सूची से अधिक कुछ होना चाहिए;
जेएफओ

1

कोडबेस में न खेलें। लिखें प्रोटोटाइप ऐसा करते हैं कि आप एक पैटर्न (डिजाइन) के फायदे और नुकसान का पता लगा सकते हैं।

यह पता चल सकता है कि सहज रूप से क्या महसूस किया जा सकता है, वास्तव में 2 अलग-अलग पैटर्न होने की तुलना में अधिक जटिल हो सकता है।

प्रोटोटाइप के लिए विकसित कोड के एक तरह से फेंकने की अपेक्षा करें।


1

यह एक कोड गंध है या नहीं, वास्तव में सिर्फ इसी तरह की समस्या ए और समस्या बी कैसे पर निर्भर है। जैक्सबी का जवाब लगता है कि वे बहुत समान हैं, और यदि आप समस्या को बदलते हैं (उदाहरण के लिए बग को ठीक करने के लिए) तो आपको उसी समय समस्या बी को भी बदलना होगा। JaqueB सही हो सकता है, लेकिन यह भी हो सकता है कि A और B स्वतंत्र रूप से बदल जाएं क्योंकि वे सभी समान नहीं हैं। उस स्थिति में आपको वर्णित डाउनसाइड होने की संभावना नहीं है।

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

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


1

नहीं, आपके पास एकल कोड आधार में उपयोग किए जाने वाले कई पैटर्न हो सकते हैं।

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

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