java - 代码重构: Outsourcing substeps to helper classes

标签 java oop design-patterns refactoring code-cleanup

当一个类执行复杂而冗长的任务时,我通常会根据情况逐步重构它,如下所示。

版本 0

public class ComplicatedTaskDoer{

    public void doComplicatedTask(){
      // lots of complicated code
    }

}

版本 1:

将其分解为多个较小的子任务

public class ComplicatedTaskDoer{

    public void doComplicatedTask(){
      init();
      doSubStepA();
      doB();
      doC();
      wrapUp();
    }
}

版本 2:

如果足够复杂,请将子任务外包给辅助类。在这种情况下,我并没有真正编写接口(interface)代码。

public class ComplicatedTaskDoer{

    public void doComplicatedTask(){
      init();
      subsetpADoerClass.doA();
      classB.doB();
      classC.doC();
      wrapUp();
    }
}

版本 3:

如果我发现自己将来需要添加更多组件,并且输入和输出对象方面存在有效模式,我会执行以下操作。

public class ComplicatedTaskController{
    //injected
    List<SomethingHelperComponent> components;
    public void doComplicatedTask(){
      init();
      for(SomethingHelperComponent component : components){
           component.process(commonInput);
      }
      wrapUp();
    }   
}

我对版本 3 更好奇。我最终这样做了好几次。

第一季度) 是否存在类似且可能更有效的现有模式?我正在寻找的不是“责任链”,因为我更喜欢这些组件是独立的(开放讨论)。它看起来更像是模板方法模式的可配置变体。

第二季度) 我总是将主类命名为“SomethingController”,将辅助类命名为“SomethingHelper”或“SomethingComponent”。我最近意识到“控制者”具有误导性,而“帮助者”则没有提供任何信息。

获得一些关于正确命名这些类的想法真的很有帮助。你怎么命名它们?

第三季度) 您认为重构合理吗?

第四季度) 主观:在辅助方法中保留某些步骤并将某些步骤外包给辅助类是否可以?我通常避免对非公开方法进行单元测试。

Q5) 您是否认为辅助类(即没有代码到接口(interface))是一种代码味道?也许我什至可以将它们声明为内部类?

最佳答案

类的配置

这是合法的解决方案。有时会在 spring 中看到部分任务 实现一些接口(interface),通过 spring magic 你可以得到所有实现的列表

@Autowired
List<MyInterface> myParts;

设计模式名称

至于命名,我认为您可以将其视为责任链的特例。它可能不太准确,但很好地表达了您的意图。

类的命名

我会选择后缀.*算法

将主接口(interface)命名为DoSomethingComplicatedAlgorithmDoSomethingComplicatedAlgorithmStep。实现接口(interface)的类将被称为 WhatPartOfAlgorithmIsUsedHere

帮助类

如果它们可以让您避免代码重复,并且您没有比使用它们更好的域模型。另一方面,将其作为最后的选择。可能是小代码味道,但你的应用程序肯定不会被烧毁。

关于java - 代码重构: Outsourcing substeps to helper classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278021/

相关文章:

c# - 基类实现接口(interface)

c++ - 如果对象被删除,正在运行的方法会发生什么?

C#生产者/消费者

java - JdbcSQLException 超过 40 次测试

java - 在数组递归中计算从一个点到另一个点的路径,而不重复单元格

java - java中的列表遍历

java - Java中包和目录的区别

design-patterns - 如何在不过度设计的情况下开始在纸上设计我的程序?

javascript - 编写硬核 javascript 应用程序的成功途径是什么?

c# - 以安全的方式在企业应用程序中运行多个 Task<>