本文是对敏捷软件开发第九章开发-封闭原则的学习笔记。
一句话,软件实体应该是可扩展但是不可修改的。
- 对于扩展是开放的
- 对于修改是封闭的
比较经典的例子就是代码中如果有链式的ifelse语句或者switch的语句的处理。这个也可以说是软件开发中大家都会遇到的问题,我个人也没什么好的方法
还是具体问题具体分析,遇到可以抽象的,可以抽象出subclass来处理,如做不到可以尝试使用map代替条件做处理。
可以参考下这个链接:https://sourcemaking.com/refactoring/smells/switch-statements
如何根据OCP原则设计系统?
实际上对于软件工程中的很多的理论都是需要开发者的经验支持的,就比如今天说的ocp,需要开发者对于他设计的模块应该对哪种变化封闭做出选择,因为模块是无法完全做到封闭的,软件是变化的。并且过度设计和不设计一样难以接受。
书中有个绘制图形的例子,从一开始对每个形状做判断需要使用switch开始,到抽象出形状类,再需要对各种形状绘制的排序需求。第一次变化是遵循了OCP原则,开放了接口,封闭了每个图形内的变化。到第二个变化时候发现原先的抽象并不能满足这次需求的变化(不能做到按照需求根据顺序绘制不同类型图形)。这里也引出了一个问题:需求的变化而引起设计的变化(并且这个也是无法避免的)。从软件开发角度上说,我们可以做到针对第一种变化,抽象,确保不再被此类问题引起代码僵化。而对于第二种变化:主动尝试刺激变化,包括短周期迭代,测试驱动,首先开发最重要的特性,频繁发布软件引起需求变化尽早到来。