如何在java中优化下面的if-else优化代码?

rslzwgfq  于 2021-07-09  发布在  Java
关注(0)|答案(5)|浏览(443)

任何人都可以请帮助优化这段代码,以减少如果没有其他语句开关的情况下不可能在这里,因为声纳显示出重大缺陷和复杂性。

  1. if (status != null) {
  2. if (MDOConstants.DOCREATED.equalsIgnoreCase(status)) {
  3. return null;
  4. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  5. && MDOConstants.MDO_Stored.equalsIgnoreCase(subStatus)) {
  6. return MDOConstants.INPROGRESS;
  7. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  8. && MDOConstants.GCSS_SUBMITTED.equalsIgnoreCase(subStatus)) {
  9. return MDOConstants.INPROGRESS;
  10. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  11. && MDOConstants.PENDING_TASKS.equalsIgnoreCase(subStatus)) {
  12. return MDOConstants.INPROGRESS;
  13. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  14. && MDOConstants.ISSUANCE_OK.equalsIgnoreCase(subStatus)) {
  15. return MDOConstants.INPROGRESS;
  16. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  17. && MDOConstants.GCSS_REQUESTED.equalsIgnoreCase(subStatus)) {
  18. return MDOConstants.ISSUANCE_REQUESTED;
  19. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  20. && MDOConstants.GCSS_ISSUED.equalsIgnoreCase(subStatus)) {
  21. return MDOConstants.ISSUANCE_REQUESTED;
  22. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  23. && MDOConstants.DEADLINE_PASSED.equalsIgnoreCase(subStatus)) {
  24. return MDOConstants.INPROGRESS;
  25. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  26. && MDOConstants.DEADLINE_PASSED_OR_NEW_PICKUPDATE_NEEDED.equalsIgnoreCase(subStatus)) {
  27. return MDOConstants.INPROGRESS;
  28. } else if (MDOConstants.MNLHNDLD.equalsIgnoreCase(status)
  29. && MDOConstants.MNLHNDLD_TECHNICAL.equalsIgnoreCase(subStatus)) {
  30. return MDOConstants.MNLHNDLD;
  31. } else if (MDOConstants.MNLHNDLD.equalsIgnoreCase(status)
  32. && MDOConstants.MNLHNDLD_OUTSIDE_MDO.equalsIgnoreCase(subStatus)) {
  33. return MDOConstants.MNLHNDLD;
  34. } else if (MDOConstants.DOISSUED.equalsIgnoreCase(status)) {
  35. return MDOConstants.DOISSUED;
  36. }
  37. }
ktca8awb

ktca8awb1#

我想出了这样的办法

  1. if (status != null)
  2. {
  3. if (MDOConstants.DOCREATED.equals(status))
  4. {
  5. return null;
  6. }
  7. else if(MDOConstants.INPROGRESS.equals(status))
  8. {
  9. if(MDOConstants.MDO_Stored.equals(subStatus) ||
  10. MDOConstants.GCSS_SUBMITTED.equals(subStatus) ||
  11. MDOConstants.PENDING_TASKS.equals(subStatus) ||
  12. MDOConstants.ISSUANCE_OK.equals(subStatus) ||
  13. MDOConstants.DEADLINE_PASSED.equals(subStatus) ||
  14. MDOConstants.DEADLINE_PASSED_OR_NEW_PICKUPDATE_NEEDED.equals(subStatus))
  15. {
  16. return MDOConstants.INPROGRESS;
  17. }
  18. else if(MDOConstants.GCSS_REQUESTED.equals(subStatus) ||
  19. MDOConstants.GCSS_ISSUED.equals(subStatus))
  20. {
  21. return MDOConstants.ISSUANCE_REQUESTED;
  22. }
  23. }
  24. else if(MDOConstants.MNLHNDLD.equals(status))
  25. {
  26. if(MDOConstants.MNLHNDLD_TECHNICAL.equals(subStatus) ||
  27. MDOConstants.MNLHNDLD_OUTSIDE_MDO.equals(subStatus))
  28. {
  29. return MDOConstants.MNLHNDLD;
  30. }
  31. }
  32. else if(MDOConstants.DOISSUED.equals(status))
  33. {
  34. return MDOConstants.DOISSUED;
  35. }
  36. }
展开查看全部
igetnqfo

igetnqfo2#

就像鬼猫说的,我不会因为不好的原因更新这个。但我用这种逻辑为你的未来代码小评论,我将在这里使用一个小块

  1. if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  2. && MDOConstants.MDO_Stored.equalsIgnoreCase(subStatus)) {
  3. return MDOConstants.INPROGRESS;
  4. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  5. && MDOConstants.GCSS_SUBMITTED.equalsIgnoreCase(subStatus)) {
  6. return MDOConstants.INPROGRESS;
  7. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  8. && MDOConstants.PENDING_TASKS.equalsIgnoreCase(subStatus)) {
  9. return MDOConstants.INPROGRESS;
  10. } else if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)
  11. && MDOConstants.ISSUANCE_OK.equalsIgnoreCase(subStatus)) {
  12. return MDOConstants.INPROGRESS;
  13. }

