正在阅读SOLID设计的开放/封闭原则,并对其可维护性感到好奇。
假设我有子类B和C,它继承自父类A. B具有B独有的方法,C具有C独有的方法。父类A有两种常用方法,由子类使用。
在未来的代码版本中,假设我们有一个新功能,它引入了B类和C类之间的通用方法。我们现在无法将该方法推到A类,因为它违反了“关闭以进行修改”部分。原则。这似乎引入了代码冗余。不仅如此,但技术上不会将这个新功能添加到B类和C类中也违反了该原则的修改原则?
似乎使用Open / Closed方法,您最终会构建一个不必要的级联子类层次结构,因为不允许对原始代码进行更改。这是正确的假设/理解吗?
答案 0 :(得分:1)
你没有水晶球,你无法看到未来并预测会发生变更请求。
然而一旦发出更改请求,该区域的其他更改很可能会在稍后发生。
让我们从评论中获取您的汽车示例:当收到所有汽车现在鸣喇叭的变更请求的那一刻,您应该考虑是否会在稍后进行另一次此类更改。假设你认为它很有可能,它只有一件事,那就是重构使整个情况打开以进行扩展并关闭以进行修改。因此,现在不仅可以轻松添加鸣喇叭,而且可以轻松添加下一个此类功能。
你是正确的,过早地应用这个可以膨胀的代码,它也会在代码审查期间收到大量的YAGNI条评论。
答案 1 :(得分:0)
在开放/封闭式方法中,您最终会构建一个 子类的不必要的级联层次结构只是因为一个 不允许对原始代码进行更改。这是一个 正确的假设/理解?
不,我不认为遵循开放/封闭原则导致子类的级联层次结构。
首先,它只是一个原则或目标。有时候向基类添加方法显然是"对"即使对于SOLID爱好者也是如此。
其次,基类中的很多方法(显然会导致更改)从一开始就有点代码味道。你有没有看过短语"赞成composition over inheritance"?