重构并避免代码重复

时间:2016-02-16 08:01:29

标签: java refactoring code-duplication

我遇到了一个对我来说很新的问题。基本上,其他人已经写了A类。重要的部分看起来像这样

class A{

 // some instance variables

 public A(){
  // Calls methods
  build();
  // Calls more methods
 }

 private build(){
  item = makeItem();
  anotherItem = makeAnotherItem();
  // more code
 }

 private makeItem(){
  // Does some things and calls updateItem()
 }

 private updateItem(){
  // Does some things with instance variables of class A
  // and calls yet another method in class A.
 }

我的问题是build()完全符合我的需要,但我需要在另一个类中。现在有以下问题:

  1. A班比我写的东西做得更多,所以我无法创造它的对象。这将毫无意义。
  2. 我尝试为我的B类复制build()方法。但是,build()使用其他方法。所以我也必须复制它们,当然它们调用其他方法并使用在其他一些方法中声明的实例变量。基本上,我必须复制200行代码。
  3. 我猜这个问题实际上有一个名字,但我不知道它叫什么,因此只搜索了一些基本术语。如何在我的B类中使用build()?

3 个答案:

答案 0 :(得分:2)

您在两个类中使用构建方法的代码但是继承没有用吗?然后,您可以使用组合重用构建方法的代码。 (提示Favor Composition over Inheritance)创建一个新的类C,其中包含构建方法。 C类由A类和B类通过组合使用。他们委托给C类的构建方法。

参见Martin Fowler的重构方法。

https://sourcemaking.com/refactoring/smells/duplicate-code 也看到了 https://sourcemaking.com/refactoring/replace-inheritance-with-delegation

答案 1 :(得分:0)

始终以小步骤重构。例如将所有东西放在一起,或许对另一个包含makeItem,makeAnotherItem和相应实例变量的类C有必要。没有一般性答案,这取决于您的代码的完整外观

答案 2 :(得分:0)

首先如果A类中的build()使用A的其他私有方法,那就好像你需要A类本身。

一个选项可能是创建包含公共方法(包括构建方法)的抽象类,并通过类A和B扩展此抽象类,这样就不会有重复的代码

如果由于某种原因你不想触摸A类,我建议你创建一个界面,如:

public interface Builder{
    void build()
}

然后由类B实现此接口,并且还扩展类A,以便您实现构建方法。

public class B extends A implements Builder{
    // build() of class A will be used
    // do other staff
}

这样做完全没有对A类进行任何更改(如果它是遗留代码或其他内容,则可能需要这样做)+ Builder可以用作要公开的API中的类型。