这是有意义的。你总是先做同样的检查。就在这个街区里每星期做一次,做一次特定的测试。

  1. if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)){
  2. if(MDOConstants.MDO_Stored.equalsIgnoreCase(subStatus)) {
  3. return MDOConstants.INPROGRESS;
  4. } else if (MDOConstants.GCSS_SUBMITTED.equalsIgnoreCase(subStatus)) {
  5. return MDOConstants.INPROGRESS;
  6. } else if (MDOConstants.PENDING_TASKS.equalsIgnoreCase(subStatus)) {
  7. return MDOConstants.INPROGRESS;
  8. } else if (MDOConstants.ISSUANCE_OK.equalsIgnoreCase(subStatus)) {
  9. return MDOConstants.INPROGRESS;
  10. }
  11. }

那么,你有很多 return ,这样您就可以存储要返回的结果,这样更容易跟踪(但这是针对个人的)。
当然,只返回几个不同的值,可以使用一个大条件

  1. if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)){
  2. if(MDOConstants.MDO_Stored.equalsIgnoreCase(subStatus) ||
  3. MDOConstants.GCSS_SUBMITTED.equalsIgnoreCase(subStatus) ||
  4. MDOConstants.PENDING_TASKS.equalsIgnoreCase(subStatus)) ||
  5. MDOConstants.ISSUANCE_OK.equalsIgnoreCase(subStatus)) {
  6. return MDOConstants.INPROGRESS;
  7. }
  8. }

最后,我喜欢使用集合或数组来编写这个。

  1. static final List<String> STATUS_IN_PROGRESS = Arrays.asList(
  2. MDOConstants.MDO_Stored.toLowerCase(),
  3. MDOConstants.GCSS_SUBMITTED.toLowerCase(),
  4. MDOConstants.PENDING_TASKS.toLowerCase(),
  5. MDOConstants.ISSUANCE_OK.toLowerCase()
  6. );
  7. if (MDOConstants.INPROGRESS.equalsIgnoreCase(status)){
  8. if(STATUS_IN_PROGRESS.contains(subStatus.toLowerCase()){
  9. return MDOConstants.INPROGRESS;
  10. }
  11. }
展开查看全部
kfgdxczn

kfgdxczn3#

如果这是您的确切业务逻辑,与上面所有的返回路径相反,那么您的代码实际上只返回5个不同的值,一个为null,另外4个为status。
在你所有的子状态中,只有2个在状态结果上也有差别。
如果上述代码正确,则此代码将获得完全相同的结果:

  1. if (status == null || MDOConstants.DOCREATED.equalsIgnoreCase(status))
  2. return null;
  3. if (MDOConstants.INPROGRESS.equalsIgnoreCase(status))
  4. {
  5. if (MDOConstants.GCSS_REQUESTED.equalsIgnoreCase(subStatus) || MDOConstants.GCSS_ISSUED.equalsIgnoreCase(subStatus))
  6. return MDOConstants.ISSUANCE_REQUESTED;
  7. else
  8. return MDOConstants.INPROGRESS
  9. }
  10. else if (MDOConstants.MNLHNDLD.equalsIgnoreCase(status)
  11. return MDOConstants.MNLHNDLD;
  12. else if (MDOConstants.DOISSUED.equalsIgnoreCase(status))
  13. return MDOConstants.DOISSUED;
  14. //Maybe have some default if all else fails here.
展开查看全部
watbbzwu

watbbzwu4#

你可以尝试创建 HashMap<Condition,String> ```
class Condition
{
String status;
String subStatus;

  1. public Condition(String s, String subS)
  2. {
  3. status = s;
  4. subStatus = subS;
  5. }
  6. public boolean equals(Condition c)
  7. {
  8. return c.status.equalsIgnoreCase(status)
  9. && c.subStatus.equalsIgnoreCase(subStatus);
  10. }

}

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.

  1. 当然,还有改进的余地,但你可能会得到一些提示。
展开查看全部
dauxcl2d

dauxcl2d5#

首先,你不应该因为性能不好而重构这段代码;或者声纳抱怨。
你应该重构它,原因很简单,像这样的东西是不可读的。一个人可以在这样的代码中隐藏3到5个拼写错误,而很多人会忽略这一点。
所以,您要做的是:应用单层抽象原则。
因此,重做可以如下所示:

  1. public Whatever findWhateverForPotentiallyNull(String status) {
  2. if (status == null) {
  3. return null;
  4. return findWhatEverFor(status.toUpperCase());
  5. }
  6. private Whatever findWhateverFor(String ucStatus) {
  7. if (ucStatus.equals(DOCREATED)) {
  8. return null;
  9. }
  10. if (ucStatus.equals(INPROGRESS)) {
  11. return findWhateverForSubStatus(substatus);
  12. }

... 等等。笔记:
使用 equals() 比…便宜 equalsIgnoreCase() ; 所以不要一直做后者;只需确保传入状态与常量具有相同的casi ness
我建议对所有这些常量使用静态导入;类名在那里经常重复;所以它在那里真的没有价值;与此相反;它使阅读更难。
是的-你真的去用一个小的私有助手方法的完整列表替换冗长的if/else树。关键是:简单、简短的方法的阅读和理解速度比任何大得多的方法快10倍。
除了纯粹的重构:
使用字符串作为状态。。。听起来是个坏习惯。java是一种强类型语言,您应该努力使用特定的类来为核心数据建模;而不是到处传绳子!
而且,正如一些评论中提到的:您可以考虑在这里使用其他类型的“查找”;例如,通过使用潜在状态列表;或Map;或者类似的东西。

展开查看全部

相关问题