如果序列,我怎样才能简化这个?

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】:

如果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 您无需提及。很明显。答案是完全错误的。

以上是关于如果序列,我怎样才能简化这个?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能在全局忽略UTF-8字符串无效的字节序列

我怎样才能将时间序列数据从昨天移到今天的大熊猫?

怎样在oracle中取出当前序列值

c#中如何让自己的类也能序列化?

我怎样才能简化这个逻辑

我怎样才能坚持protobuf网可为空值的数组