2015-06-03 10 views
8

परिचयकौन सा ठोस सिद्धांतों का उल्लंघन किया जाता है?


मैं विरासत समस्याओं के बारे में मेरे मालिक थीसिस पर काम करते हैं और कुछ संकेतक जो पता चलता है कि एक विरासत समस्या मौजूद बाहर काम करते हैं।

निम्न उदाहरण की तरह

:

उदाहरण


public static String getAnimalNoise(Animal animal) { 
    if (animal instanceof Dog) 
    return "Woof"; 
    if (animal instanceof Cat) 
    return "Miau"; 
    return ""; 
} 

विधि स्ट्रिंग "Woof" लौटाता है यदि दिए गए पशु उदाहरण एक Dog और "Miau" है अगर यह एक Cat है। खाली स्ट्रिंग क्योंकि कुछ जानवर बिल्कुल कोई शोर नहीं करते हैं।

तो इसके लिए सही समाधान पशु वर्ग में getNoise विधि के साथ बहुरूपता का उपयोग करना चाहिए।

मैंने विरासत की समस्याओं के विभिन्न संकेतकों का विश्लेषण किया है और कहना चाहते हैं कि उनमें से कुछ SOLID Principle का उल्लंघन करते हैं।

मैंने सोचा था कि उपरोक्त उदाहरण का उल्लंघन करती है:

  1. एकल जिम्मेदारी सिद्धांत (SRP)
  2. खुला/बंद सिद्धांत (ओसीपी)
  3. Liskov प्रतिस्थापन सिद्धांत (LSP)
  4. निर्भरता उलटा सिद्धांत (डीआईपी)

लेकिन मुझे सच में यकीन नहीं है कि यह सभी के लिए सच है या नहीं।

मैंने सोचा:

सिद्धांत उल्लंघन


SRP उल्लंघन

क्योंकि सब पर सशर्त बयान क्योंकि स्विच मामले बयान या अधिक की तरह, SRP का उल्लंघन करती है एक से अधिक यदि अन्य कथन एक से अधिक respon पर विचार कर रहे हैं sibility।

यह दो मामलों में मौजूद है इसलिए विधि को बदलने के एक से अधिक कारण हैं।

ओसीपी उल्लंघन

क्योंकि अगर एक नया जानवर एक नया मामला विधि में जोड़ा जाना चाहिए जोड़ा जाता है जिससे विधि संशोधन के लिए पास नहीं है।

LSP उल्लंघन

प्रत्येक शाखा पशु उप प्रकार की निर्भर विभिन्न कार्यों को निष्पादित करता है। जो मुझे लगता है कि एलएसपी का उल्लंघन करता है? मुझे आयताकार और वर्ग और getArea का उदाहरण पता है लेकिन इन उदाहरण मैंने सोचा कि उल्लंघन के लिए भी फिट बैठता है।

DIP उल्लंघन

सशर्त बयान निर्भरता का अर्थ है कि बयान के विवरण पर और कपोल-कल्पना जो DIP का उल्लंघन करती है पर नहीं निर्भर कर रहे हैं ले लो।

प्रश्न:


तो प्रश्न, दिए गए उदाहरण के लिए, यह देखते हुए सिद्धांतों वास्तव में उल्लंघन किया है और तर्क सही है कर रहे हैं?

+0

यह प्रोग्रामर.एसई पर अधिक विषय पर हो सकता है। – MSalters

उत्तर

8

SRP क्योंकि सब पर सशर्त बयान SRP उल्लंघन करती है, क्योंकि स्विच मामले बयान या एक से अधिक की तरह है, तो-और कुछ बयान एक से अधिक जिम्मेदारी पर विचार कर रहे हैं। यह दो मामलों में मौजूद है इसलिए विधि को बदलने के एक से अधिक कारण हैं।

मैं दृढ़ता से असहमत हूं। एसआरपी का अर्थ नमक के चुटकी के साथ किया जाना है। Uncle Bob's article on it here पढ़ें - उन्होंने इस सिद्धांत को बनाया।

मैं महत्वपूर्ण बिट्स बोली होगी:

क्या बदलने के लिए एक कारण परिभाषित करता है?

यह सिद्धांत लोगों के बारे में है।

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

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


ओसीपी अगर एक नया जानवर एक नया मामला विधि में जोड़ा जाना चाहिए जोड़ा जाता है जिससे विधि संशोधन के लिए बंद नहीं है क्योंकि।

सही। विधि कार्यान्वयन के एक विशिष्ट सेट को मानती है, और संशोधित किए बिना नए को संभालने में सक्षम नहीं होगी।


LSP प्रत्येक शाखा पशु उप प्रकार की निर्भर विभिन्न कार्यों को निष्पादित करता है। जो मुझे लगता है कि एलएसपी का उल्लंघन करता है?

यह एलएसपी का उल्लंघन करता है, लेकिन एक अलग कारण के लिए। अगर मुझे जिराफ में पास करना था, तो मुझे एक अप्रत्याशित परिणाम मिलेगा, एक खाली स्ट्रिंग। जिसका अर्थ यह है कि विधि Animal के किसी उप प्रकार के लिए सही नहीं है।


