开放封闭原则(OCP) 和 单一职责(SRP) 没看懂区别在哪里

网上很多用 计算器 例子 举例说明这两个原则, 但是发现好像区别就是 OCP有个抽象类, 而SRP没有继承抽象

1.OCP相比较SRP, OCP的例子也都是把一个个的功能独立出来, 这不就做到了单一职责么?

2.然后说OCP可以做到对扩展开放, SRP不也可以做到么, 需要其他运算时, 加一个对应的类不就行了, 只不过相比较OCP, 没有去继承抽象来约束类而已啊, 所以不太理解这里的区别

3.而所谓 "修改封闭" 啥意思? 没太懂, 不知道说的是对哪个类做到了修改封闭, 毕竟即便是OCP, 新扩展(增加)一个运算类是很容易, 但是增加完了, 不还得在主页中中修改(在if else 或 switch case中增加一级么)

4.很多资料说 继承了抽象, 所以就对修改封闭 没看懂

阅读 3.7k
2 个回答

一个设计良好的模块,拿给别人用,那人需要一些新功能,应该怎么用呢,是修改已有模块代码?还是用别的手段进行扩展?开闭原则就是你的模块要是足够牛逼,就不会逼着别人改你的源码╮(╯_╰)╭ 在使用足够牛逼的模块时,要通过扩展来实现自己的功能而不是改人家代码。

单一职责就好理解了,对于一个一个的组件来说,多功能是没必要的,沙发是沙发,床是床,沙发床只能是权宜之计。

两者之间相同的地方就是“如无必要,勿增实体”,没有必要改代码就不要改代码,没必要加功能就不要加功能。通过组件之间的拼接组合实现整体功能,这样就能实现“高内聚,低耦合”的理想了。

当然这俩原则某种角度来说也是矛盾的,模块如何才能足够牛逼?大而全就可以了,然而大而全显然和单一职责冲突,所以这里就又有个权衡的问题,不过不用担心,“权衡”这种事情是无处不在的,“选择比努力重要”说的就是权衡的重要性。

  1. SRP是好理解的,一个类只能有一个职责。OCP可以直观的体现为已经完成的类不能被修改,却可以扩展自己的功能,再加入SRP后,表现为这种拓展不能超过一个理由。即一个抽象的计算类,通过创建一个类继承拓展计算器的加法后,再通过创建第三个类拓展乘法,调用方选择任意的抽象类的实现可以获得无限的功能,同时每个编写好的计算类都不需要修改,就是所谓的OCP。然而当你试图去拓展一个银行复利计算类时,你可能会违反SRP;
  2. 如你所说,OCP是通过增加对应的类来实现的,也就是说增加乘法计算时不需要去修改原来的加法计算类,加法计算类对修改是封闭的。计算抽象类却可与通过不断创建的子类而拓展,如增加乘法计算,这就是说这个计算类对拓展开放。同理,这不影响每个子类都是单一职则的,而且恰好体现了这些子类良好的符合了这两个原则。
  3. 封闭在指加法子类,你不需要担心增加乘法后你的加法算法出现问题,它是封闭的。
  4. 与1,2,3同理,通过继承增加新的模块,由调用方选择特定字类。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题