2010-07-19 15 views
6

यह देखते हुए कि Mixins आम तौर पर कक्षा में नए व्यवहार को पेश करते हैं, यह आम तौर पर दर्शाता है कि एक वर्ग में एक से अधिक व्यवहार होंगे।एकल उत्तरदायित्व और मिक्सिन

यदि किसी वर्ग की एक ज़िम्मेदारी है तो इसे कक्षा के रूप में परिभाषित किया जाता है जिसमें परिवर्तन के लिए केवल एक कारण होता है।

तो, मैं दो अलग अलग दृष्टिकोण

  1. वर्ग केवल बदलाव के लिए एक कारण है से देख सकते हैं। मिश्रित मॉड्यूल में परिवर्तन के लिए केवल एक कारण है। यदि वर्ग बदल जाता है तो कक्षा को रीस्टस्टिंग की आवश्यकता होगी। यदि मॉड्यूल बदल जाता है तो मॉड्यूल को रीस्टस्टिंग की आवश्यकता होती है। इसलिए, एसआरपी बरकरार है।

  2. कक्षा में अब बदलाव के दो कारण हैं। यदि कक्षा बदल दी गई है, तो कक्षा और मॉड्यूल दोनों को रीस्टस्टिंग की आवश्यकता है। यदि मॉड्यूल बदल दिया गया है, तो फिर कक्षा और मॉड्यूल दोनों को रीस्टस्टिंग की आवश्यकता है। हेंग, एसआरपी का उल्लंघन किया जाता है।

mixins के उपयोग Single Responsibility Principle का उल्लंघन करता है, और अंत में एक प्रणाली रेख करने में कठिन में परिणाम?

उत्तर

1

जब आप असंबंधित वर्गों के बीच व्यवहार साझा करने की आवश्यकता (और कुछ समय आपको आवश्यकता है), वहाँ अनिवार्य रूप से तीन विकल्प हैं:

  1. कॉपी और हर जगह पेस्ट करें। यह डीआरवाई का उल्लंघन करता है, रखरखाव को चोट पहुंचाने की गारंटी है।
  2. इसे एक अमूर्त वर्ग में रखें और अपने सभी वर्गों को छोड़ दें (जिनमें से कई एक-दूसरे से संबंधित नहीं हैं) इससे प्राप्त होते हैं। इसे आमतौर पर ओओ एंटीपाटर माना जाता है। सीधे शब्दों में कहें, यह पूरी तरह से सिर पर विरासत की अवधारणा को खटखटाता है। सिर्फ इसलिए कि foo और bar कुछ चीजें समान करते हैं, आप दावा नहीं करते कि foo is-a bar है।
  3. इसे कहीं और रखें, इसे एक स्पष्ट नाम दें, और इसे आवश्यक सभी वर्गों में मिलाएं।

परीक्षण के लिए, मैं तर्क दूंगा कि एक अच्छी नियमित विधि की तरह एक "अच्छा" मिश्रण, इतना कम होना चाहिए कि इसका उपयोग करने वाले वर्गों को स्वतंत्र रूप से उपयोग किया जा सके।

+0

यदि आपको असंबंधित कक्षाओं के बीच साझा व्यवहार की आवश्यकता है तो यह पूरी तरह से किसी अन्य वर्ग के लिए नौकरी की तरह लगता है। यह उन असंबद्ध वर्गों के बीच विरासत या मिश्रण के बिना इंटरफ़ेस के माध्यम से आवश्यक व्यवहार का ख्याल रख सकता है। यह एसआरपी और डीआरवाई का ख्याल रखता है। – Tek

-1

मैं इससे सहमत हूं। हालांकि, एसआरपी कभी-कभी का उल्लंघन कर सकता है (या चाहिए)।

1

मुझे लगता है कि यह मिश्रण पर निर्भर करता है। यह इसे अतिरिक्त जिम्मेदारियां भी दे सकता है, लेकिन ऐसे Ruby's Comparable जैसे हैं जो बहुत कम स्तर की कार्यक्षमता देते हैं जो मैं कहूंगा कि एसआरपी का उल्लंघन नहीं करता है।

1

यह देखते हुए कि मिक्सिन आमतौर पर कक्षा में नए व्यवहार को पेश करते हैं, यह आम तौर पर दर्शाता है कि एक वर्ग में एक से अधिक व्यवहार होंगे।

यदि यह सत्य था, तो यह एकल (कार्यान्वयन) विरासत के समान ही सच होगा। जबकि किसी को भी 23-गहरी विरासत पदानुक्रम पसंद नहीं है, फिर भी इसकी जगह है।

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

तो इसे बदलने का एकमात्र कारण संरक्षित है।

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