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#中.
杀死重复的逻辑,你将一石二鸟.你会得到干,你会得到一个功能名称(富人的评论):
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)
对这些变化要非常非常小心.他们似乎在inital一目了然直观,布尔逻辑(和德·摩根定律)是不是太难以把握,但也有当你在个别情况下常常潜在的陷阱:
例如:if(x <y && y <z)可以简化为if(x <z)
这是不正确的,如果(x < z),y可能仍然大于z.该状态不会通过您的原始测试.
当涉及复杂的逻辑语句时,通常最好以可读的方式格式化代码,而不是尝试一些过早的优化(万恶之源等)
例如:
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)
大多数地方都维护一个编码标准,为大型逻辑块定义类似上述内容。我宁愿保留几行可以阅读和理解的额外代码,而不是一行怪物。