如何删除重复的代码(通常)?


10

使用OO语言(例如但不限于Java),如何根据重复发生的范围来修复重复的代码?我将从(例如)开始

  • 在同一个类(范围)中执行提取方法重构(修复)
  • 在相同层次结构的类(范围)中执行提取方法和上拉(修复)
  • ...

看看一个例子,在此用相同的类实现DRY原则(不要重复自己):geekswithblogs.net/chrisfalter/archive/2008/03/07/...
NoChance

SO的原始问题(stackoverflow.com/questions/7380946/…)已关闭。所以我把它移到了这里。
彼得·科夫勒

Answers:


8

最近,我在Bob叔叔的“清洁代码”中找到了一个很好的答案,我想分享一下。他区分了三种重复类型

相同代码段应替换为单个方法。因此,解决方法是提取方法并将其委托给常见行为。

  • 以相同的方法执行提取局部变量并重用它。
  • 在同一个类中执行Extract Method重构。
  • 在相同层次结构的类中提取方法并将其上拉。可以创建一个层次结构以找到方法的位置。
  • 在单独的层次结构的类中,使用委派给新对象。
  • 如果方法不需要任何封闭状态,则可以应用“ lib”模式(这是静态方法的容器,通常称为SthUtilSthLib)。

的情况下switch/case,并if/else总是测试的同组的条件

  • 这些应替换为多态性。

实现类似算法的模块。这些是最难找到的,因为没有克隆检测器可以找到它们。

  • 随着范围的扩大,将使用设计模式。模板方法设计模式可能适用于类层次结构内的算法。
  • 策略设计模式可能适用于在不同地方使用的任何算法。

当处理不同版本的库时,也是Oded提到的有效观点

  • 合并在一个版本上。立面设计模式可能会有所帮助。

最后,回答我的问题的最好的一句话是通过stimms:

OO语言中使用的代码重用方法是对象。


5

通常-将重复的代码合并到一个地方,并确保原始重复站点正在调用合并的地方。

在您的示例中,在一个类中,这将是提取的方法,而在一组类中,这将是基类中的上拉方法。

在复制粘贴代码中,这将删除重复项,并确保任何用户现在都使用单个副本(无论级别如何)。

当处理不同版本的库时,请合并为单个版本(如果可能)。


如果它是基类,那不是“下拉”方法吗?我总是将基类想象成在派生类之下。
戴夫·奈

重构书中的专有名称是“ pull up”。
彼得·科夫勒

1

我猜这是一个开放式的问题,但它也取决于代码的状态。我的意思是您可以根据上下文容忍重复的代码。三分法则对此事有好处。

三人制 第一次做某事时,就要做。第二次执行类似的操作时,您会畏缩于重复,但是无论如何您都会执行重复的操作。第三次执行类似的操作时,将进行重构。

虽然这是非常值得商榷的,这个岗位也考虑在那里你会容忍重复代码的情况。


1
+1关于“三个规则”。我总是对它的广泛应用感到惊讶。
andy mango

1
这没有回答如何问题。
Jan Doggen '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.