大量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.
中打破其他方法的有限集合中的方法。
我的代码中有一个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.
中打破其他方法的有限集合中的方法。