2008-10-02 10 views
60

Law of Demeter के कानून इंगित करता है कि आप केवल वस्तुओं है कि आप के बारे में सीधे पता करने के लिए बात करनी चाहिए। यही है, अन्य वस्तुओं से बात करने के लिए विधि श्रृंखला का प्रदर्शन न करें। जब आप ऐसा करते हैं, तो आप मध्यस्थ वस्तुओं के साथ अनुचित संबंध स्थापित कर रहे हैं, coupling अन्य कोड पर आपका कोड।युग्मन, सामंजस्य और Demeter

यह बुरा है।

समाधान वर्ग आप के बारे में अनिवार्य रूप से सरल रैपर उस वस्तु इसके साथ संबंध नहीं है करने के लिए ज़िम्मेदारी सौंपना बेनकाब करने के लिए पता है के लिए किया जाएगा।

यह अच्छा है।

लेकिन, उस वर्ग कम cohesion होने में परिणाम लगता है। अब यह ठीक से ज़िम्मेदार नहीं है कि यह क्या करता है, लेकिन इसमें प्रतिनिधि भी हैं जो एक अर्थ में, कोड को इसके संबंधित ऑब्जेक्ट के इंटरफ़ेस के हिस्सों को डुप्लिकेट करके कम संयोजक बनाते हैं।

यह बुरा है।

क्या यह वास्तव में एकजुटता को कम करने में परिणाम देता है? क्या यह दो बुराइयों में से कम है?

क्या यह विकास के उन भूरे क्षेत्रों में से एक है, जहां आप लाइन कहां पर बहस कर सकते हैं, या लाइन को आकर्षित करने का निर्णय लेने के लिए मजबूत, सिद्धांतबद्ध तरीके हैं और निर्णय लेने के लिए आप किस मानदंड का उपयोग कर सकते हैं ?

+0

