简化if语句逻辑

Bre*_*len 2 language-agnostic boolean-logic readability

我已经分开了一个测试,以确定两个计划项目是否重叠,因为它的不可读性.

是否有任何应用程序可以帮助简化逻辑语句?

示例:(最初是一个错误的示例,但是暴露了我请求的原因)

if (x < y && y < z && x < z)  
Run Code Online (Sandbox Code Playgroud)

可以减少到

if (x < y && y < z)
Run Code Online (Sandbox Code Playgroud)

我的代码是:

return (shift.Start <= shift2.Start && shift.End >= shift2.End) || (shift2.Start <= shift.Start && shift2.End >= shift.Start)
Run Code Online (Sandbox Code Playgroud)

我希望能够更简单,我相信这是可能的,只是不确定如何.

看到这是真正与语言无关的,即使转换到不同的脚本来寻找可能性也会很好,例如,不需要它在C#中.

Way*_*rad 8

杀死重复的逻辑,你将一石二鸟.你会得到干,你会得到一个功能名称(富人的评论):

class Shift:
  def encompasses(other_shift)
    self.start <= other_shift.start && self.end >= other_shift.end

...

return shift1.encompasses(shift2) || shift2.encompasses(shift1)
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 6

对这些变化要非常非常小心.他们似乎在inital一目了然直观,布尔逻辑(和德·摩根定律)是不是太难以把握,但也有当你在个别情况下常常潜在的陷阱:

例如:if(x <y && y <z)可以简化为if(x <z)

这是不正确的,如果(x < z),y可能仍然大于z.该状态不会通过您的原始测试.


Mat*_*dan 3

当涉及复杂的逻辑语句时,通常最好以可读的方式格式化代码,而不是尝试一些过早的优化(万恶之源等)

例如:

return (shift.Start <= shift2.Start && shift.End >= shift2.End) || (shift2.Start <= shift.StartTime && shift2.End >= shift.Start)
Run Code Online (Sandbox Code Playgroud)

为了可读性和可维护性,可以重构为:

bool bRetVal = false;
bRetVal = (    (   (shift.Start <= shift2.Start)
                && (shift.End >= shift2.End))
            || (   (shift2.Start <= shift.StartTime)
                && (shift2.End >= shift.Start)))
return bRetVal;
Run Code Online (Sandbox Code Playgroud)

大多数地方都维护一个编码标准,为大型逻辑块定义类似上述内容。我宁愿保留几行可以阅读和理解的额外代码,而不是一行怪物。