我了解开放原则的意图。这是通过告诉您尝试在不进行修改的情况下进行扩展,以降低破坏已在修改过程中起作用的内容的风险。
但是,我在理解此原理在实践中的应用时遇到了一些麻烦。据我了解,有两种方法可以应用它。在可能的更改之前和之后:
之前:编程抽象并尽可能“预测未来”。例如,
drive(Car car)
如果将来将Motorcycle
s添加到系统中,则必须更改 方法,因此它可能违反了OCP。但是该方法drive(MotorVehicle vehicle)
将来不太可能需要更改,因此它遵循OCP。但是,很难预测未来并提前知道将对系统进行哪些更改。
之后:需要更改时,扩展类而不是修改其当前代码。
练习1并不难理解。但是,在实践2中,我很难理解如何申请。
例如(我从YouTube视频中获取了它):假设我们在类中有一个接受CreditCard
对象的方法:makePayment(CraditCard card)
。将一天Voucher
添加到系统中。此方法不支持它们,因此必须对其进行修改。
首先实现该方法时,我们无法预测未来,无法以更抽象的术语进行编程(例如makePayment(Payment pay)
,因此现在我们必须更改现有代码。
练习2说,我们应该通过扩展而不是修改来添加功能。这意味着什么?我应该继承现有的类而不是简单地更改现有的代码吗?我是否应该围绕它进行某种包装,以避免重写代码?
还是该原则甚至不涉及“如何正确修改/添加功能”,而是涉及“如何避免必须首先进行更改(即从程序到抽象)”?