खुले-बंद सिद्धांत (OCP) में कहा गया है कि एक वस्तु को विस्तार के लिए खुला होना चाहिए लेकिन संशोधन के लिए बंद होना चाहिए। मेरा मानना है कि मैं इसे समझता हूं और इसका उपयोग एसआरपी के साथ मिलकर कक्षाएं बनाता हूं जो केवल एक चीज करते हैं। और, मैं कई छोटे तरीकों को बनाने की कोशिश करता हूं जो सभी व्यवहार नियंत्रणों को उन तरीकों से बाहर निकालना संभव बनाते हैं जिन्हें कुछ उपवर्गों में बढ़ाया या ओवरराइड किया जा सकता है। इस प्रकार, मैं उन कक्षाओं के साथ समाप्त होता हूं जिनमें कई विस्तार बिंदु होते हैं, इसके माध्यम से हो: निर्भरता इंजेक्शन और रचना, घटनाओं, प्रतिनिधिमंडल, आदि।
निम्नलिखित एक सरल, विस्तार योग्य वर्ग पर विचार करें:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
अब कहते हैं, उदाहरण के लिए, कि OvertimeFactor
परिवर्तन 1.5। चूंकि उपरोक्त वर्ग को विस्तारित करने के लिए डिज़ाइन किया गया था, इसलिए मैं आसानी से उप-वर्ग कर सकता हूं और एक अलग वापसी कर सकता हूं OvertimeFactor
।
लेकिन ... वर्ग के विस्तार और OCP के पालन के लिए डिज़ाइन किए जाने के बावजूद, मैं प्रश्न में विधि को उप-वर्ग करने और ओवरराइड करने के बजाय प्रश्न में एकल विधि को संशोधित करूंगा और फिर अपने IoC कंटेनर में अपनी वस्तुओं को फिर से वायर करूंगा।
परिणामस्वरूप, मैंने OCP को पूरा करने के लिए क्या प्रयास किया है, के एक हिस्से का उल्लंघन किया है। ऐसा लगता है कि मैं सिर्फ आलसी हो रहा हूं क्योंकि ऊपर थोड़ा आसान है। क्या मैं OCP को गलत समझ रहा हूँ? क्या मुझे वास्तव में कुछ अलग करना चाहिए? क्या आप OCP के लाभों का अलग-अलग लाभ उठाते हैं?
अपडेट : यह जवाब देने के आधार पर लगता है कि यह वंचित उदाहरण कई कारणों से एक गरीब है। उदाहरण का मुख्य उद्देश्य यह प्रदर्शित करना था कि वर्ग को ऐसे तरीकों को प्रदान करने के लिए डिज़ाइन किया गया था जब आंतरिक या निजी कोड को बदलने की आवश्यकता के बिना ओवरराइड सार्वजनिक तरीकों के व्यवहार को बदल देगा । फिर भी, मैंने निश्चित रूप से OCP को गलत समझा।