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

最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化"应该遵循的三个原则,觉得很有启发。

一、DRY原则

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

软件工程名著《The Pragmatic Programmer》首先提出了这个原则。它的涵义是,系统的每一个功能都应该有唯一的实现。也就是说,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,不要重复开发同样的功能。

这个原则有时也称为"一次且仅一次"原则(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 称为"三次原则",指的是当某个功能第三次出现时,才进行"抽象化"。

这是软件开发大家Martin Fowler在《Refactoring》一书中提出的。

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

这样做有几个理由:

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/leby/p/4891074.html

代码的抽象三原则【转载】相关推荐

  1. 提高面试代码质量的三要素

    作者总结自己多年面试他人以及被他人面试的经验,发现应聘者可以从代码的规范性.完整性和鲁棒性三个方面提高代码的质量. 程序员在职业生涯中难免要接受编程面试.有些程序员由于平时没有养成良好的编程习惯,在面 ...

  2. 代码设计的基础原则_设计原则:良好设计的基础

    代码设计的基础原则 As designers, it's our goal to pass information in the most pleasing way possible. Startin ...

  3. 绅士宝智能机器人怎样_如何打败“机器人淘汰三原则”

    当下真正能立于不败之地的人 是学会怎样利用数据来创造内容的人 图/图虫创意 如何打败"机器人淘汰三原则" 文/胡泳 发于2020.12.21总第977期<中国新闻周刊> ...

  4. 【项目分析】利用三原则六指标解读人工智能Project PAI项目

    本文发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明--一界码农+产品汪+创业者 个人微信号(liuhua7851) 之前写了如何 ...

  5. AI规则迎来进化:从“阿西莫夫三原则”到“李彦宏四原则”

    在硅谷久负盛名的波士顿机器人旗下的四足机器人,即将在明年量产,进入家庭场景.机器人正在离我们越来越近,很多人看完波士顿机器人的各种视频,都后背发凉:这么强大的机器人,放到家里,走在路上,伤害人类怎么办 ...

  6. 聊一聊SLAP:单一抽象层级原则

    作为程序员,我们总是和方法打交道,不知不觉都会接触Long method(方法体较长的方法),不论是自己写的还是他人写的,而Long method(长方法)往往是问题的体现,代表着代码有一种坏的味道, ...

  7. C++实现DPM/LatentSVM 完整代码下载 --- 第三篇

    这是我的DPM代码的第三篇博文,最初发表在http://blog.csdn.net/j56754gefge/article/details/40708679,均是我原创文章,他人转载请注明出处! C+ ...

  8. 《黄帝内经》中养生三原则

    <黄帝内经>是一部理论性极强,内容异常丰富.全面的医学巨著.但纵观全篇,真正涉及到内服的 治疗 方剂则数之寥寥,可是在针砭外治方面,预防 养生方面却占有很大的篇章,尤其是提出的清积.和中. ...

  9. Stuart Russell:有益AI三原则,需满足人类偏好

    ‍‍ [专栏:人物观点]重要的进展,往往会隐藏在"细微"的观点当中. 作者:李梦佳 AI已经足够聪明,但似乎对人类的偏好还不甚了解. 去年的一次演讲中,Stuart Russell ...

最新文章

  1. 经典br = new BufferedReader(new InputStreamReader(process.getInputStream()));
  2. JUSTCTF校赛安卓wp
  3. linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错
  4. Netty writeAndFlush() 流程与异步
  5. 虚拟专题:联邦学习 | 联邦可视化:一种隐私保护的可视化新模型
  6. java怎么播放不了声音,java – 为什么这段代码不播放声音文件
  7. 深入HBase架构解析(二)【转】
  8. Python之爬虫(七)正则的基本使用
  9. 中兴侵权案败诉需赔 2.89 亿元;HTC 裁员 1500 人;Android P Beta 3 发布 | CSDN 极客头条...
  10. string转int的方法_Spark——scala 实用小方法
  11. SCE2007 –安装配置指南
  12. [2018.09.12 T1] 下落的圆盘
  13. windows计算机桌面隐藏文件,成功隐藏Windows电脑文件的四种方法
  14. Python 多维数据可视化
  15. 狂热与幻想:草根财团、山寨交易所、传销社群和币圈自媒体
  16. Kotlin高仿微信-第6篇-主页-我的
  17. 蜗牛星际C单下实现黑群的局域网唤醒
  18. lol祖安服务器维护,触目惊心 被演员与代练所“支配”的英雄联盟
  19. java中抛出异常之后程序还会继续运行么?
  20. Ubuntu20.04安装yum

热门文章

  1. java socket 丢字节_Java:socket消息丢失了
  2. python集合类型一般应用的场景包括_Python学习,数据类型,python,篇
  3. 企业域名备案流程_2021境外投资备案申报流程(办理企业境外投资证书注意事项)...
  4. linux输入法_超强两笔输入法 入门简文
  5. fiddler启动文件_如何成为Fiddler大神,请看这里!
  6. html拖拽吸附插件,前端拖拽插件gridster.js
  7. 船员英语老师是面试还是计算机答题,面试时的英语介绍
  8. 在B站更新BV标识后,如何查看视频原AV号?
  9. java转换字符集_Java字符集转换解释
  10. update yum 到指定版本_CentOS 使用yum update 更新时保留特定版本的软件