2010-10-21 12 views
5

मैंने जो एलओडी विवरण देखा है (उदाहरण के लिए, Wikipedia, C2 Wiki) विधियों को कॉल करने के बारे में बात करें। विकिपीडिया के शब्दों में:क्या डेमेटर का कानून केवल विधियों पर लागू होता है?

कार्यों के लिए Demeter के कानून की आवश्यकता है कि एक वस्तु हे की एक विधि एम केवल तरीकों वस्तुओं में निम्न प्रकार के आह्वान हो सकता है:
- हे ही
- एम के मानकों
- किसी ऑब्जेक्ट का निर्माण/एम
भीतर instantiated - ओ के प्रत्यक्ष घटक वस्तुओं
- एक वैश्विक चर, सुलभ हे द्वारा, एम

की
दायरे में

लेकिन गुण, चर या enums तक पहुंचने के बारे में क्या? उदाहरण के लिए, यह दिया गया:

class FirstClass { 
    public SecondClass GetRelatedClass() { 
     return new SecondClass(); 
    } 

    public enum InnerEnum { 
     Violated, 
     NotViolated 
    } 
} 

class SecondClass { 
    public int Property {get; set;} 
    public string _variable = "Danny Demeter"; 
} 

क्या इनमें से कोई भी/सभी एलओडी उल्लंघन है? (अब के लिए प्रत्यक्ष चर का उपयोग पर ध्यान न दें, यदि आप कर सकते हैं ..)

void Violate(FirstClass first) { 
    SecondClass second = first.GetRelatedClass(); 
    var x = second.Property; 
    var y = second._variable; 
    var z = FirstClass.InnerEnum.Violated; 
} 

मैं पहले दो (चाहे 'सरकारी' उल्लंघन है या नहीं) ऐसा नहीं होता है, काफी इतना enum हालांकि बारे में निश्चित नहीं।

उत्तर

6

मैं enum प्रश्न पर उत्तर नहीं दे सकता - मुझे याद है कि मानक सिफारिश कक्षा के अंदर enums परिभाषित नहीं है।

गुणों के लिए, आप वास्तव में गुणों (getProperty() और setProperty(value)) के शॉर्टकट होने पर गुणों पर विचार कर सकते हैं। उस स्थिति में, आपका जवाब यह है कि संपत्ति का उपयोग उल्लंघन है।

फ़ील्ड (चर) के लिए, एक बार फिर, सामान्य अभ्यास उन्हें बेनकाब नहीं करना है बल्कि गुणों का उपयोग करने के लिए, वास्तव में खेतों को उजागर करना encapsulation का उल्लंघन है।

आखिरकार, डेमेटर के कानून का इरादा कक्षाओं के बीच कार्यान्वयन के ज्ञान को सीमित करना है। मेरे लिए इसका मतलब है कि आपके सभी उदाहरण उल्लंघन हैं।

+0

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

1

FWIW ...

उल्लंघन # 1 (एक्स) एक किसी न किसी सेवा स्थान पैटर्न की तरह लग रहा है, तो मुझे लगता है यह होगा कि उदाहरण उल्लंघन नहीं है।

उल्लंघन # 2 (वाई) एक वर्ग डिजाइन गंध की तरह दिखता है, लेकिन आम तौर पर उल्लंघनों # 1 के प्रदर्शन से ऊपर कुछ भी प्रदर्शित नहीं करता है।

मुझे नहीं लगता कि सार्वजनिक गणना (जेड), हालांकि वे स्कॉप्ड हैं, यहां एलओडी के खिलाफ गिनती होगी।

क्या आपके पास अपनी चिंताओं को प्रदर्शित करने के लिए एक बेहतर असली दुनिया का उदाहरण है? उचित संदर्भ के बिना, सरल कोड उदाहरण ठीक हो सकते हैं, या वे डिजाइन सिद्धांतों का उल्लंघन कर सकते हैं।

+0

शायद, हालांकि मुझे लगता है कि यह कम दिखता है यदि आप इसे सभी एक साथ लिखते हैं (जो एलओडी के दृष्टिकोण से समान है): 'x = first.GetRelatedClass()। संपत्ति;'। या शायद सेवा स्थान कभी-कभी एलओडी उल्लंघन होता है? –

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