阅读更多

13顶
1踩

研发管理

转载新闻 代码的抽象三原则

2013-01-31 18:02 by 副主编 WnouM 评论(8) 有5278人浏览
本文转载自 阮一峰的网络日志,原文内容如下。

软件开发是"抽象化"原则(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, 4, _, _, _。
  • 防止过度冗余。如果一种功能同时有多个实现,管理起来非常麻烦,修改的时候需要修改多处。在实际工作中,重复实现最多可以容忍出现一次,再多就无法接受了。
综上所述,"三次原则"是DRY原则和YAGNI原则的折衷,是代码冗余和开发成本的平衡点,值得我们在"抽象化"时遵循。
  • 大小: 37.9 KB
  • 大小: 14.4 KB
  • 大小: 26 KB
  • 大小: 21.1 KB
13
1
评论 共 8 条 请登录后发表评论
8 楼 chinaagan 2013-02-01 19:28
《计算机程序的构造和解释》这本书挺好,构造和选择是核心,如果存在状态,那就可能需要操作这些状态,其他的在其之上演化。
7 楼 carlzhao531 2013-02-01 16:30
这篇好,支持起
6 楼 allenny 2013-02-01 12:42
这是我多年编程才体会出来的经验教训,没想到....要是以前就看到此文就好了
5 楼 HAIyun151 2013-02-01 12:02
4 楼 bbbbb1202 2013-02-01 08:39
学习了,支持 
3 楼 xieye 2013-02-01 08:37
实际开发工程中,
时间宽裕就抽象,哪怕只出现两次。
时间紧分情况,如果参数等完全一致,那么抽象也可以,如果参数有差异,哪怕次数再多,先拷贝改改代码再说,有时间再去抽象。
2 楼 lsjinpeng 2013-01-31 18:20
好文章~~~  
1 楼 sanshizi 2013-01-31 18:15
不错, 支持 

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 代码的抽象三原则-阿沐1

    第二次又 第三次出现的时候,你才着手"抽象化",写 第三个元素出现后,规律就变得较清晰了:

  • 代码抽象化的三个原则

    在编写代码的过程中,有时候同一个功能,会在其他地方也用到,比如日期格式化。 我们把日期格式化这个功能封装...代码的抽象化,有三个原则: 参考文章:http://www.ruanyifeng.com/blog/2013/01/abstraction_pri...

  • 浅谈C# 抽象类与开闭原则

    主要介绍了C# 抽象类与开闭原则的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

  • SLAP原则——单一抽象层次原则

    中文:单一抽象层次原则 是什么 在编写代码时,我们要将高级别的抽象化概念和低级别抽象化概念分离。 在分离时不能只有高低两层,我们要根据功能的复杂程度对抽象化概念进行分离,然后统一各层的抽象级别。 我们...

  • 抽象工厂模式代码

    自己本人编写的该代码针对清华大学设计模式103页课后作业实现了使用抽象工厂模式对不同计算机设备进行生产,符合对类的修改关闭,扩展开放的原则。

  • 面向抽象原则——Java程序设计基础

    一、抽象类和接口 当设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量 abstract class A { public abstract int add...

  • 图解编程(二)代码的抽象三原则

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

  • 代码该怎么写——设计原则

    代码该怎么写——设计原则 初学者学会编程语言后开始写代码,当我们实现一个功能后会有成就感,但是看了别人写的代码又大感困惑,他为什么把代码写得那么复杂?明明一个简单的功能,为什么要这样做? 还有人即使学会...

  • 代码抽象

    代码抽象的三个境界软件开发时,我们总是既想要使用别人写好的代码,又希望自己写的代码尽可能的重用。想要这两个目标都实现,离不开抽象化.不要重复自己软件工程名著《The Pragmatic Programmer》首先提出这个原则...

  • 代码的抽象化原则:当某个功能第三次出现时,才进行“抽象化“

    前言 开发软件的时候,一方面,我们总是希望使用别人... Bailey的一篇文章,谈到"抽象化"应该遵循的三个原则。 正文 所谓"抽象化",就是指从具体问题中,提取出具有共性的模式,再使用通用的解决方法加以处理。

  • java代码优化六大原则

    单一职责代码优化第一步,单一职责原则 (Single Responsibility Principle)。对于一个java类,应该仅有一个引起它变化的原因,也就是说,一个类中,应该是一组相关性很高的函数、数据的封装。但是这个原则的界限...

  • Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

    面向抽象原则是面向对象四大基本原则的第一条,其重要性不言而喻,面向抽象原则分为抽象类、接口以及面向抽象编程,在之前的内容中我们详细介绍了抽象类与接口,并对二者进行了对比,在本文中我们将详细介绍什么是...

  • Java抽象工厂模式(附实例代码)每天一学设计模式

    抽象工厂模式:提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。 (1)AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。 (2)ConcreateFactory...

  • 代码设计原则

    2 依赖倒置原则 :高层模块不应该依赖底层模块,二者都应该依赖其抽象。 抽象不应该依赖细节:细节应该依赖抽象。 针对接口编程,不要针对实现编程。 总结: 针对接口编程,不要针对实现编程。高层模块与底层模块依赖...

  • 代码编写原则

    在程序设计领域,SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是指面向对象编程和面向对象设计的五个基本原则。

  • 【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )

    一、依赖倒置原则简介、 二、面向实现编程代码示例 ( 反面示例 )、 ...三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )、 1、顾客类、 2、商品接口、 3、冰箱商品、 4、电视商品、 5、测试类、

  • 代码设计 六大原则

    单一职责原则 Single Responsibility Principle定义:一个类或者一个接口,最好只负责一项职责。问题由来:类T负责两个不同的职责P1和P2。由于职责P1需要发生改变而需要修改T类,就有可能导致原来运行正常的职责P2...

  • 基于springboot教育资源共享平台源码数据库文档.zip

    基于springboot教育资源共享平台源码数据库文档.zip

  • 视频笔记linux开发篇

    linux开发篇,配套视频:https://www.bilibili.com/list/474327672?sid=4493702&spm_id_from=333.999.0.0&desc=1

Global site tag (gtag.js) - Google Analytics