मैं कैसे बता सकता हूं कि सॉफ्टवेयर अत्यधिक-युग्मित है?


16

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

संपादित करें:

किसी की दिलचस्पी के मामले में, यह लेख सहायक लगता है: कोड गुणवत्ता की खोज में: तंग जोड़े से सावधान रहें! (आईबीएम)


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

जवाबों:


15

मेरी राय में बुरी तरह से युग्मित मॉड्यूल का नंबर एक संकेतक द्विपक्षीय निर्भरता है। उदाहरण के लिए, Module1 एक मॉड्यूल 2 में कुछ फ़ंक्शन को कॉल करता है और Module2 Module1 में कुछ फ़ंक्शन को कॉल करता है।

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

एक और संकेत तब है जब एक मॉड्यूल लगातार कुछ विशिष्ट डेटा सेट के लिए कुछ अन्य मॉड्यूल को कॉल कर रहा है। इससे आपको यह सवाल करना चाहिए कि वास्तव में डेटा सेट का मालिक कौन होना चाहिए। ऐसा क्यों है कि प्रश्न में इस मॉड्यूल को हमेशा उस डेटा को देखने की आवश्यकता होती है जो किसी अन्य मॉड्यूल से संबंधित है?

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

यह किसी भी तरह से एक विस्तृत सूची नहीं है, लेकिन वे शीर्ष तीन चीजें हैं जो मैं खुद को सॉफ्टवेयर डिजाइन करते समय पूछता हूं।


2
द्विपक्षीय निर्भरता के लिए +1। वे शुद्ध बुराई के अंधेरे दिल हैं।
एडम क्रॉसलैंड

16

पुरानी कहावत है, "आप अपने दोस्तों को छू सकते हैं, और आप अपने निजी लोगों को छू सकते हैं। लेकिन आप अपने दोस्तों को छू नहीं सकते।" यह संक्षेप में युग्मन है।

अत्यधिक युग्मित कोड के संकेतों में बहुत बड़े इंटरफेस शामिल हैं जो लोगों को कार्यान्वयन के निजी विवरण और "एक दूसरे के बारे में बहुत कुछ जानने" वाली वस्तुओं के बारे में बताते हैं। स्वचालित विश्लेषण के लिए उपकरण हैं जो कोड को ध्वजांकित करेंगे जो आपके लिए कसकर युग्मित दिखता है। एक यादृच्छिक के लिए http://www.scitools.com/features/metricsintro.php देखें । (मुझे नहीं पता कि यह कितनी अच्छी तरह से काम करता है। यह सिर्फ Google खोज में काफी उच्च हो गया है।)


7

कक्षाओं के लिए कुछ इकाई परीक्षण लिखने का प्रयास करें। यदि आप आसानी से समर्थन वर्गों के लोड / नकली बनाने की आवश्यकता के बिना कक्षाओं का परीक्षण नहीं कर सकते हैं या एक db / ui जो भी हो तो यह खराब युग्मन / निर्भरता का एक निश्चित संकेत है।

यह भी सबसे अच्छे इलाज में से एक है, लेकिन आपको इसे ईमानदार रखने के लिए कोडिंग (जैसे TDD) के दौरान करना होगा।


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

6

मेरे लिए स्पष्ट संकेत यह है कि सब कुछ सार्वजनिक है।

अन्य संकेत है लॉटर ऑफ डेमेटर उल्लंघन - अत्यधिक यह।

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

जब उसने बनाए गए नियंत्रणों से डेटा पुनर्प्राप्त किया, तो उसने ऐसा किया:

var control = activeDataEntryControl as CustomTextBox;
if (control != null)
   result = control.NestedTextBox.Text;

/* several other controls */

वाह। आपने इसे बनाया है, और यह शून्य है ??????
माइकल के

यह एक अलग प्रकार हो सकता था। यह सिर्फ एक लूप में कई में से एक था।
ऑस्टिन सैलूनन

5

लहर प्रभाव

हर परिवर्तन में सभी कसकर युग्मित मॉड्यूल के माध्यम से एक लहर प्रभाव होता है।

"ओपन-क्लोज्ड" सिद्धांत का उल्लंघन किया गया है कि यह ठीक से बंद नहीं हुआ है और लीक से बदल गया है।


Ripple के लिए +1। कसकर-युग्मित राक्षसी के साथ काम करना मुझे रिपल के लिए पहुंचना चाहता है।
एडम क्रॉसलैंड

@ एडम क्रॉसलैंड: मैं लेप्रोइग इफ़ेक्ट अच्छी तरह से काम नहीं करता था - बहुत महंगा। लेकिन थंडरबर्ड इफेक्ट अच्छा रहा होगा।
S.Lott

3

वर्गों / पैकेजों / dll / jars / whatnots के बीच # शामिल / आयात आदि की संख्या की जाँच करें। मानसिक, मैन्युअल या किसी प्रकार के उपकरण का उपयोग करके, इसका एक ग्राफ खींचने की कोशिश करें।

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

0

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


0

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


0

बहुत सारे सभी कोड महक कुछ तरीके से शानदार कपलिंग का संकेत देते हैं। मुझे लगता है कि गंध सबसे अधिक युग्मन का संकेत देगा, हालांकि "अनुचित अंतरंगता" (मेरी पसंदीदा गंध) हो सकती है।

मुझे लगता है कि आपके यूएमएल आरेख में लाइनों को गिनने के लिए एक और उचित तरीका होगा। यदि आपके पास एन ऑब्जेक्ट्स हैं, और उनके बीच एन ^ एन (या अधिक) लाइनें हैं, तो आपका कोड बहुत अधिक अधिकतम युग्मित है। एन लाइन्स के बारे में शायद जितना हो सके उतना कम से कम होगा।

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