代码抽象的三原则

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

转载于:https://www.cnblogs.com/huanjianlin/archive/2013/03/29/2988244.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对图像高频信号和低频信号的理解

今天开始讲图像了,讲了很多在频域处理的方法,回来复习一下图像的频域。 一 、关于图像高频和低频 1.1 对图像高频信号和低频信号的理解 图像中的低频信号和高频信号也叫做低频分量和高频分量。 简单一点说,图像中的高频分量,…

关于开源中国手机App的说明

随着移动互联网大潮的快速发展,开源中国社区作为国内大型IT技术人员社区也推出了手机移动客户端,覆盖iOS,Android以及Windows Phone这三个手机平台。主要为了能让我们的用户能随时随地的与开源中国社区的用户进行交流与互动。我们需要App实现…

uva 11174(排列组合+搜索)

依然是liurujia计数练习题。依然是自己想没想出来,在MOD是素数的情况下除以x即为乘x的逆。这个真心以前没听过,用了这个方法后处理就变得十分巧妙。 整个程序步骤还是很清晰的,先上来算阶乘与逆(求数的逆还是有点没理解透&#xf…

将Source Insight的代码拷贝到word文档的方法

1、用Source Insight打开文件后,File->Print; 2、在 常规->选择打印机中,选择“Adobe PDF”(或者其他pdf打印机); 3、点确定,输出一个pdf文件了,然后去pdf文件里面复制代码&…

Oracle 学习笔记

2019_6_27日 星期四 第一章 oracle从入门到精通Laarry Ellison: 拉里.埃里森Bruce Scott: Tiger PointBase(WebLogic软件产品中附赠的数据库产品) 1.1 oracle安装oracle从实际的开发来讲,oracle11g是使用较多的,oracle的开发主要分为两类:.数…

引导滤波的opencv实现以及解释

参考: https://blog.csdn.net/qq_36006553/article/details/78594205

S5PV210的地址映射简介

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 S5PV210属于ARM Cortex-A8架构,是32位的CPU,有32根地址线和32根数据线。 这表明该CPU的寻址空间为4G,地址映射关系见下述。 S5PV210的地址映射 S5PV210的地址映射…

本杰明 富兰克林 道德13准则

富兰克林认为,好的习惯必须加以培养,坏的习惯必须打破。为了克服缺点,使自己少犯错误,他制定了13条道德准则。他说:“我打算获得这13种美德,并养成习惯。为了不致分散精力,我不指望一下子全做到…

树莓派(Raspberry Pi):完美的家用服务器

出处:http://linux.cn/thread/11884/1/1/ 树莓派(Raspberry Pi):完美的家用服务器 自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但…

无需删除D盘文件,将D盘空间分给C盘

做深度学习或机器学习的小伙伴,不知不觉就发现自己电脑C盘空间不够用了,但是D盘空间看着又很充裕,那么问题来了,怎么将D盘空间分给C盘呢,网上搜索了一圈,发现很多方法需要删除D盘文件才能将空间分享给C盘&a…

[NOI2019]回家路线

LOJ3156 题面就不放了 , 放一下数据范围 . 看到 \(n<2000,m<4000\) 就想到直接 \(dfs\) 到底 , 居然就过了前 \(4\)个 样例 , 最后一个要 \(2s\) . 后来写了 \(AB0\) 的 \(5\) 分 , 我知道写的是错的 , 还是交了以下这份代码 . ( LOJ 数据应该是官方数据 ) 得分 \(70\) .…

重定位——重定位的简介与操作(涉及位置无关码)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a;位置无关码、位置有关码 - biaohc - 博客园 一、链接地址与运行地址 1、链接地址 链接地址&#xff0c;是指程序员通过Makefile中“ -Ttext xxx ”或者在链接脚本中指定的地址…

前端手册

一直觉得前端开发缺个手册&#xff0c;这是个体力活。不过总得有人来干。 今天闲来无事&#xff0c;把一些工具(online和client的)、常用网址、以及经验总结等罗列出来和大家分享下。这个标题起地大了点&#xff0c;肯定会有很多地方没列到&#xff0c;包括类目的分法也可能考虑…

如何随机选取1000个关键字

Q:给定一个数据流&#xff0c;其中包含无穷尽的搜索关键字&#xff08;比如&#xff0c;人们在谷歌搜索时不断输入的关键字&#xff09;。如何才能从这个无穷尽的流中随机的选取1000个关键字&#xff1f; A:首先定义长度为1000的数组&#xff0c;将前1000个关键字放置到数组中。…

重定位——链接脚本的简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 链接脚本基本语法_Nerazzur的博客-CSDN博客_链接脚本语法&#xff08;推荐&#xff09; 链接脚本语法_ABCamus的博客-CSDN博客_链接脚本语法 链接地址、运行地址、加载地址、存储地址_嵌入…

OpenCV学习(27) 直方图(4)

我们可以利用OpenCV的直方图&#xff0c;backproject直方图和meanshift算法来跟踪物体。下面通过简单的例子来说明如何实现跟踪算法&#xff0c;我们有两幅狒狒的图片&#xff0c;如下图所示&#xff1a;我们首先在左图中框选狒狒的脸&#xff0c;计算出框选区域的色度(HSV空间…

IIS启用页面Gzip压缩实现说明

HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。 HTTP压缩采用通用的压缩算法如gzip等压缩HTML、JavaScript或CSS文件。 压缩的最大好处就是降低了网络传输的数据量&#xff0c;从而提高客户端浏览器的访问速度。 当然&#xff0c;同时也会增加一点点服务器的负担。G…

MySQL源码编译与初始化

MySQL源码编译与初始化 链接&#xff1a;https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码&#xff1a;ekpy 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 1.MySQL简介 1.1数据库有很多种类&#xff1a; 关系型数据库--->MySQL Oracle非关系型数据库…

uboot中的虚拟地址映射

1、DRAM有效范围 &#xff08;1&#xff09;DMC0上允许的地址范围是20000000-3FFFFFFF&#xff08;一共是512MB&#xff09;&#xff0c;而X210开发板实际只接了256MB物理内存&#xff0c;SoC允许我们给这256MB挑选地址范围。在裸机中DMC0的地址范围是0x20000000-0x2FFFFFFF&am…

.net remoting 技术

Remoting编辑目 录 1简介 2主要元素 3两种通道 4激活方式 5对象定义 6服务器 7客户 8基础补充 9小结 1简介 什么是Remoting&#xff0c;简而言之&#xff0c;我们可以将其看作是一种分布式处理方式 。从微软的产品角度来看&#xff0c;可以说Remoting就是DCOM的一种升级&#x…