代码的抽象三原则

标签: IT | 发表时间:2013-01-31 14:03 | 作者:阮一峰
出处:http://www.ruanyifeng.com/blog/

软件开发是 "抽象化"原则(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原则的折衷,是代码冗余和开发成本的平衡点,值得我们在"抽象化"时遵循。

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

附:

[广告]

图灵公司打算重新出版 《Joel on Software》的中文版,正在寻找译者。如果你对此有兴趣,请与朱巍编辑联系(Email:zhuw(at)turingbook.com)试译。关于此书的更多情况,可参考我翻译的续集 《More Joel on Software》。特别提醒:翻译是非常辛苦、但是报酬很低的工作,写信前请想清楚,你是真的想翻译这本书。

(完)

文档信息

相关 [代码 抽象 原则] 推荐:

代码的抽象三原则

- - 阮一峰的网络日志
软件开发是 "抽象化"原则(Abstraction)的一种体现. 所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理. 开发软件的时候,一方面,我们总是希望使用别人已经写好的代码,另一方面,又希望自己写的代码尽可能重用,以求减少工作量. 要做到这两个目标,这需要"抽象化".

代码重构方向原则指导

- - 外刊IT评论
提示:如果您在阅读器里点击订阅本站的文章链接时发现有一个中转页,这说明你的订阅地址有误,本站的订阅地址(RSS)是:. http://www.aqee.net/feed/,请及时纠正. 重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量.

代码审查:github官方给出的代码审查指导原则

- - 外刊IT评论
这篇文章的内容由github官方提供,指导你如何在github上进行代码审查和如果让别人审查自己的代码. 接受这样的事实:很多编程上的主张都是一种个人观点. 应该讨论它们的利与弊,提出你的倾向观点,迅速的达成一种解决方案. (“把这个变量命名成 :user_id你觉得怎样. (“我的”,“不是我的”,“你的”).

Web前端:11个让你代码整洁的原则

- - 博客 - 伯乐在线
写Web页面就像我们建设房子一样,地基牢固,房子才不会倒. 同样的,我们制作Web页面也一样,一个良好的HTML结构是制作一个美丽的网站的开始,同样的,良好的CSS只存在同样良好的HTML中,所以一个干净的,语义的HTML的优点很多,那么平时制作中,我们做到了这一点吗. 上图展示了两段代码,我想大家都只会喜欢第一种,我们先不说其语义,至少他的结构让我们看上去清爽,而第二种呢.

[Web] 几个原则让前端代码更整洁

- - 博客园_首页
    在讲解今天的知识点之前,我想先展示两个片段的代码,让大家看看这两段代码有哪些地方是值得以后的项目实践中需要注意的,需要去改进的.     片段一  1 .     片段二是对片段一的改进,下面就改进点进行详细的讲解.     片段二的第 1 行,添加了代码 .

几个原则让前端代码更整洁

- - CSDN博客研发管理推荐文章
在讲解今天的知识点之前,我想先展示两个片段的代码,让大家看看这两段代码有哪些地方是值得以后的项目实践中需要注意的,需要去改进的.     片段二是对片段一的改进,下面就改进点进行详细的讲解.     片段二的第 1 行,添加了代码 .     编写HTML代码时,首先要使用"DOCTYPE"进行声明,这就像给你的代码以身份,HTML4.0.1或者XHTML1.0或者HTML5都有严格版本或者过度版本,这些都能很好的支持我们写的代码.

MMORPG 中场景服务的抽象

- 2sin18 - 云风的 BLOG
MMORPG 中,场景信息同步是很基础而必不可少的服务. 这部分很值得抽象出来,专门做成一个通用的服务程序. 此服务无非提供的是,向有需求的对象,同步场景中每个实体的状态信息. 那么,我们分解需求,可以看到两点,一是提交状态,二是同步状态. 每条状态信息其实是由三部分构成,状态对象名(key)、状态值(value)、时间.

C++ 工程实践(9):数据抽象

- roc - 博客园-陈硕的 Blog
陈硕 (giantchen_AT_gmail). 陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/802325.aspx. 排版正常的版本: http://www.cnblogs.com/Solstice/category/287661.html.

抽象: 程序员必备的能力

- - CSDN博客架构设计推荐文章
抽象指的是从纷繁复杂的事物中提炼本质的过程,是一个具体到概念的过程, 例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果. 得出水果概念的过程,就是一个抽象的过程. 在软件业,抽象能力的重要性怎么说都不为过,因为软件开发是一个高度复杂的智力活动,程序员经常需要面对、处理异常复杂的业务和逻辑,如果你不具备强大的抽象能力,无法把具体变成概念,进而驾驭概念进行思考, 你就很难降低问题的复杂度,从而陷入泥潭,无法自拔.