网上很多用 计算器 例子 举例说明这两个原则, 但是发现好像区别就是 OCP有个抽象类, 而SRP没有继承抽象
1.OCP相比较SRP, OCP的例子也都是把一个个的功能独立出来, 这不就做到了单一职责么?
2.然后说OCP可以做到对扩展开放, SRP不也可以做到么, 需要其他运算时, 加一个对应的类不就行了, 只不过相比较OCP, 没有去继承抽象来约束类而已啊, 所以不太理解这里的区别
3.而所谓 "修改封闭" 啥意思? 没太懂, 不知道说的是对哪个类做到了修改封闭, 毕竟即便是OCP, 新扩展(增加)一个运算类是很容易, 但是增加完了, 不还得在主页中中修改(在if else 或 switch case中增加一级么)
4.很多资料说 继承了抽象, 所以就对修改封闭 没看懂
一个设计良好的模块,拿给别人用,那人需要一些新功能,应该怎么用呢,是修改已有模块代码?还是用别的手段进行扩展?开闭原则就是你的模块要是足够牛逼,就不会逼着别人改你的源码╮(╯_╰)╭ 在使用足够牛逼的模块时,要通过扩展来实现自己的功能而不是改人家代码。
单一职责就好理解了,对于一个一个的组件来说,多功能是没必要的,沙发是沙发,床是床,沙发床只能是权宜之计。
两者之间相同的地方就是“如无必要,勿增实体”,没有必要改代码就不要改代码,没必要加功能就不要加功能。通过组件之间的拼接组合实现整体功能,这样就能实现“高内聚,低耦合”的理想了。
当然这俩原则某种角度来说也是矛盾的,模块如何才能足够牛逼?大而全就可以了,然而大而全显然和单一职责冲突,所以这里就又有个权衡的问题,不过不用担心,“权衡”这种事情是无处不在的,“选择比努力重要”说的就是权衡的重要性。