【问题标题】:What design pattern to use for one big method calling many private methods一个调用多个私有方法的大方法使用什么设计模式
【发布时间】:2010-06-13 02:10:15
【问题描述】:

我有一个类,它有一个调用大量私有方法的大方法。我想我想将这些私有方法提取到他们自己的类中,因为它们包含业务逻辑,我认为它们应该是公共的,因此可以进行单元测试。

以下是代码示例:

public void handleRow(Object arg0) {
    if (continueRunning){
        hashData=(HashMap<String, Object>)arg0;
        Long stdReportId = null;
        Date effDate=null;
        if (stdReportIds!=null){
            stdReportId = stdReportIds[index];
        }   
        if (effDates!=null){
            effDate = effDates[index];
        }
        initAndPutPriceBrackets(hashData, stdReportId, effDate);
        putBrand(hashData,stdReportId,formHandlerFor==0?true:useLiveForFirst);
        putMultiLangDescriptions(hashData,stdReportId);
        index++;
        if (stdReportIds!=null && stdReportIds[0].equals(stdReportIds[1])){
            continueRunning=false;
        }       
        if (formHandlerFor==REPORTS){
            putBeginDate(hashData,effDate,custId);
        }
        //handle logic that is related to pricemaps.
        lstOfData.add(hashData);
    }
}   

我应该使用什么设计模式来解决这个问题?

【问题讨论】:

  • 总是让自己有答案是“无”的可能性。设计模式本身并不是设计,您不能只为遇到的每个设计问题从菜单中选择一个。
  • 在添加类之前,你应该问自己,“这个类的实例将代表什么?”如果答案是它只是一个代码容器,那么你只是将类用作命名空间。

标签: design-patterns


【解决方案1】:

状态模式很好地涵盖了这种情况。

详情here

这是C# example

享受吧!

【讨论】:

    【解决方案2】:

    我只是将相关的方法和状态(字段)捆绑到具有公共方法的类中,并将它们作为服务注入到宿主类中。

    状态模式就像 Doug 发布的那样,描述了这种划分。

    在拆分行为时还要确保避免循环依赖。如果仓促完成,这很容易发生。

    通常将类行为拆分为多个类以供重用和定制。如果唯一的目的是提高可测试性,那么将方法公开为受保护或公开是一个更简单的选择。

    【讨论】:

      【解决方案3】:

      您所描述的戏剧性重构完全适合您的单元测试工具是一个非常非常糟糕的主意。

      不要让工具中的缺陷来推动您的设计。

      【讨论】:

      • 使代码可测试(Java 的 JUnit 可测试)被许多人认为是好的设计。您认为什么是好的设计?
      • 可测试性是代码最需要的属性,因为它可以让它进化(因为你可以重构它)到最能满足你需求的任何形式。另见misko.hevery.com/code-reviewers-guide
      • 是的,良好的测试是良好开发的关键组成部分。如果用户想要测试私有方法,他只需要让 unit_test() 函数(或类)成为朋友。没有必要仅仅为了安抚特定测试工具中的缺陷而重构对象模型或重新实现代码。如果他的测试工具不能处理设计良好的代码,他应该考虑购买新的测试工具。 :)
      【解决方案4】:

      您对单元测试的担忧可以通过将方法设置为“受保护”并将测试类与原始源代码放在同一个包中来解决。

      【讨论】:

      • 这是我正在考虑的一个角度,但我也听说对私有方法进行单元测试是一个类渴望退出的标志。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多