【问题标题】:How can i simplify this if sequence?如果序列,我怎样才能简化这个?
【发布时间】:2020-06-08 15:43:13
【问题描述】:

我正在学习java,我陷入了一个愚蠢的境地。

我可以把我所有的代码都扔在这里,但这只会让你更加困惑。于是我把我的逻辑思维变成了这样:

if (a) 
{
    *instruction 1*
}

if (!a && b && !c) 
{
    *instruction 2*
}

if (!a && b && c)
{
    *instruction 3*
}
else
{
    *instruction 4*
}

我只想知道我是否可以简化这个,所以我不使用这么多“if”语句...... 我想知道您是如何得出结论的。

提前致谢! (是的,我很笨,帮帮我)

编辑:

我正在添加一个包含 a、b 和 c 的每种组合的真值表:

【问题讨论】:

  • 没有实际代码很难说,但这种复杂性可能是一种气味。可以将行为(指令 1 等)移动到某个接口的具体实现吗?另见:告诉不要问
  • 我认为实际的代码在这里并不重要。我将很快在帖子中添加一个真值表,以便您了解我期望从这段代码中得到什么结果。
  • 如果您有 4 条指令不相同,那么您无法避免 4 条逻辑路径。您将必须定义 4 个逻辑表达式,从而导致 4 条不同的指令。
  • 是的,我总是试图让事情变得比他们能得到的更简单。非常感谢!
  • 真值表的变量可用于构建上下文,其中上下文是Map<Context, List<Instruction>> truthTableHandlers的键。

标签: java if-statement logic simplify


【解决方案1】:

如果abc 是局部变量或保证在执行 if 语句时不会更改,那么您可以将代码编写为:

if (a) {
    // instruction 1
} else if (b) {
    if (!c) {
        // instruction 2
    } else {
        // instruction 3
    }
} 
if (a || !b || !c) {
    // instruction 4
}

但是,它仍然相当复杂。根据abc 的含义以及计算它们的方式,您可能应该将此代码重构为多个方法。例如,与c 相关的 if 语句可能很适合单一职责方法。

如果您想验证此更改是否正确,您可以创建一个真值表,其中abc 的所有可能组合为truefalse。您将检查将在您的第一个代码中执行哪条指令,以及在新代码中执行哪条指令。

【讨论】:

  • 你忘记了,在我的代码中,所有不是 (!a && b && c) 的东西也会执行指令 4。我的意思是,是否有执行 2 指令的组合.但真值表提示非常有帮助!
  • 啊哈。是的,我曾假设您打算用 else 分隔所有 if。我已经更新了答案。
  • 是的,似乎没有比这更简单的了。非常感谢!
【解决方案2】:

您可能希望使用 switch 语句来使其更具可读性。 比如:

switch(expression) {
case x:
// code block
break;
case y:
// code block
break;
default:
// code block
}

switch 语句是多路分支语句。它提供了一种简单的方法,可以根据表达式的值将执行分派到代码的不同部分。基本上,表达式可以是 byte、short、char 和 int 原始数据类型。从 JDK7 开始,它也适用于枚举类型(Java 中的 Enums)、String 类和 Wrapper 类。

据我所知,有一个用于布尔值的包装类。

boolean result = switch (ternaryBool) {
case TRUE -> true;
case FALSE -> false;
case FILE_NOT_FOUND -> throw new UncheckedIOException(
    "This is ridiculous!",
    new FileNotFoundException());
// as we'll see in "Exhaustiveness", `default` is not necessary
default -> throw new IllegalArgumentException("Seriously?! ?");
};

https://blog.codefx.org/java/switch-expressions/

【讨论】:

    【解决方案3】:

    在多种情况下,我会使用 switch 语句使其更易于阅读。

    https://beginnersbook.com/2017/08/java-switch-case/

    【讨论】:

    • 你如何为 3 个布尔变量使用 switch 语句?
    • 我也在问同样的问题。我忘了说 a、b 和 c 是布尔变量。
    • @PedroNuno 您无需提及。很明显。答案是完全错误的。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多