程序员都知道编程有 3 大类:面向过程、面向对象、面向函数。面向对象是被讨论的最多的,个人认为,这是因为 Java 之类的编程语言有强大的用户基础,本质还是因为比较符合人的直觉。

说到面向对象,大家可能就会很快想到了 23 种设计模式,可只有少部分人会想到面向对象的 6 大原则,所以本文我分享一下我对于 6 大原则的看法。

6 大原则是内功心法,23 种设计模式是武术套路,它们的本质是为了更好地面对需求的变化。

很多人对于设计模式背诵的滚瓜烂熟,但是却没有办法评价自己的代码质量,尤其是根据自己的想法整了一大堆设计模式之后,很难分辨自己是规范编程还是过度设计。

其实,设计模式是立足于 6 大设计原则上的。

6 大设计原则对应 6 个规则,取首字母缩写就是 SOLID 。

1.  单一职责原则 (Single Responsibility Principle)

描述:一个类只有一个引起修改的原因。

理解:我们都知道要软件开发要解耦合,解耦合的理想状态就是一个类只负责一个功能。

软件开发要做好拥抱变化的准备。

比如,1 个月前,你做了一个类,负责用户模块。

后来需求变动,登录增加了微信账号登录,你得改你的用户模块。

后来需求变动,注册增加了手机动态码验证,你的修改你的用户模块。

后来需求变动,登录增加了github 登录,你的修改你的用户模块。

后来需求变动,登录增加了weibo 登录验证,你得修改你的用户模块。

后来需求变动,... 你已经麻木了。

你会发现,你的用户模块越来越臃肿了。

但是,如果你一早就实现 2 个类,一个负责登录,一个负责注册。

那么登录需求的变化不会影响注册的代码,反之亦然。

虽然,代码没有减少多少,但你可以明确感受到职责分明,所以开发会更轻松一点。

2. 开闭原则 (Single Responsibility Principle)

描述:一个软件实体,应该对扩展开放,对修改关闭。

理解:很多人可能对这个概念感到有些玄乎,其实很好理解的。

假设你是乙方,你给甲方的交付物是一个 SDK,有一天客户想要增加一个功能,现在有 2 种方案可以选择:

  1. 你重新开发一个新的 API 供客户调用。

  2. 建议客户利用现成的 SDK 扩展一个新的 API 自己解决问题。

说具体点,比如客户临时提出一个美颜的需求。

你评估了自己的 SDK 里面发现有人脸检测 API,有区域调色 API,有图像锐化 API,这个很轻易组装一个美颜的 API,所以你不需要从头开发出来。

这就体现了开闭原则,开对于于需求,对需求的变动保持开发,闭对于已有的成果,不轻易破坏原有代码的稳定性。

3. 里氏替换原则(Liskov Substitution Principle)

描述:所有引用基类的地方必须能透明地引用其子类。

理解:举个简单的例子,假如一个会议的参会要求是,你必须是农民。那么,可以定义农民为基类。所以,只要是集成了农民的子类比如花农、果农、种植水稻的农民都可以参加这个会议。

4. 迪米特法则(Law of Demeter)

描述:只和你的直接朋友对话,不和陌生人对话。

理解:这一个原则很具人生哲学代表性。本质还是为了解耦,避免不必要的耦合,降低复杂度,并且提高安全性。我们熟悉的谍战片都是这个模式,卧底只和一个上线对话。

5. 接口隔离原则(Interface Segregation Principle)

描述:客户端不应该依赖于它不需要的接口,不同的类之间的关系应该建立在最少的接口基础上。

理解:这其实就是解耦合的的具体体现。举个生动的例子。

我认为接口应该是一种承诺,或者是协议。

甲方给乙方一系列接口,就算给了承诺。

但甲方多变,乙方做好心理打算就好了,有些话听听就好了,提取最有用的信息,完成自己的任务,万一需求变动,再改也方便,如果一开始就整那些有的没的的东西,甲方再改动需求时,影响的范围会更大。

另外有种情况是,甲方有好几个乙方,不同的乙方需要一起协同。

这要求不同乙方之间约定好对话窗口,目的也是降低耦合度,保护自己尽可能少受需求变动之苦。

6. 依赖倒置原则(Dependence Inversion Principle)

描述:上层不应该依赖于底层,底层应该依赖于上层。抽象不应该依赖于细节,细节应该依赖于抽象。

理解:听起来挺拗口的,其实也好理解。

)

我是一个人,我从广州去深圳,我说我依赖汽车、火车、自行车,这站在软件角度都不对的。

正确的应该是,我依赖于交通工具这个接口或者是抽象类。

那么,我坐飞机、自行车、汽车、火车都满足情况,未来可能还有地铁、轻轨等等,这就是面向未来的编程方式。

也是底层依赖上层,细节依赖抽象的意思。

依赖倒置的意思是,本来 Person 依赖于具体的实现类,后来引进了交通工具这个抽象类,自行车、汽车、火车这些交通工具反而要依赖于接口,这个从被依赖到依赖别人的改变就看做是依赖关系的倒置,所以叫依赖倒置。

