开放/封闭原则背后的含义和理由是什么?
开放/封闭原则指出,软件实体(类,模块等)应被打开以进行扩展,但应被封闭以进行修改。这意味着什么,为什么它是良好的面向对象设计的重要原则?
解决方案
回答
这意味着应该基于OO软件,但不应进行本质上的更改。这很好,因为它确保了基类的可靠,可预测的性能。
回答
这是对脆弱的基类问题的回答,该问题认为对基类的看似无害的修改可能会对依赖于先前行为的继承者产生意想不到的后果。因此,我们必须小心封装不需要的内容,以便派生类遵守基类定义的协定。一旦存在继承者,我们就必须对基类中的更改非常小心。
回答
该原理意味着它应该易于添加新功能,而不必更改现有,稳定和经过测试的功能,从而节省了时间和金钱。
通常,例如使用接口的多态性是实现此目的的好工具。
回答
这意味着我们应该将新代码放在新的类/模块中。现有代码仅应修改用于错误修复。新类可以通过继承重用现有代码。
开放/封闭原则旨在降低引入新功能时的风险。由于我们不修改现有代码,因此可以确保它不会被破坏。它降低了维护成本并提高了产品稳定性。
回答
比DaveK更具体地说,它通常意味着,如果要添加其他功能或者更改类的功能,请创建一个子类而不是更改原始类。这样,使用父类的任何人都不必担心以后会更改它。基本上,所有这些都是关于向后兼容性的。
面向对象设计的另一个真正重要的原理是通过方法接口的松耦合。如果我们要进行的更改不会影响现有界面,那么更改确实很安全。例如,使算法更有效。面向对象的原理也需要通过常识加以调整:)
回答
具体来说,它涉及OOP中的设计"圣杯",即使实体足够扩展(通过其单独的设计或者通过其参与体系结构)以支持将来无法预见的更改,而无需重写其代码(有时甚至不重新编译) **)。
做到这一点的一些方法包括多态性/继承,组成,控制反转(又称DIP),面向方面的编程,诸如策略的模式,访问者,模板方法以及OOAD的许多其他原理,模式和技术。
**请参见6个"打包原则",REP,CCP,CRP,ADP,SDP,SAP
回答
符合OCP的另一条经验法则是使基类相对于派生类提供的功能而言是抽象的。或者如斯科特·迈耶斯(Scott Meyers)所说,"使非叶子类变得抽象"。
这意味着在基类中具有未实现的方法,并且仅在本身没有子类的类中实现这些方法。然后,由于没有基类的客户,因此不能依赖基类中的特定实现。
回答
我只想强调一下,尽管"打开/关闭"在OO编程中显然有用,但它是在开发的所有方面都可以使用的一种健康方法。例如,以我个人的经验,使用纯C时尽可能多地使用"打开/关闭"是一个很好的止痛药。
/罗伯特