如何以更优雅和可扩展的方式编写这些条件语句

Rya*_*sto 7 java algorithm if-statement

在我的软件中,我需要根据2个参数来决定功能的版本.例如.

Render version 1 -> if (param1 && param2) == true;
Render version 2 -> if (!param1 && !param2) == true;
Render version 3 -> if only param1 == true;
Render version 4 -> if only param2 == true;
Run Code Online (Sandbox Code Playgroud)

所以,为了满足这个要求,我写了一个看起来像这样的代码 -

if(param1 && param2) //both are true {
    version = 1;
}
else if(!param1 && !param2) //both are false {
    version = 2;
}
else if(!param2) //Means param1 is true {
    version = 3;
}
else { //Means param2 is true
    version = 4;
}
Run Code Online (Sandbox Code Playgroud)

肯定有多种方法可以对此进行编码,但我在尝试不同方法后最终确定了这种方法,因为这是我能想出的最易读的代码.
但是这段代码绝对不可扩展,因为 -

  1. 明天我们要介绍一个名为param3的新param.然后没有.由于多种可能的组合,检查会增加.
  2. 对于这个软件,我非常确定将来我们将不得不容纳新的参数.

是否有任何可扩展和可读的方式来编码这些要求?

Mat*_*ans 5

如果你必须枚举布尔值的所有可能组合,通常最简单的方法是将它们转换为数字:

//                            param1:   F  T  F  T
//                            param2;   F  F  T  T
static final int[] VERSIONS = new int[]{2, 3, 4, 1};

...
version = VERSIONS[(param1 ? 1:0) + (param2 ? 2:0)];
Run Code Online (Sandbox Code Playgroud)

  • 这真的很聪明,但远没有可读性和表现力.对于不熟悉此代码的开发人员来说,它甚至可能会产生神秘色彩. (7认同)

Ole*_*.V. 5

编辑: 对于可扩展的解决方案,通过以下方式定义每个参数组合的版本Map:

Map<List<Boolean>, Integer> paramsToVersion = Map.of(
        List.of(true, true), 1,
        List.of(false, false), 2,
        List.of(true, false), 3,
        List.of(false, true), 4);
Run Code Online (Sandbox Code Playgroud)

现在找到合适的版本是一个简单的地图查找:

    version = paramsToVersion.get(List.of(param1, param2));
Run Code Online (Sandbox Code Playgroud)

我初始化地图的方式从Java 9开始工作.在较旧的Java版本中,它有点冗长,但可能仍然值得做.即使在Java 9中,Map.ofEntries如果您有4个或更多参数(对于16种组合),您也需要使用,这也是一个更加冗长的内容.

原始答案: 我的口味是嵌套if/ else语句,只测试每个参数一次:

    if (param1) {
        if (param2) {
            version = 1;
        } else {
            version = 3;
        }
    } else {
        if (param2) {
            version = 4;
        } else {
            version = 2;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但它很难扩展到许多参数.