什么是使用大量布尔开关的替代方法

k4s*_*k4s 0 java theory java-8

我有一个旧的代码需要重新使用,它利用了大约10到15个布尔值,这些布尔值在整个类中都跳舞,就像这样:

if (condition)
{
  bool1 = true
}
if (condition)
{
  bool2 = true
}
...
Run Code Online (Sandbox Code Playgroud)

然后

if (bool1 == true && bool2 == true && bool3 == false)
{
  do something
}
else if (bool1 == true && bool2 == false && bool3 == false)
{
  do something
}
...
Run Code Online (Sandbox Code Playgroud)

是否可以避免这种编码方式?有更好的方法来实现这一点吗?也许利用地图?

我想提高可读性和整体性能,因为这段代码长于1,000s行。

反馈后添加更多具体示例:

boolean bool1 = false, bool2 = false, bool3 = false, bool4 = false, bool5 = false,
bool6 = false, bool7 = false, bool8 = false, bool9 = false, bool10 = false;

if (string_object.startsWith("Pattern1"))
{
    bool1 = true
}
if (string_object.startsWith("Pattern2")
{
    bool2 = true
}
if (string_object.startsWith("Pattern3")
{
    bool3 = true
}
if (string_object.startsWith("Pattern4")
{
    bool4 = true
}
if (string_object.startsWith("Pattern5")
{
    bool5 = true
}
// and so on...

if (system_type.equals("type1"))
{
    if (bool1 == true && bool2 == true && bool3 == false)
    {
        system_value.set("value1")
    }
    else if (bool1 == true && bool2 == false && bool3 == false)
    {
        system_value.set("value2")
    }
    else if (bool1 == true && bool3 == false && bool4 == true)
    {
        system_value.set("value3")
    }
}
else if (system_type.equals("type2"))
{
    if (bool1 == true && bool2 == true && bool4 == true)
    {
        system_value.set("value1")
    }
    else if (bool1 == true && bool3 == false && bool5 == true)
    {
        system_value.set("value4")
    }
    else if (bool1 == true && bool3 == false && bool4 == true)
    {
        system_value.set("value5")
    }
}
// and so on...
Run Code Online (Sandbox Code Playgroud)

Mic*_*ock 5

您可以做几件事。

  1. 正如其他人提到的那样,代码如下:

    if(condition){bool1 = true; }

可以压缩为:

bool1 = (condition);
Run Code Online (Sandbox Code Playgroud)
  1. 另一个有用的工具是Martin Fowler的重构工具之一- 分解有条件的

例如,更改此内容:

if (bool1 == true && bool2 == true && bool3 == false)
{
  do something
}
else if (bool1 == true && bool2 == false && bool3 == false)
{
  do something
}
Run Code Online (Sandbox Code Playgroud)

对于这样的事情:

if (firstCondition())
{
  do something
}
else if (secondCondition())
{
  do something
}

private boolean firstCondition() {
  return (bool1 && bool2 && !bool3 );
}

private boolean secondCondition() {
  return (bool1 && !bool2 && !bool3);
}
Run Code Online (Sandbox Code Playgroud)

像这样分解复杂的条件使您的代码更易于阅读和维护。