经典设计原则
经典设计原则除了 SOLID 之外,常见的还包括 KISS、YAGNI、DRY、LOD、CRP 等几种:
- KISS(Keep It Simple & Stupid, 尽量保持简单)
- YAGNI(You Ain't Gonna Need It, 你不会需要它)
- DRY(Don't Repeat Yourself, 不要重复自己)
- LOD(Law Of Demeter, 迪米特法则)
- CRP(Composite Reuse Principle, 合成复用原则)
KISS 原则
理解
KISS 原则的英文描述有很多版本,如下:
- Keep It Simple & Stupid
- Keep It Sweet & Simple
- Keep It Short & Simple
- Keep It Simple & Straightforward
它们的含义都差不多,其实就是“尽量保持简单”。
但是,并不是代码行数越少就越“简单”,还要考虑逻辑复杂度、实现难度、代码的可读性等。并且,有些本身就复杂的问题,用复杂的方法解决,并不能算是违背 KISS 原则。
优点
遵循 KISS 原则,将会有以下的优点:
- 简单地编写代码,理解该代码不会有任何困难,将更容易修改,而且花费的时间也会大大减少
最佳实践
在实际开发中,可以通过以下情况判断代码是否满足 KISS 原则:
- 不要使用协作者可能不懂的技术来实现代码
- 不要重复造轮子,要善于使用已经有的工具类
- 不要过度优化,牺牲代码的可读性
YAGNI 原则
理解
YAGNI 原则的核心思想就是不要过度设计,即不要去设计当前用不到的功能,不要去编写当前用不到的代码。
优点
遵循 YAGNI 原则,将会有以下的优点:
- 过度设计往往会延缓开发的迭代速度,减少过度设计将能支持创业公司的快速迭代
- 编写只符合当前场景的代码质量可能会更高,这也是 KISS 原则的另一种实践
最佳实践
虽然说,在不需要某功能前,不要提前去实现此功能。但是,在可预见的情况下,需要预留好扩展点,等到实现此功能时能无缝接入。
比如,系统在当前只需要使用 Redis 存储配置信息,以后有可能会用到 ZooKeeper 存储配置信息。根据 YAGNI 原则,当前没有必要编写 ZooKeeper 的代码,但是可以通过抽象出统一的配置存储接口作为扩展点,方便后续可以快速接入。
DRY 原则
理解
DRY 原则可以理解成不要写重复的代码,解决的是代码的复用性问题。
优点
遵循 DRY 原则,将会有以下的优点:
- 对于频繁更改需求的情况,重复代码将会增加修改代码的痛苦
- 遵循 DRY 原则要求开发者具备高度抽象思维,高度抽象的代码具备高可维护性、高扩展性
最佳实践
常见代码重复情况
实现逻辑重复,但功能语义不重复的代码,并不违反 DRY 原则。
比如说,一个检验用户名和检验密码的代码在编写上完全一致,因此写了 isValidUserName()
和 isValidPassword()
两个函数,但其实这两个函数并不能算作违反 DRY 原则。
功能语义重复,但实现逻辑不重复的代码,视为违反 DRY 原则。
其原则在于,对于完全相同的功能,不允许出现两个及其以上的对外接口,更不允许出现不同的代码表示同一个功能。
隐藏的执行重复被认定违反 DRY 原则。
即当运行完一个代码流程之后,出现相同的函数被无意义地执行过两次及其以上,则被称为执行重复,这是一种隐藏的违反 DRY 原则的行为。
代码复用性
总结有以下方法可以提高代码的可复用性:
- 减少代码耦合
- 满足单一职责原则
- 善于模块化
- 业务与非业务逻辑分离
- 通用代码下沉
- 善用面向对象的特性
- 应用设计模式
事不过三
“3”是一个非常神奇的数字,“事不过三”是它的一种特殊用法,这个原则可以应用在编写可复用代码的时候。
可以这么理解:第一次写代码时,如果当下没有复用的需求,而未来的复用需求也不是很明确,并且开发可复用代码的成本比较高,那就不需要考虑代码的复用性;第二次遇到复用场景的时候,再进行重构使其变得可复用。
LOD 原则
理解
LOD(迪米特) 原则也被叫作最小知识法则(Least Knowledge Principle, LKP),其含义是不该有依赖的模块之间不要有依赖,有依赖关系的模块之间尽量只依赖必要的接口。
迪米特原则有点类似于接口隔离原则,希望能减少类之间的耦合,让类越独立越好。
优点
遵循迪米特原则,将会有以下的优点:
- 降低类之间的耦合度,提高了模块的相对独立性
- 提高类的可复用率和系统的扩展性
最佳实践
迪米特原则还有几种定义形式:不要和陌生人“说话”,只与你的直接朋友通信等。
在迪米特原则中,对于一个对象,其“朋友”包括以下几类:
- 当前对象本身
- 以参数形式传入到当前对象方法中的对象
- 当前对象的成员对象
- 如果当前对象的成员对象是一个集合,那么集合中的对象也都是朋友
- 当前对象所创建的对象
CRP 原则
理解
CRP 原则又称为组合/聚合复用原则,其含义是,尽量使用对象组合,而不是继承来达到复用的目的。
通过继承来进行复用的主要问题在于,继承复用会破坏系统的封装性。当基类发生了改变,继承基类的子类也会不可避免地发生改变,从基类继承而来的实现是静态的,不可能在运行时发生变化,没有足够的灵活性。
通过组合或聚合关系可以将已有的对象纳入新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,这样关系不会将已有对象的实现细节暴露给新对象。
相对继承而言,组合和聚合复用的耦合度更低,相互之间的影响不大,实际开发中可以有选择性地调用需要的功能。
优点
遵循 CRP 原则,将会有以下的优点:
- 系统更加灵活,降低了类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小
最佳实践
一般而言,如果两个类之间是“Has-A”的关系,应使用组合或聚合;如果是“Is-A”的关系,可以使用继承。
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023