阅读更多

13顶
1踩

研发管理

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

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

软件开发是"抽象化"原则(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...

  • 基于Android 7.0与Android Studio的安卓学习.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

  • node-v4.6.1-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics