大量的if else重构

时间:2017-10-20 08:31:11

标签: java refactoring imperative-programming

我的代码中有一个if / else语句 我正在考虑重构它。我已经搜索了很多类似的问题。像this。 最好的答案说,责任链模式是一个不错的选择。但下面是我的代码的一部分。如果我使用CoR模式,我将创建超过70个java类并创建一个ArrayList来保留这些类的实例。它将消耗更多的内存。我也学习了状态模式。还需要创建很多类。

只是想知道有更优雅的方法来解决它吗?

if (urlContent.contains(YLWFX)) {
  urlContent = urlContent.replace(YLWFX + ":", "");
  if (urlContent.startsWith(TRANSMIT)) {
    mProcess.onTransmit(activity, url);
  } else if (urlContent.startsWith(TAKEORDER)) {
    mProcess.onTakeOrder(activity, url);
  } else if (urlContent.startsWith(GOODS)) {
    if (urlContent.contains(GOODSMANAGER_MMZL)) {
      mProcess.onEnterpriseShopManage(activity, url);
    } else {
      mProcess.onGoods(activity, url);
    }
  } else if (urlContent.startsWith(SUPPLIER)) {
    mProcess.onSupplier(activity, url);
  } else if (urlContent.startsWith(POSTS)) {
    mProcess.onPosts(activity, url);

  } else if (urlContent.startsWith(TEAM)) {

    if (urlContent.contains(TEAM_LIST)) {
      mProcess.onTeamList(activity);
    } else if (urlContent.contains(TEAMINDEX)) {
      mProcess.onTeamIndex(activity, url);
    } else if (urlContent.contains(TEAMINFO)) {
      mProcess.onTeamInfo(activity, url);
    } else if (urlContent.contains(TEAMMEMBER_INFO)) {
      mProcess.onTeamMemberInfo(activity, url);
    } else {
      mProcess.onTeam(activity, url);
    }
  }
}

3 个答案:

答案 0 :(得分:2)

如果您不想沿着CoR路径走下去,我建议使用switch语句。它有助于在不改变逻辑的情况下使代码更具可读性。所以它看起来像这样:(这显然只是伪代码)

if(contains){
    //you will need to look at how to add this to a switch properly,
    //just giving you an idea of how I'd look at it.
    switch(urlContent.startswith) {
        case TRANSMIT:
            mProcess.onTransmit(activity, url);
        case TAKEORDER:
            mProcess.onTakeOrder(activity, url);
        case GOODS:
            if (urlContent.contains(GOODSMANAGER_MMZL)) {
                mProcess.onEnterpriseShopManage(activity, url);
            } else {
                mProcess.onGoods(activity, url);
            }
        case SUPPLIER:
            mProcess.onSupplier(activity, url);
        case POSTS:
            mProcess.onPosts(activity, url);
        case TEAM:
            if (urlContent.contains(TEAM_LIST)) {
                mProcess.onTeamList(activity);
            } else if (urlContent.contains(TEAMINDEX)) {
                mProcess.onTeamIndex(activity, url);
            } else if (urlContent.contains(TEAMINFO)) {
                mProcess.onTeamInfo(activity, url);
            } else if (urlContent.contains(TEAMMEMBER_INFO)) {
                mProcess.onTeamMemberInfo(activity, url);
            } else {
                mProcess.onTeam(activity, url);
            }
    }
}

你甚至可以在剩余的第二批余地进行另一次开关,但我会把它留作练习;)这里也有一些阅读:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

希望这有助于您入门。让我知道它是怎么回事!

答案 1 :(得分:1)

你应该尝试考虑不同的条件替代方案,如Switch结构

switch (/*Variable*/)
{
  case /*Argument*/:
    /*Action*/;
    break;        
  default:
    /*Action*/;             
}

或三元运算符

int result = testCondition ? value1 : value2

答案 2 :(得分:0)

首先,许多if-else的问题并不完全是多少,而是它们有多深。请参阅here,了解如何衡量它以及为什么具有高深度嵌套if-else链的程序是不合需要的。

其次,if-else是命令式语言最重要的语句,如java。因此,将它们放在单个方法中或将它们分散在类层次结构中,就像在CoR中一样,这只是使用程序范例的自然方式。

嗯,有人可以说:"但是这种代码可能有问题,有很多if-else"。在这样的情况下,我猜问题本身并不是if-else的大量使用,而是相反,也许该方法有很多横切职责。设计模式的更多一般列表称为"掌握设计模式"其中一人说:

  

"高凝聚力是一种试图保持物体的评价模式   适当集中,易于管理和易于理解。"

您可以在开创性book of Craig Larman中找到有关Grasp Design Pattern的更多信息。

所以,如果方法中的代码有很多不同的事情要做(格式化,重写,路由,验证等),那么他们就不会像嵌套的胖代码那样对它进行编码。 if-else语句。在这种情况下,解决方案是在一组有限的其他方法中,在同一个类中,或者像CoR模式中提出的那样,在其他几个类中打破方法。