DRY

DRY(Don‘t Repeat Yourself )原则

凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑。我们通过提取方法,提取抽象类等等措施来达到这一目的。我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要使用。。。“,什么算是公用(重复)的代码?是不是公用(重复)的代码就要放到一个叫shared的地方?

为什么说重复的代码和逻辑会带来问题呢?

你从一个类中复制了一段代码到另一个类中,但是这段代码足够的稳定,百年不变,这样的重复会带来问题吗?

也许不会。

如果这段代码需要时不时的修改,那么你就要花时间去修改所有包含这段逻辑的代码,这样无形中增加了维护成本和发生bug的几率。这时候就要着手消除和抽取重复的代码。

对于消除重复的代码有一个三次法则(rule of three):

1.第一次先写了一段代码。

2.第二次在另一个地方写了一段相同的代码,你已经有消除和提取重复代码的冲动了。

3.再次在另一个地方写了同样的代码,你已忍无可忍,现在可以考虑提取和消除重复代码了。

这一法则也适应于对重构时机的把握,过早的重构可能会引入新的问题,三次法则给了你一个重构依据。当然,随着你经验的增长,你可能在第二阶段已经能非常有信心的预料到问题所在。

什么样的代码算是重复的?

DRY is about Knowledge一文中给了这样一个实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php // example 1

final class Basket

{

    private $products;

    public function addProduct($product)

    {

        if (3 == count($this->products)) {

            throw new Exception("Max 3 products allowed");

        }

        $this->products[] = $product;

    }

}

final class Shipment

{

    private $products;

    public function addProduct($product)

    {

        if (3 == count($this->products)) {

            throw new Exception("Max 3 products allowed");

        }

        $this->products[] = $product;

    }

}

这两段代码中都有一个相同的方法addProduct,这两段代码算是重复的吗?他们违反DRY原则吗?

作为一个领域驱动的实践者,我们可以从业务的角度来分析这一代码,第一段代码似乎是一个用户在购物,但是我们最多允许用户购买三件商品。在第二段代码的场景中,我们想要给所有用户提供相同的机会并限制用户最大购买数量。

这一分析说明了这两段代码所描述的领域(Domain)、业务(Business)、知识(Knowledge)、边界(Boundary)、职责(Resposibility)不同,这两段代码之所以相同完全属于巧合。对这样的代码进行提取和消除重复是错误的。

我之前待的team维护了一个北美的项目,如果让我指出这一项目最大的设计问题,就是将一些本不应该提取的代码(各种Model、数据访问)抽取到了一个叫做Shared的工程中,这一举动导致开发人员在后期不敢再修改Shared工程中的任何代码,以至于开发人员宁可重新添加一个方法也不敢修改之前的代码。

DRY看似初级人员都要掌握的能力,如果使用不当会造成非常严重的后果,正是因为我维护了这样的项目才有感而发,希望大家引以为戒,当然大家若是有不同的看法可以一起讨论。

时间: 2024-12-11 16:44:53

DRY的相关文章

DRY(Don&#39;t Repeat Yourself )原则

凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类似这样的话:”把这些公用的类放到shared项目去,别的项目还要使用...“,什么算是公用(重复)的代码?是不是公用(重复)的代码就要放到一个叫shared的地方? 为什么说重复的代码和逻辑会带来问题呢? 你从一个类中复制了一段代码到另一个类中,但是这段代码足够的稳定,百年不变,这样的重复会带来问题吗? 也许不会. 如果这段代码需要时不时的修改,那么你就要花时间

Gradle Goodness: Check Task Dependencies With a Dry Run

We can run a Gradle build without any of the task actions being executed. This is a so-called dry run of our build. We can use the dry run of a build to see if the task dependencies we have defined or are defined in a plugin are defined properly. Bec

DRY 原则

DRY——Don't Repeat Yourself Principle,直译为“不要重复自己”原则^_^ DRY简而言之,就是不要写重复的代码.原则本身很简单,但是,对于OOAD来说,有着非常重大的意义. DRY利用的方法就是抽象:把共同的事物抽象出来,把代码抽取到一个地方去.这样就可以避免写重复的代码. 举一个DRY的典型例子,如果在一个类构造的时候,需要进行成员的初始化,在进行了某些操作以后,同样要进行初始化,那么就可以把“初始化”抽象出来,做成一个方法Initial(),在构造和需要用到

DRY原则

DRY--Don't Repeat Yourself Principle,直译为"不要重复自己"原则 DRY简而言之,就是不要写重复的代码.原则本身很简单,但是,对于OOAD(面向对象的分析和设计)来说,有着非常重大的意义. DRY利用的方法就是抽象:把共同的事物抽象出来,把代码抽取到一个地方去.这样就可以避免写重复的代码. 举一个DRY的典型例子,如果在一个类构造的时候,需要进行成员的初始化,在进行了某些操作以后,同样要进行初始化,那么就可以把"初始化"抽象出来,

Atitit 深入理解软件的本质 attilax总结 软件三原则&quot;三次原则&quot;是DRY原则和YAGNI原则的折

Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折 1.1.1. 软件的本质:抽象  1 1.2. 软件开发的过程就是不断抽象的过程 1)机器语言--> 汇编语言-->高级语言,这就是一个不断抽象的过程,1 1.3. 代码的抽象三原则_软件工程_酷勤网.htm1 1.4. "软件是存储.通信.UI(user interface)和业务逻辑的紧密结合体2 1.5. 在软件的生命周期中,较稳定的是存储和通信,最

关于DRY原则

软件工程,模式,语言,设计思想发展到今天,说白了,所有的技巧,思想,原则归根结底都是为了这个DRY  从机器语言开始: 为了DRY,出现了汇编符号来代表指令,使开发人员不用“重复翻阅指令手册” 为了DRY,出现了宏汇编,来使开发人员不用“重复编写同一个过程” 为了DRY,出现了C,Fortran等,使开发人员不用“重复考虑内存段的布局” 为了DRY,出现了面向对象的语言,使开发人员不用“重复描述同一个概念” 为了DRY,出现了设计模式,使开发人员不用“重复思考同一类问题的处理模式” 为了DRY,

DRY(1)--读后感

因为要对项目做重构, 所以, 读了 vczh 的这篇 <<靠谱的代码和DRY >> 和 <<The Pragmatic Programmer>> 的 Item7, 8. 下面是部分摘录: 不能repeat的其实是信息,不是代码.然而, 分析什么是信息又不是一件简单的事情.所以, 只能不断地修改. 目的: 保证代码质量不断提高. 换句话说, 不断地重构.而重构, 又需要做TDD. 目的: 保证代码质量. 特别的, 对GUI做TDD, 又需要MVC. 目的: 方

You Can Use Bags To Extend The Life Of Dry Foods

Weekly golfers will find a bag that gives them enough space to do a lot of tees, balls, sticks, and whatever he deems necessary for the golf course. Perhaps styles that offer one or two extra side pockets will be what you need. Another thing to consi

程序设计中的dry原则

DRY:dont repeat yourself 假设一个逻辑(代码块)会重复两次或者以上,应该写成函数被调用 为什么呢,实际上,我们处处可见重复性的代码.这除了增加工作量之外,还会增加维护难度. dry原则不仅仅是炫技.它的代码更容易被维护.假设某个逻辑需在多个地方被重复编写,当你需要更改此逻辑时,也意味着你需要在多个地点更改代码.想想这个问题吧:要改那几处来着???2处需要同步的代码比一处代码工作量不仅仅两倍好吗,除非你记忆力特别好,能够找到你冬天埋下的所有松果.但很可能遗漏,这增加了代码本