理解开闭原则

Making sense of the open closed principle

我正在努力了解开放封闭原则:

模块应该对扩展开放,对修改关闭

就java而言,扩展是专门继承还是包括继承以及新方法或属性的添加?

我也在苦思冥想关闭修改,这似乎在暗示我一旦方法写好了就不能改变了

这似乎与实际工作不一致,我将从 jira 中获取任务,这将要求我更改代码库中的至少一个方法。

我在过去 24 小时内阅读了很多帖子和文章,但我仍然不完全确定这条原则试图传达什么。

任何简单的解释都会很有帮助。

您应该将代码编写得足够好,而不必修改现有代码。曾经。如果您需要现有方法的功能,您应该能够调用该方法,因为它应该具有高内聚性和极低的耦合性。

这样想,盖完房子后,是尝试将浴室的尺寸扩大一倍(移动马桶和重新铺地板、新墙……等)还是更容易?在房子前面建一个新入口的日光浴室?

您应该不要修改卧室,虽然这并非不可能,但打造阳光房会更容易创建新的 space。

开放扩展

模块的合理扩展应该是可能的。否则,潜在用户将转而编写自己的实现,从而导致重复。

什么是合理的扩展通常是设计中最难的部分 - 设计者必须预测最终用户将需要什么扩展。

因修改而关闭

模块的扩展不能破坏模块的内部工作/声明的功能。如果模块无法保护其内部工作不被修改,那么确保(甚至考虑)模块的正确性将变得更加困难。基本上,通过允许用户修改您的模块,您正在向模块的 contract 添加一个要求,即扩展不会以破坏它的方式修改您的模块 - 一个要求如果用户不详细了解模块,这通常是未记录的并且不可能实现。