मैं खुले-बंद सिद्धांत के इरादे को समझता हूं। इसका मतलब यह है कि किसी चीज को तोड़ने का जोखिम कम करना, जो पहले से ही इसे संशोधित करते हुए काम करता है, आपको बताए बिना संशोधित करने की कोशिश करता है।
हालांकि, मुझे यह समझने में थोड़ी परेशानी हुई कि यह सिद्धांत व्यवहार में कैसे लागू होता है। मेरी समझ से, इसे लागू करने के दो तरीके हैं। Beofore और एक संभावित परिवर्तन के बाद:
इससे पहले: अमूर्त करने के लिए कार्यक्रम और 'भविष्य की भविष्यवाणी' जितना आप कर सकते हैं। उदाहरण के लिए,
drive(Car car)
यदिMotorcycle
भविष्य में सिस्टम में एस जोड़ा जाता है, तो एक विधि को बदलना होगा, इसलिए यह संभवतः ओसीपी का उल्लंघन करता है। लेकिनdrive(MotorVehicle vehicle)
भविष्य में विधि को बदलने की संभावना कम है, इसलिए यह ओसीपी का पालन करता है।हालांकि, भविष्य की भविष्यवाणी करना और अग्रिम में जानना काफी मुश्किल है कि सिस्टम में क्या बदलाव होने जा रहे हैं।
इसके बाद: जब परिवर्तन की आवश्यकता होती है, तो वर्तमान कोड को संशोधित करने के बजाय एक वर्ग का विस्तार करें।
अभ्यास # 1 को समझना मुश्किल नहीं है। हालाँकि यह # 2 अभ्यास है कि मुझे यह समझने में परेशानी हो रही है कि आवेदन कैसे करें।
उदाहरण के लिए (मैंने इसे YouTube पर एक वीडियो से लिया): मान लीजिए कि हमारे पास एक वर्ग में एक विधि है जो CreditCard
वस्तुओं को स्वीकार करती है makePayment(CraditCard card)
:। एक दिन Voucher
सिस्टम में जोड़ा जाता है। यह विधि उनका समर्थन नहीं करती है इसलिए इसे संशोधित करना होगा।
पहली बार विधि को लागू करते समय हम भविष्य और कार्यक्रम को और अधिक सार शब्दों में अनुमान लगाने में विफल रहे (जैसे makePayment(Payment pay)
, इसलिए अब हमें मौजूदा कोड को बदलना होगा।
अभ्यास # 2 कहता है कि हमें संशोधित करने के बजाय कार्यक्षमता को जोड़ना चाहिए। इसका क्या मतलब है? क्या मुझे मौजूदा कोड को बदलने के बजाय मौजूदा वर्ग को उप-वर्ग करना चाहिए? क्या मुझे पुनर्लेखन कोड से बचने के लिए इसके चारों ओर किसी प्रकार का आवरण बनाना चाहिए?
या सिद्धांत यह भी नहीं बताता है कि 'कार्यक्षमता को सही ढंग से कैसे संशोधित / जोड़ना है', बल्कि यह संदर्भित करता है कि 'पहली जगह में परिवर्तन करने के लिए (यानी कार्यक्रम से अमूर्त) कैसे बचें?