代码的抽象三原则

原文:http://www.ruanyifeng.com/blog/2013/01/abstraction_principles.html

作者: 阮一峰

日期: 2013年1月31日

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

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

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

最近,我读到美国程序员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原则的折衷,是代码冗余和开发成本的平衡点,值得我们在"抽象化"时遵循。

==========================================================

时间: 2024-09-12 16:32:21

代码的抽象三原则的相关文章

代码的抽象三大原则

本文转载自 阮一峰的网络日志,原文内容如下.  软件开发是"抽象化"原则(Abstraction)的一种体现.  所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理.  开发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量.要做到这两个目标,这需要"抽象化".  最近,我读到美国程序员Derick Bailey的一篇文章,谈到"抽象化&qu

听马云讲创业三原则

创业|马云 原则一:创业不是"置之死地"      马云一直是个不安分的人,很早就已经开始创业.最初和一帮铁哥们成立了一个翻译社,后来他甚至背着麻袋去义乌贩卖小商品.再后来他接触到了互联网,他意识到:互联网必将改变世界!虽然当时在杭州甚至还没有开通拨号上网业务,就是远在美国的杨致远也不过刚刚创建雅虎不到一年.但马云却萌发出一个想法:我要做一个网站,把国内的企业资料收集起来放到网上向全世界发布.       很多人都认为马云的成功在于他敏锐的发现互联网时代的到来,不过是提前登上了那条驶向

x264代码剖析(三):主函数main()、解析函数parse()与编码函数encode()

x264代码剖析(三):主函数main().解析函数parse()与编码函数encode()                  x264的入口函数为main().main()函数首先调用parse()解析输入的参数,然后调用encode()编码YUV数据.parse()首先调用x264_param_default()为保存参数的x264_param_t结构体赋默认值:然后在一个大循环中通过getopt_long()解析通过命令行传递来的存储在argv[]中的参数,并作相应的设置工作:最后调用se

第七篇Bootstrap表单布局实例代码详解(三种表单布局)_javascript技巧

Bootstrap提供了三种表单布局:垂直表单,内联表单和水平表单.下面逐一给大家介绍,有兴趣的朋友一起学习吧. 创建垂直或基本表单: •·向父 <form> 元素添加 role="form". •·把标签和控件放在一个带有 class .form-group 的 <div> 中.这是获取最佳间距所必需的. •·向所有的文本元素 <input>.<textarea> 和 <select> 添加 class .form-cont

羊城晚报:政府“围脖”三原则

特邀议员 小乔 政府"织围脖"方兴未艾,亦不乏成功之例.想其成功,大抵不离此三原则:直面评论.学会说话.结果为上.直面评论就是要敢于接受 网友"拍砖",而不是像当初的一些做法,连评论功能都不让开通.学会说话就是要放下身段,放下官腔,多说贴心话,多说实话.结果为上就是以为人民群众释疑解惑.办好实事为宗旨,而非以有否织围脖为姿态为作秀. 围脖已是潮流,但能否围出实效,围得让百姓满意,还要靠夜以继日的苦心经营.经营得好,成了抒民情解民意的地方,经营不好,网上添堵而已.

周鸿祎:大数据时代的用户信息安全三原则

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 几年前,雷·库兹韦尔写过一本书叫做<奇点临近>.他说,人类文明经过这么多年发展,在本世纪的中叶会经过一个点,这个点,就是奇点.奇点是一个拐点,也就是说人类文明可能会进入一个分岔,可能会进入一个新的文明高度,也可能会急转直下,人类就此灭亡.所以奇点有双重的含义,有可能变得更好,也有可能变得更糟糕. 我认为随着大数据时代的到来,互联网也将走到一个奇点,而安全将决定互联网走过这个奇点之后,到底是向上走到一个新高度,还是向下走到一个坏局面.大数据

编写高效jQuery代码的4个原则和5个技巧_jquery

jQuery的编写原则: 一.不要过度使用jQuery 1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大.所以有原生方法可以使用的场合,尽量避免使用jQuery. 复制代码 代码如下: $("a").click(function(){    alert($(this).attr("id"));});//改良后↓$("a").click(function(){    alert(t

代码注入的三种方法

http://www.vckbase.com/index.php/wv/1580   目录 Windows 钩子 CreateRemoteThread 和 LoadLibrary 技术 ――进程间通信 CreateRemoteThread 和 WriteProcessMemory 技术 ――如何用该技术子类化远程控件 ――何时使用 CreateRemoteThread 和 WriteProcessMemory 技术 结束语 附录A 附录B 附录C 附录D 附录E 附录F 参考资料 简介 本文将讨

网页设计遵循三原则

介绍3条网页设计原则,网页设计师设计网页的时候可以参考参考. 遵循标准,采用DIV设计网页.       在XHTML网站设计标准中,不再使用表格定位技术,而是采用DIV+CSS的方式实现各种内容的定位.DIV是HTML语言中的一个常用元素,而DIV+CSS是网页布局的一种方法,这种布局方法区别于传统的Table布局,达到了内容与代码相分离的效果.使用DIV+CSS设计的网站是符合W3C标准的,可以更方便搜索引擎的索引.       通常搜索引擎对标准化制作的网站页面所给予的权重更高,并且使用D