DIP सशर्त बयान निर्भरता का अर्थ है कि बयान के विवरण पर और कपोल-कल्पना जो DIP का उल्लंघन करती है पर नहीं निर्भर कर रहे हैं ले लो।

तकनीकी रूप से सच है, लेकिन यह उपरोक्त अन्य दो सिद्धांतों का उल्लंघन करने का एक दुष्प्रभाव है। यह वास्तव में समस्या का मूल नहीं है।


याद रखें कि सिद्धांत नियम नहीं हैं, इसलिए उन्हें व्याख्या करते समय बहुत सख्त/शाब्दिक न हों। व्यवहारवाद और समझ क्यों एक सिद्धांत की आवश्यकता है कुंजी हैं।

+0

मैं डीआईपी जोड़ूंगा: विधि को कंक्रीट कक्षाओं के बजाय 'मेक्सनोइसइंटरफेस' पर निर्भर होना चाहिए। – deceze

+0

@deceze किसी इंटरफ़ेस की आवश्यकता नहीं है, एक अमूर्तता पहले से मौजूद है: 'Animal'। समस्या विशिष्ट जानवरों के खिलाफ प्रकार की जांच है, और मैं व्यक्तिगत रूप से 'Animal' के अंदर 'getNoise' विधि को स्थानांतरित करके, सभी 3 उल्लंघनों को हल करके इसे हल कर दूंगा। – dcastro

+1

तेज़ उत्तर के लिए बहुत बहुत धन्यवाद! एसआरपी के लिए मुझे लगता है कि आप गलत हैं रॉबर्ट सी। मार्टिन क्लीन कोड साइट 38 की पुस्तक> इस समारोह के साथ कई समस्याएं हैं। सबसे पहले, यह बड़ा है, और जब नया कर्मचारी प्रकार जोड़े जाते हैं, तो यह बढ़ेगा। दूसरा, यह एक से अधिक चीजों को स्पष्ट रूप से करता है। तीसरा, यह एकल उत्तरदायित्व सिद्धांत 7 (एसआरपी) का उल्लंघन करता है क्योंकि इसे बदलने के लिए एक से अधिक कारण हैं। यहां स्वच्छ कोड संदर्भ: https://cleansourcecode.files.wordpress.com/2013/10/clean-code.pdf – Zelldon

1

मैं इस तथ्य से असहमत हूं कि आपका उदाहरण कोड एलएसपी का उल्लंघन करता है। LSP के रूप में पालन परिभाषित किया गया है:

Let Φ (एक्स) एक संपत्ति वस्तुओं के बारे में साध्य प्रकार टी फिर Φ (y) की एक्स प्रकार S की वस्तुओं y के लिए सही होना चाहिए जहां एस टी के एक उप-प्रकार है

पशु, अर्थात् Dog और Cat और अपने विधि से दो व्युत्पत्ति getAnimalNoise आप ठोस वस्तु के कुछ proveable संपत्ति के बारे में निर्णय नहीं कर रहे हैं को देखते हुए। आपकी विधि यह तय कर रही है कि शोर वापस क्यों किया जाना चाहिए और न कि वस्तुएं स्वयं द्वारा।

तो आइए कल्पना करें कि आप जानवर के लिए पैरों की संख्या निर्धारित कर सकते हैं।

Animal a = new Animal() 
a.setLegFront(2); 
a.setLegRear(2); 

और यदि आपके Dog इस तरह इस अधिलेखित कर देता है:

class Dog extends Animal 
{ 
    public void setFrontLegs(int legs) 
    { 
    this.frontLegs = legs; 
    this.rearLegs = legs + 2; 
    } 
    public void setRearLegs(int legs) 
    { 
    // do nothing here for demonstration purposes 
    } 
} 

अब आप एक Animal

Animal createAnimal() 
{ 
    return new Dog(); 
} 
Animal a = createAnimal(); 
a.setFrontLegs(2); 
a.setRearLegs(2); 

लौटने एक कारखाने है, तो और आप तरीकों setFront/setRearLegs आप परिणाम की उम्मीद कर रहे फोन 2 और 2 होने के लिए, लेकिन वास्तव में परिणाम पूरी तरह से अलग है, अर्थात् 2 और 4। तो यह उदाहरण कमान से कसकर बाध्य है वर्ग और आयताकारों के साथ एन एलएसपी उदाहरण। लेकिन मेरे लिए उदाहरण के मुकाबले साबित गुणों के उल्लंघन का एक और सटीक उदाहरण है। अन्य सिद्धांतों

मुझे लगता है कि अन्य सिद्धांत भी उल्लंघन होता है आपसे सहमत हूँ के लिए लेकिन SRP के लिए

अद्यतन मैं @dcastro से सहमत हैं।

+0

धन्यवाद। अन्य सिद्धांतों के बारे में क्या? – Zelldon

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