任何人都可以请帮助优化这段代码,以减少如果没有其他语句开关的情况下不可能在这里,因为声纳显示出重大缺陷和复杂性。
if (status != null) {
if (MDOConstants.DOCREATED.equalsIgnoreCase(status)) {
return null;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.MDO_Stored.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.GCSS_SUBMITTED.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.PENDING_TASKS.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.ISSUANCE_OK.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.GCSS_REQUESTED.equalsIgnoreCase(subStatus)) {
return MDOConstants.ISSUANCE_REQUESTED;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.GCSS_ISSUED.equalsIgnoreCase(subStatus)) {
return MDOConstants.ISSUANCE_REQUESTED;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.DEADLINE_PASSED.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
&& MDOConstants.DEADLINE_PASSED_OR_NEW_PICKUPDATE_NEEDED.equalsIgnoreCase(subStatus)) {
return MDOConstants.INPROGRESS;
} else if (MDOConstants.MNLHNDLD.equalsIgnoreCase(status)
&& MDOConstants.MNLHNDLD_TECHNICAL.equalsIgnoreCase(subStatus)) {
return MDOConstants.MNLHNDLD;
} else if (MDOConstants.MNLHNDLD.equalsIgnoreCase(status)
&& MDOConstants.MNLHNDLD_OUTSIDE_MDO.equalsIgnoreCase(subStatus)) {
return MDOConstants.MNLHNDLD;
} else if (MDOConstants.DOISSUED.equalsIgnoreCase(status)) {
return MDOConstants.DOISSUED;
}
}
5条答案
按热度按时间ktca8awb1#
我想出了这样的办法
igetnqfo2#
就像鬼猫说的,我不会因为不好的原因更新这个。但我用这种逻辑为你的未来代码小评论,我将在这里使用一个小块
这是有意义的。你总是先做同样的检查。就在这个街区里每星期做一次,做一次特定的测试。
那么,你有很多
return
,这样您就可以存储要返回的结果,这样更容易跟踪(但这是针对个人的)。当然,只返回几个不同的值,可以使用一个大条件
最后,我喜欢使用集合或数组来编写这个。
kfgdxczn3#
如果这是您的确切业务逻辑,与上面所有的返回路径相反,那么您的代码实际上只返回5个不同的值,一个为null,另外4个为status。
在你所有的子状态中,只有2个在状态结果上也有差别。
如果上述代码正确,则此代码将获得完全相同的结果:
watbbzwu4#
你可以尝试创建
HashMap<Condition,String>
```class Condition
{
String status;
String subStatus;
}
map.put(new Condition(MDOConstants.INPROGRESS, MDOConstants.DEADLINE_PASSED), MDOConstants.INPROGRESS);
//...
//...
map.get(new Condition(MDOConstants.INPROGRESS, MDOConstants.DEADLINE_PASSED)); // This will give you result.
dauxcl2d5#
首先,你不应该因为性能不好而重构这段代码;或者声纳抱怨。
你应该重构它,原因很简单,像这样的东西是不可读的。一个人可以在这样的代码中隐藏3到5个拼写错误,而很多人会忽略这一点。
所以,您要做的是:应用单层抽象原则。
因此,重做可以如下所示:
... 等等。笔记:
使用
equals()
比…便宜equalsIgnoreCase()
; 所以不要一直做后者;只需确保传入状态与常量具有相同的casi ness我建议对所有这些常量使用静态导入;类名在那里经常重复;所以它在那里真的没有价值;与此相反;它使阅读更难。
是的-你真的去用一个小的私有助手方法的完整列表替换冗长的if/else树。关键是:简单、简短的方法的阅读和理解速度比任何大得多的方法快10倍。
除了纯粹的重构:
使用字符串作为状态。。。听起来是个坏习惯。java是一种强类型语言,您应该努力使用特定的类来为核心数据建模;而不是到处传绳子!
而且,正如一些评论中提到的:您可以考虑在这里使用其他类型的“查找”;例如,通过使用潜在状态列表;或Map;或者类似的东西。