Açık-kapalı prensibinin amacını anlıyorum. Değiştirmeden genişletmeyi denemenizi söyleyerek, değiştirirken zaten çalışan bir şeyi kırma riskini azaltmak içindir.
Ancak, bu prensibin uygulamada nasıl uygulandığını anlamakta zorlandım. Anladığım kadarıyla bunu uygulamanın iki yolu var. Olası bir değişiklikten önce ve sonra:
Önce: soyutlamalara programlayın ve 'geleceği tahmin edin' olabildiğince. Örneğin , gelecekte sisteme s eklenecekse bir yöntemin
drive(Car car)
değiştirilmesiMotorcycle
gerekecektir, bu nedenle muhtemelen OCP'yi ihlal eder. Ancak yöntemindrive(MotorVehicle vehicle)
gelecekte değişmesi daha az olasıdır, bu nedenle OCP'ye uyar.Ancak, geleceği tahmin etmek ve sistemde hangi değişikliklerin yapılacağını önceden bilmek oldukça zordur.
Sonra: bir değişiklik gerektiğinde, geçerli kodunu değiştirmek yerine bir sınıfı genişletin.
1 numaralı uygulamayı anlamak zor değil. Ancak nasıl uygulanacağını anlamada sorun yaşıyorum.
Örneğin (YouTube'da bir videodan aldı): en biz kabul eden bir sınıfta bir yöntemi var diyelim CreditCard
nesneleri: makePayment(CraditCard card)
. Voucher
Sisteme bir gün s eklenir. Bu yöntem onları desteklemediğinden değiştirilmelidir.
Yöntemi ilk etapta uygularken geleceği ve programı daha soyut terimlerle tahmin edemedik (örneğin makePayment(Payment pay)
, şimdi mevcut kodu değiştirmemiz gerekiyor).
Uygulama # 2, işlevselliği değiştirmek yerine genişleterek eklememiz gerektiğini söylüyor. Bu ne anlama geliyor? Sadece varolan kodunu değiştirmek yerine varolan sınıfı alt sınıflara mı ayırmalıyım? Kodu yeniden yazmaktan kaçınmak için etrafına bir tür sarıcı yapmalı mıyım?
Ya da prensip 'işlevselliği doğru bir şekilde nasıl değiştirir / ekler' anlamına gelmez, daha ziyade 'ilk etapta değişiklik yapmaktan (yani soyutlamalara program yapmaktan) kaçınmak anlamına gelir mi?