设计模式二十四章经之六大设计原则

概述

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

而设计原则则是设计模式所遵循的规则,设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。

在开发过程中,我们会不知不觉的用到这些设计模式,设计原则,可能某些你没听过,但当你了解之后,你会发现,你在编码过程中的确会用到这个设计模式。

单一职责原则

定义:一个类只负责一项功能。不仅仅指类,也适用于方法和接口,比如我们常说的一个方法实现一个功能一样。

例子:一家三口,一个负责买菜,一个负责做菜,一个负责洗锅碗瓢盆。如果缺少了什么菜,我们可以让买菜的去买菜,做菜的先做其他的菜。不可让做菜的去买菜,买完回来在做。这不是很浪费时间?

优点:

  • 降低复杂度,一个类负责一个功能比负责多个肯定简单很多;
  • 提高可读性,可维护性。
  • 风险低,修改一个功能的时候,可以降低对其他功能的影响。

开闭原则

定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。

例子:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。

解决思路:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

里氏替换原则

定义:子类可以扩展父类的功能,但不能更改父类原有的功能。

例子:A类有个加法的方法,B类去实现A类的加法方法在里面做减法,现在通过B去实现加法实际做的是减法操作。

优点:

  • 代码重用,减少成本
  • 可扩展性

缺点:

  • 继承是侵入性的,会造成子类代码冗余
  • 灵活性降低

依赖倒置原则

定义:面向接口编程

例子:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

解决思路:

  • 低层模块尽量都要有抽象类或接口,或者两者都有。
  • 变量的声明类型尽量是抽象类或接口。
  • 使用继承时遵循里氏替换原则。

迪米特原则

定义:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。也就是说一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。

例子:A寻求B找一个律师,B通过他七大姑八大姨各种关系找到了一个律师C,A只需要知道律师C,而不需要知道B的七大姑八大姨。

接口隔离原则

定义:建立单一接口,接口方法不宜臃肿。尽量细化接口。

解决思路:

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
  • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

总结

在应用开发中,最难的不是去完成任务。而是后期的维护与优化。为了保证后续代码的清晰,灵活。在不破坏系统稳定性的前提下保持可扩展,高内聚,低耦合。遵循六大设计原则是我们说迈出的第一步。

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2018-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏最高权限比特流

漫谈计算机组成原理(一)程序是怎么跑起来的

我们知道,计算机是由软件和硬件共同组成的。没有硬件,软件就没有用武之地;没有软件,硬件就只能是一堆废铁。 而软件又分为两类:

2564
来自专栏Java技术栈

架构师必须掌握的 10 条设计原则

函数是程序员的工具中最重要的抽象形式。它们能更多地被重复使用,你需要编写的代码就越少,代码也因此变得更可靠。较小的函数遵循单一职责原则更有可能被重复使用。

1011
来自专栏编程

如何提高Python运行效率 超实用的四种提速方法

Python增长势头一直非常迅猛,它虽然是脚本语言,但容易学,同时,还有非常多优秀的深度学习库可用,也有越来越多的人将Python学习列入计划。Python是一...

2277
来自专栏Java学习网

书写高质量代码之状态维护

状态之始 我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。 编程相对于人类历史的进程而言,不过是个六七岁孩...

2834
来自专栏take time, save time

python 爬虫 入门 commit by commit -- commit5

代码你可以在https://github.com/rogerzhu/relwarcDJ 上得到,并且带有我完整的commit记录。

500
来自专栏DT乱“码”

java中接口的作用

很多JAVA初级程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。       好像定义接口是提前做了个多余的工作。下面我给大家总结...

21110
来自专栏木头编程 - moTzxx

PHP 开发学习[6] —— PHP导出Excel表实例参考

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

752
来自专栏知识分享

12-MQTT介绍

看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转

1603
来自专栏PHP实战技术

PHP面向对象编程基本原则

首先祝大家节日快乐!!! ? 额,不知道你们剁手没,小梦是没有!整整已经错过了第九个年头! ? 小伙伴是不是有一种感觉,PHP入门的时候简直爱不释手,总是把 ...

3349
来自专栏互联网技术栈

各业务Object概念(VO、 PO、DO、DTO、 BO、 QO、DAO、POJO)

在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了。通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理。可以看成是与数据库...

1517

扫码关注云+社区