最后,拥抱需求不是一句空话,需要在代码中反映。


近期技术文章:

工作多年,我对架构的一些理解

程序员能轻易干好其他专业吗?

聊聊线程和进程

面向对象设计原则_聊聊面向对象的6大设计原则相关推荐

  1. HTML5汽车网页设计成品_学生DW汽车静态网页设计代做_web课程设计网页制作_宽屏大气汽车自驾游网站模板html源码...

    HTML5汽车网页设计成品_学生DW汽车静态网页设计代做_web课程设计网页制作_宽屏大气汽车自驾游网站模板html源码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML ...

  2. HTML5汽车网页设计成品_学生DW汽车静态网页设计代做_web课程设计网页制作_宽屏大气汽车自驾游网站模板html源码

    HTML5汽车网页设计成品_学生DW汽车静态网页设计代做_web课程设计网页制作_宽屏大气汽车自驾游网站模板html源码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML ...

  3. python是面向对象的语言_*Python面向对象总结

    在语言数不胜数,虽然任何一门语言都万变不离其宗,但还是有差别的,个人感觉要想学好Python面向对象,首先要多练,毕竟熟能生巧,分享一个学习面向对象小技巧:把生活和学习结合起来,当你看到生活或程序中某 ...

  4. 接口隔离原则_设计模式的三大分类及六大原则

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  5. 响应式网页设计代码_消除响应式网站建设设计中的缺陷

    在过去的5年里,移动流量的份额增长了20%,现在响应式网站设计已经被认为是理所当然的了.到2020年,您可以通过手机几乎可以访问任何网站,它会很好用.大多数用户如果看到一个网站在他们的智能手机或平板电 ...

  6. 总结定时器设计方法_超实用!网站导航栏设计方法总结

    导航对于一个网站来说,起到重要的引导作用.一个优秀的导航设计可以让用户快速的找到所需 ,让用户清晰明了的了解到网站的结构框架,起到重要的指引作用.下面跟大家分享下常用的几种网页导航形式: 1.顶部导航 ...

  7. logisim设计alu设计报告_【新】PowerBI 报告设计思想 结构布局篇

    引子 很多战友问过一个问题,那就是如何设计一个PowerBI报告,对这个问题,需要一个系统化的回答,它足可以形成一个课程,该课程将完全讲述如何纯纯地构造一个PowerBI的报告,不包括对任何可视化元素 ...

  8. 个性签名设计软件_佩服!我用Python设计了一个签名软件

    临近年末,大家都忙着签发礼品,写的一手好的签名,会让大家更有成就感,今天,小安就带领大家来设计一个基于tkinter+爬虫的签名设计软件,方便大家设计签名. 要设计这款软件,就需要了解tkinter与 ...

  9. java 委托原则_为什么说 Java SPI 的设计违反双亲委派原则

    一.双亲委派模型 1.类加载器可以细分为如下三类 启动类加载器(Bootstrap ClassLoader),负责将所有存放在\lib目录中的,或者被-Xbootclasspath参数所指定路径中,并 ...

最新文章

  1. .configure
  2. 【模拟】Codeforces 710C Magic Odd Square
  3. 24小时临时邮箱_实用网站 | 临时邮箱,悄悄来悄悄去~
  4. 你好a+b(非入门)
  5. 美国教授描述未来学校,将颠覆现有教育模式
  6. 如何word删除分隔符
  7. code vs 1013 求先序排列
  8. python unittest断言_python接口自动化(二十四)--unittest断言——中(详解)
  9. android制作弹出框样式,Android Dialog 弹出框 自定义 样式
  10. java引用复制_Java中引用的浅复制和深复制
  11. 拓端tecdat|R语言如何在生存分析与Cox回归中计算IDI,NRI指标
  12. 解决谷歌浏览器自动填充表单
  13. HTML5 电子罗盘开发
  14. python实现.jpeg转.jpg
  15. 春季必买明星款流行春装
  16. 野生葫芦娃用心写的nodejs 内置模块------文件操作
  17. 英语MuttonfatJade羊脂玉muttonfatjade单词
  18. 学习matlab(七)——符号计算
  19. 【JavaScript】JavaScript之快速入门
  20. 在胸口凝成一颗鲜红的朱砂印

热门文章

  1. 在CentOS 7.5上升级SQLite3过程实录
  2. 中式古建筑su模型大全
  3. 两个类相互包含引用的问题--类前向声明
  4. C++智能指针:weak_ptr实现详解
  5. thymeleaf : input/select/radio回显
  6. 如何解决代码中if…else 过多的问题
  7. 一道面试题:js返回函数, 函数名后带多个括号的用法及join()的注意事项
  8. 《转》Python学习(14)-对文件的操作(一)
  9. 在Proteus中添加标号
  10. Nginx 在centos linux 安装、部署完整步骤并测试通过