Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构和避免代码重复_Java_Refactoring_Code Duplication - Fatal编程技术网

Java 重构和避免代码重复

Java 重构和避免代码重复,java,refactoring,code-duplication,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 make

我遇到了一个新问题。基本上,其他人已经编写了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()完全满足我的需要,但我需要在另一个类中使用它。下面是问题:


  • 类A做的事情比我写的要多得多,所以我不能创建它的对象。这是毫无意义的
  • 我已尝试复制类B的build()方法。但是,build()使用其他方法。所以我也必须复制它们,当然它们调用其他方法,并使用在其他方法中声明的实例变量。基本上,我必须复制200行代码

  • 我猜这个问题实际上有一个名称,但我不知道它叫什么,因此只搜索了一些基本术语。要在类B中使用build(),我可以做些什么?

    总是分小步进行重构。e、 g.把属于同一类的东西放在一起,可能需要另一个C类,它包含makeItem、makeAnotherItem和相应的实例变量。没有一般的答案,这取决于您的代码到底是什么样子的

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

    请参阅Martin Fowler的重构方法

    也看到

    首先如果类A中的build()使用的是类A的其他私有方法,那么闻起来您需要类A本身

    一个选项是创建包含常用方法(包括build方法)的抽象类,并通过类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中的类型

    将其
    公开
    ,删除不必要的方法,创建
    A
    的实例并使用
    build()
    。或者,如果状态不重要,则将其设置为一个
    静态
    类,并直接使用
    build()
    。第一种方法:在单独的抽象类AbstractA中提取公共代码,使a和B扩展AbstractA。第二种方法:在具体的C类中提取公共代码,并在a和B中使用C作为代理。可能还有其他解决方案,但如果没有具体的代码,就不可能提供更多帮助。“a类比我写的东西做得多得多”-在下兔子洞之前确保这是有意义的。除此之外,您可能会看到一个
    Builder
    模式。将代码减少到只剩下要“复制”的代码的程度。将此设置为类,现在您可以创建另一个类并使其扩展
    a
    ,您可以在此处包含新函数。请添加更多信息。到目前为止给出的大多数答案在许多情况下都是有意义的,但也可能是误导性的。只要我们没有更多关于A和B之间关系的信息,我们只能推测。