मुझे इन दिनों यह बहस करने के लिए उपयोगी नहीं लगता कि क्या करता है और एक एकल जिम्मेदारी या बदलने का एक कारण नहीं बनता है। मैं इसके स्थान पर एक न्यूनतम दुख सिद्धांत का प्रस्ताव करूंगा:
न्यूनतम दुख सिद्धांत: कोड को या तो परिवर्तन की आवश्यकता की अपनी संभावना को कम करना चाहिए या परिवर्तित होने में आसानी को अधिकतम करना चाहिए।
सो कैसे? एक रॉकेट वैज्ञानिक को यह पता लगाने के लिए नहीं लेना चाहिए कि यह रखरखाव की लागत को कम करने में मदद क्यों कर सकता है और उम्मीद है कि यह अंतहीन बहस का मुद्दा नहीं होना चाहिए, लेकिन सामान्य रूप से एसओएलआईडी के साथ, यह हर जगह नेत्रहीन रूप से लागू करने के लिए कुछ नहीं है। ट्रेड-ऑफ को संतुलित करते हुए इस पर विचार करना चाहिए।
परिवर्तन की आवश्यकता की संभावना के रूप में, इस के साथ नीचे चला जाता है:
- अच्छा परीक्षण (बेहतर विश्वसनीयता)।
- केवल कुछ विशिष्ट करने के लिए आवश्यक नंगे न्यूनतम कोड को शामिल करना (इसमें अभिवाही कपलिंग को कम करना शामिल हो सकता है)।
- बस यह क्या करता है पर कोड बदमाश बनाने (देखें बदमाश सिद्धांत)।
परिवर्तन करने में कठिनाई के लिए, यह अपक्षय युग्मों के साथ ऊपर जाता है। परीक्षण में आकर्षक कपलिंग का परिचय दिया गया है लेकिन यह विश्वसनीयता में सुधार करता है। अच्छी तरह से किया, यह आम तौर पर नुकसान की तुलना में अधिक अच्छा करता है और न्यूनतम शोक सिद्धांत द्वारा पूरी तरह से स्वीकार्य और प्रचारित होता है।
बदमाश सिद्धांत बनाएं: कई स्थानों पर उपयोग की जाने वाली कक्षाएं भयानक होनी चाहिए। उन्हें विश्वसनीय, कुशल होना चाहिए यदि उनकी गुणवत्ता, इत्यादि से जुड़ा हो।
और बदमाश सिद्धांत को न्यूनतम दुख सिद्धांत से बांधा जाता है, क्योंकि बदमाश चीजों को उन चीजों की तुलना में परिवर्तन की कम संभावना पाएंगे, जो वे करते हैं।
मैंने उपर्युक्त विरोधाभास की ओर संकेत करके शुरू किया होगा, और फिर संकेत दिया जाएगा कि SRP आप जिस स्तर पर विचार करना चाहते हैं, उस स्तर पर अत्यधिक निर्भर है और यदि आप इसे बहुत दूर ले जाते हैं, तो किसी भी वर्ग में एक से अधिक संपत्ति या एक विधि का उल्लंघन होता है यह।
एसआरपी के दृष्टिकोण से एक वर्ग जो मुश्किल से कुछ करता है निश्चित रूप से केवल एक (कभी-कभी शून्य) कारणों को बदलना होगा:
class Float
{
public:
explicit Float(float val);
float get() const;
void set(float new_val);
};
व्यावहारिक रूप से परिवर्तन का कोई कारण नहीं है! यह एसआरपी से बेहतर है। यह ZRP है!
सिवाय इसके कि मैं सुझाव दूंगा कि यह बदमाश सिद्धांत का उल्लंघन है। यह भी बिल्कुल बेकार है। जो कुछ बहुत कम करता है वह बदमाश होने की उम्मीद नहीं कर सकता है। इसकी बहुत कम जानकारी (TLI) है। और स्वाभाविक रूप से जब आपके पास कुछ ऐसा है जो टीएलआई है, तो यह वास्तव में कुछ भी सार्थक नहीं कर सकता है, न कि उस जानकारी के साथ भी जो इसे एनकैप्सुलेट करता है, इसलिए इसे बाहरी दुनिया में इस उम्मीद में लीक करना होगा कि कोई और वास्तव में कुछ सार्थक और बदमाश करेगा। और यह रिसाव उस चीज़ के लिए ठीक है जो केवल डेटा एकत्र करने के लिए है और इससे अधिक कुछ नहीं है, लेकिन यह सीमा वह अंतर है जैसा कि मैं "डेटा" और "ऑब्जेक्ट्स" के बीच देखता हूं।
बेशक कुछ ऐसा है जो टीएमआई बुरा है। हम अपना पूरा सॉफ्टवेयर एक कक्षा में रख सकते हैं। यह भी सिर्फ एक run
विधि हो सकती है। और कोई यह भी तर्क दे सकता है कि अब इसे बदलने का एक बहुत व्यापक कारण है: "सॉफ्टवेयर में सुधार होने पर इस वर्ग को केवल बदलने की आवश्यकता होगी।" मैं मूर्खतापूर्ण हो रहा हूं, लेकिन निश्चित रूप से हम उसके साथ रखरखाव के सभी मुद्दों की कल्पना कर सकते हैं।
तो आपके द्वारा डिज़ाइन की गई वस्तुओं की बारीकियों या मोटेपन के रूप में एक संतुलन कार्य होता है। मैं अक्सर इसका आंकलन करता हूं कि आपको बाहरी दुनिया में कितनी जानकारी लीक करनी है, और वह कितनी सार्थक कार्यक्षमता दिखा सकती है। मैं अक्सर न्यूनतम बदमाश सिद्धांत के साथ संयोजन करते समय शेष राशि खोजने के लिए वहां बदमाश सिद्धांत को सहायक बनाता हूं।