एक छोटे से विषय के विषय में मैं दृढ़ता से टेड फैयंस की सिफारिश करता हूं "घटना-आधारित प्रोग्रामिंग: घटनाओं को सीमा तक ले जाना" [लिंक] (http://books.google.co.uk/books?id=9CL446IzhuAC&pg=PA38&lpg= PA38 और डीक्यू = घटनाओं + अध्याय + एक + युग्मन और स्रोत = बीएल और ओ टी एस = qmJTOuCz90 और sig = EZKvZBjF8QmGohatC97HsmAqG0c & hl = hi & Ei = wj6tTqe5LcTX8gON_YyiCw और सा = एक्स और Oi = book_result और सीटी = परिणाम और resnum = 6 और वेद = 0CEMQ6AEwBQ # v = onepage & q = घटनाओं%% 20one% 20coupling & f = झूठी 20chapter)। यह आम युग्मन मुद्दों पर एक बड़ा टूटना देता है और किसी दिए गए सिस्टम में युग्मन की मात्रा को मापने की एक अच्छी प्रणाली देता है –

+0

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

उत्तर

43

ग्रेडी "ऑब्जेक्ट ओरिएंटेड विश्लेषण और डिजाइन" में बूच:

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

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

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

मार्टिन Fowler कहते हैं कि वे और अधिक आरामदायक यह "Demeter का सुझाव" बुला (लेख Mocks aren't stubs देखें) होगा:

"Mockist परीक्षकों के ट्रेन जहाजों 'से बचने के बारे में अधिक बात करते हैं - की शैली की विधि चेन getThis()। getThat()। getTheOther()। विधि श्रृंखला से बचने के लिए डेमेटर के कानून के रूप में भी जाना जाता है। विधि श्रृंखलाएं एक गंध हैं, जबकि मध्यम पुरुषों की विपरीत समस्या अग्रेषण विधियों के साथ फूला हुआ भी एक गंध है। (मैं हमेशा महसूस किया जाता है कि अगर मैं डेमेटर का सुझाव कहता हूं तो मुझे डेमेटर के कानून के साथ और अधिक आरामदायक लगेगा।) "

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

+1

मुझे यह प्रतिक्रिया पसंद है, ऐसा लगता है कि यह एक भूरे रंग की बात है। इसलिए, यदि मैं समझा सकता हूं, तो क्या आप तर्क देंगे कि जब तक आप शामिल वस्तुओं में उच्च एकजुटता बनाए रखते हैं, तो यह डेमेटर के कानून का उल्लंघन करने के लिए स्वीकार्य है? –

+0

बिल्कुल, यह डालने का एक अच्छा तरीका है। बीटीडब्ल्यू, क्या आपने JQuery देखा है, विधि कॉल की श्रृंखला 3+ स्तर सामान्य है। यद्यपि यह एक अलग संदर्भ में हो सकता है (अधिक प्रक्रियात्मक) JQuery से आने वाले किसी व्यक्ति को जावा/सी #/सी ++ कहने के लिए सभी प्रकार की बुरी आदतों को "अनदेखा" करने वाला है! – Ash

+1

यदि मैं सुझाव दे सकता हूं कि आप इस बिंदु को अपनी पोस्ट में जोड़ें (इसके बारे में डेमेटर के कानून का उल्लंघन करना ठीक है) ... अभी यह सबसे अच्छी प्रतिक्रिया है जिसे मैंने देखा है। –

0

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

20

आप

int price = customer.getOrder().getPrice(); 

समाधान होने) कोड

int price = customer.getOrderPrice(); 

में एक getOrderPrice (बनाने के लिए नहीं है और बदलने से Demeter के कानून का उल्लंघन कर रहे, लेकिन इसके बजाय ध्यान दें कि यह है एक code smell और प्रासंगिक परिवर्तन करें जो उम्मीद है कि दोनों एकजुटता और कम युग्मन बढ़ाएंगे। दुर्भाग्यवश यहां कोई सरल रिफैक्टरिंग नहीं है जो हमेशा लागू होता है, लेकिन आपको शायद tell don't ask

+4

"बताओ, मत पूछो" का लिंक पढ़ने के लायक है। धन्यवाद! –

+0

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

1

मुझे पता नहीं है कि यह वास्तव में एकजुटता को कम करता है या नहीं।

एकत्रीकरण/रचना एक वर्ग अन्य वर्गों का उपयोग अनुबंध अपने सार्वजनिक विधियों के माध्यम से यह उजागर करता है को पूरा करने के बारे में सभी कर रहे हैं। कक्षा को इसके संबंधित ऑब्जेक्ट्स के इंटरफ़ेस को डुप्लिकेट करने की आवश्यकता नहीं है। यह वास्तव में विधि कॉलर से इन समेकित वर्गों के बारे में किसी भी knwowledge छुपा रहा है।

वर्ग निर्भरता के कई स्तरों के मामले में Demeter के कानून का पालन करने के लिए, तुम सिर्फ प्रत्येक स्तर पर एकत्रीकरण/संरचना और अच्छा कैप्सूलीकरण आवेदन करना होगा।

दूसरे शब्दों में प्रत्येक वर्ग हालांकि इनमें ही कभी संदर्भित वर्ग पर निर्भरता और नहीं किसी भी वस्तुओं properies/तरीकों से लौटे पर हैं अन्य वर्गों पर एक या अधिक निर्भरता है।

+0

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

+0

यह उपयोग किए जाने वाले अबास्ट्रक्शन के स्तर/प्रकार के बारे में भी है। एक ग्राहक, परिभाषा के अनुसार, ऑर्डर/एस के साथ कुछ करीबी सहयोग होना चाहिए। इसलिए ग्राहक की सहभागिता ग्राहक द्वारा कम नहीं होती है .getOrderPrice(); रिफैक्टरिंग। उदाहरण: ग्राहक ऑर्डरप्रिस के रूप में एक साधारण दशमलव का उपयोग कर सकता है। – Ash

+0

यह कैसे संयोजन को कम नहीं करता है? यह ग्राहक से संबंधित नहीं है, यह आदेश से संबंधित है। आप इसे ग्राहक के स्तर पर उजागर कर रहे हैं। यह सहसंयोज को कम करना शुरू करता है? क्या ग्राहक.getOrderAddressStreet() एकजुटता में कमी का कारण बनता है? शायद यह सब ग्रे है .... –

6

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

3

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

इसे आपके लिए काम करें, इसके लिए काम न करें।

+0

यह डेमेटर के कानून के लिए एक अच्छा वर्णन है "इसे आपके लिए काम करें, इसके लिए काम न करें।" – erhun

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