如何降低此方法的复杂性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何降低此方法的复杂性?相关的知识,希望对你有一定的参考价值。

PS:CONST * - * =>常量

我需要使用Java 7语法来降低此方法的复杂性。

public void myMethod(){
    if(condition1){
       menu.addItem(CONSTA-1);
    }
    if(condition2){
        menu.addItem(CONSTB-1);
    }
    if(condition3){
        menu.addItem(CONSTC-1);
        menu.addItem(CONSTC-2);
    }
    if(condition4){
        menu.addItem(CONSTD-1);
    }
    if(condition5){
        menu.addItem(CONSTE-1);
    }
}
答案

重构的基本规则是,方法应该足够小以容纳功能

因此,我们可以轻松地重构如下,

public void myMethod(){
  addMenuCondition1(menu);
  addMenuCondition2(menu);
  addMenuCondition3(menu);
  addMenuCondition4(menu);
  addMenuCondition5(menu);
}
public void addMenuCondition1(Menu menu) {
   if(condition1){
       menu.addItem(CONSTA-1);
    }
}
public void addMenuCondition2(Menu menu) {
 if(condition2){
        menu.addItem(CONSTB-1);
    }
}
public void addMenuCondition3(Menu menu) {
 if(condition3){
        menu.addItem(CONSTC-1);
        menu.addItem(CONSTC-2);
    }
}
public void addMenuCondition4(Menu menu) {
  if(condition4){
        menu.addItem(CONSTD-1);
    }
}
public void addMenuCondition5(Menu menu) {
   if(condition5){
        menu.addItem(CONSTE-1);
    }
}
另一答案

使用Java 8,您可以考虑使用List<Pair<Predicate, List<MenuItem>> thingy。

换句话说:当可以将每个条件提取到独立的Predicate对象中时,您可以执行以下操作:

for (Pair<Predicate, List<MenuItem> pair : thatList) {
  if (pair.first().test()) {
    pair.second().foreach(menu::addItem);

含义:迭代所有条件,对于第一个匹配,您检索相应的菜单项并添加它们。其中关键的部分是想要一个理智的方式来实际让每个test()正确的事情。

您可以在Java7中执行类似的操作(通过自己实现所需的类)。但那在我看来会过度工程化。

以上是关于如何降低此方法的复杂性?的主要内容,如果未能解决你的问题,请参考以下文章

如何降低此方法的复杂性?

降低选择中的圈复杂度

如何降低以下代码块的时间复杂度?

程序优化--降低复杂度

程序优化--降低复杂度

如何降低 C++ 中算法的时间复杂度?