文档章节

代码的抽象三原则

jirak
 jirak
发布于 2019/12/08 11:37
字数 876
阅读 22
收藏 0

软件开发是"抽象化"原则(Abstraction)的一种体现。

所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。

发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量。要做到这两个目标,这需要"抽象化"。

一、DRY原则

DRY是 Don't repeat yourself 的缩写,意思是"不要重复自己"。

它的涵义是,系统的每一个功能都应该有唯一的实现。也就是说,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,不要重复开发同样的功能。

这个原则有时也称为"一次且仅一次"原则(Once and Only Once)。

二、YAGNI原则

YAGNI是 You aren't gonna need it 的缩写,意思是"你不会需要它"。

这是"极限编程"提倡的原则,指的是你自以为有用的功能,实际上都是用不到的。因此,除了最核心的功能,其他功能一概不要部署,这样可以大大加快开发。

它背后的指导思想,就是尽可能快、尽可能简单地让软件运行起来(do the simplest thing that could possibly work)。

但是,这里出现了一个问题。仔细推敲的话,你会发现DRY原则和YAGNI原则并非完全兼容。前者追求"抽象化",要求找到通用的解决方法;后者追求"快和省",意味着不要把精力放在抽象化上面,因为很可能"你不会需要它"。所以,就有了第三个原则。

三、Rule Of Three原则

Rule of three 称为"三次原则",指的是当某个功能第三次出现时,才进行"抽象化"。

它的涵义是,第一次用到某个功能时,你写一个特定的解决方法;第二次又用到的时候,你拷贝上一次的代码;第三次出现的时候,你才着手"抽象化",写出通用的解决方法。

这样做有几个理由:

(1)省事。如果一种功能只有一到两个地方会用到,就不需要在"抽象化"上面耗费时间了。

(2)容易发现模式。"抽象化"需要找到问题的模式,问题出现的场合越多,就越容易看出模式,从而可以更准确地"抽象化"。

比如,对于一个数列来说,两个元素不足以判断出规律:

1, 2, _, _, _, _,

 

第三个元素出现后,规律就变得较清晰了:

1, 2, 4, _, _, _,

(3)防止过度冗余。如果一种功能同时有多个实现,管理起来非常麻烦,修改的时候需要修改多处。在实际工作中,重复实现最多可以容忍出现一次,再多就无法接受了。

综上所述,"三次原则"是DRY原则和YAGNI原则的折衷,是代码冗余和开发成本的平衡点,值得我们在"抽象化"时遵循。

© 著作权归作者所有

jirak
粉丝 46
博文 264
码字总数 187926
作品 0
昌平
程序员
私信 提问
面向对象已死

当然,这是不可能的事情。虽然,面向对象到底是什么很难说清楚。 面向对象编程的三原则:基于消息传递机制,对象分离和多态。这和我们常说的面向对象三原则不太一样,没有提到继承,是的,现...

崔钢
2012/03/02
1.5K
20
代码的抽象三原则

软件开发是"抽象化"原则(Abstraction)的一种体现。 所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。 开发软件的时候,一方面,我们总是希望使用...

阮一峰
2013/01/31
0
0
《从0开始学架构》学习笔记索引

一、架构设计相关概念及复杂度来源 二、架构设计三原则 三、架构设计流程 ... --- 完整课程(微信扫码):

whoru
2019/01/17
52
0
下一代传输层安全库 - MesaLink

MesaLink TLS是百度安全实验室研发的下一代传输层安全(Transport Layer Security, TLS)库。2018年4月2日我们发布了MesaLink的第一个公开版本0.6.0。在过去的一年里,我们陆续发布了七个版本,...

匿名
2019/04/04
2.9K
2
Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用

MesaLink TLS是百度安全实验室研发的下一代传输层安全(Transport Layer Security, TLS)库。2018年4月2日我们发布了MesaLink的第一个公开版本0.6.0。在过去的一年里,我们陆续发布了七个版本,...

红薯
2019/04/04
731
1

没有更多内容

加载失败,请刷新页面

加载更多

如何从GitHub源安装gem?

我想从最新的GitHub源安装gem。 我该怎么做呢? #1楼 尝试使用specific_install gem,它允许您从其github存储库(如“edge”)或任意URL安装gem。 非常适用于在多台机器等上分配宝石和黑客攻...

技术盛宴
29分钟前
51
0
如何将来自其他分叉的未合并上游拉取请求应用于我的分叉?

我有一个分支的GitHub上的项目有一个新的pull请求,我想将其拉到作者尚未拉入的分支中。 有没有简单的方法可以将来自其他分叉的拉取请求应用于我的分叉? 这里还有我想念的东西吗? #1楼 就像...

javail
45分钟前
38
0
分页查询的入门打开方式(JavaWeb)

技术涵盖(JavaWeb、HTML、Ajax、JQuery、Bootstrap ) 接触这一部分知识的时候,我们经常会做一些小Demo来练手,不可避免的就需要接触到一定量的数据,我们常常需要将数据从数据库中回显到页...

BWH_Steven
今天
50
0
Kafka 基本原理

目录 简介 Kafka架构 Kafka存储策略 Kafka删除策略 Kafka broker Kafka Design The Producer The Consumer 复制(Replication) 日志压缩(Log Compaction) Distribution Zookeeper协调控制......

chen_chen_chen_
今天
58
0
将idea中的springboot项目部署到远程的docker容器

1、在idea中创建项目,如下图 2、配置docker maven plugin <!-- Docker maven plugin --><plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifact......

Lion华
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部