如果序列,我怎样才能简化这个?
Posted
技术标签:
【中文标题】如果序列,我怎样才能简化这个?【英文标题】: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
的键。
【参考方案1】:
如果a
、b
和c
是局部变量或保证在执行 if 语句时不会更改,那么您可以将代码编写为:
if (a)
// instruction 1
else if (b)
if (!c)
// instruction 2
else
// instruction 3
if (a || !b || !c)
// instruction 4
但是,它仍然相当复杂。根据a
、b
和c
的含义以及计算它们的方式,您可能应该将此代码重构为多个方法。例如,与c
相关的 if 语句可能很适合单一职责方法。
如果您想验证此更改是否正确,您可以创建一个真值表,其中a
、b
和c
的所有可能组合为true
或false
。您将检查将在您的第一个代码中执行哪条指令,以及在新代码中执行哪条指令。
【讨论】:
你忘记了,在我的代码中,所有不是 (!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 您无需提及。很明显。答案是完全错误的。以上是关于如果序列,我怎样才能简化这个?的主要内容,如果未能解决你的问题,请参考以下文章