大量if else重构

large amount of if else refactor

我的代码中有一个if/else语句 和我想重构it.I已经搜索了很多类似的Questions.likethis。 最佳答案说责任链模式很好 choice.But 下面是我的代码的一部分。如果我使用 CoR 模式,我将创建超过 70 个 java 类 并创建一个 ArrayList 来保留那些 classes.It 的实例将消耗更多内存。我还了解到状态 pattern.Also 需要创建这么多 类。

只想知道有没有更优雅的方法解决?

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);
    }
  }
}

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

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

或三元运算符

int result = testCondition ? value1 : value2

如果您不想走 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);
            }
    }
}

您甚至可以在剩下的第二批 if else 上再做一次切换,但我会把它留作练习;) 这里也有一些阅读材料:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

希望这有助于您入门。让我知道进展如何!

首先,很多 if-else 的问题不在于它们有多少,而在于它们有多深。请参阅 here 了解如何衡量它以及为什么不希望使用高深度嵌套 if-else 链的程序。

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

好吧,有人会说:"but maybe is something wrong with this kind of code, there are lots of if-else"。在这种情况下,我猜问题本身不是 if-else 的大量使用,而是该方法可能有很多横切职责。有更通用的设计模式列表,称为 "Grasp Design Pattern",其中之一说:

"High cohesion is an evaluative pattern that attempts to keep objects appropriately focused, manageable and understandable."

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

所以,如果一个方法中的代码有很多不同的事情要做(格式化、重写、路由、验证等),他们就没有其他方法可以像嵌套或不嵌套的胖序列一样编码它if-else 语句。在那种情况下,解决方案是在相同的 class 内或在 CoR 模式中提出的其他几个 classes.

中打破其他方法的有限集合中的方法。