当前位置: 首页 > 科技观察

你写这样的代码,不怕同事打你吗?

时间:2023-03-16 16:14:52 科技观察

假设你看到这样的代码:if(a&&d||b&&c&&!d||(!a||!b)&&c){console.log('pass')}else{console.log('fail')}你在屏幕上吐旧血吗?当然,这段代码是我参考一个金块沸点(@李东村的李二狗)伪造的,希望你和你的同事不要这样写。如果不是逻辑不清楚能写出这种AND或者NO,那估计就只有一种可能了。需求改了很多次,结果也被很多人修改过。.现在的问题是,这样的代码,这么复杂的逻辑能不能优化?答案是肯定的!对这类问题的探索来自于数学的一个分支:布尔代数或逻辑代数。说起布尔值,我们开发人员再熟悉不过了。不是真的假的吗?布尔代数的课程应该在大学里或多或少地讲授。因为我是数学专业毕业的,所以一定要记录下这种题,顺便复习一下。为了表达方便,和/或不是在JS中,我使用布尔代数中的表达方式:soa&&d||b&&c&&!d||(!a||!b)&&c可以表示为:转换后优先级更加清晰。现在的问题是,我们如何简化这个逻辑表达式。幸运的是,我们可以得出一些共同的结论:前四个公式很好理解。比如self或者self不是,当然是真的。关键是第五个公式不是那么直观,可以画图简单说明(其他公式可以类似推导)。先看部分,图中绿色区域:再看,图中绿色区域:两者之和为:而部分为图中粉色区域:因为粉色区域本来就是在求和前两者的,所以加多少次是一样的。请注意最后一个公式的核心特征:总和显示为总和。有了这些公式做铺垫,我们就可以正式推导了(原沸点图中):根据第4条,替换最后一项:注意前两项分别有sum,符合第5条:此时最后两项符合第二条:最后两项,其中一项是,另一项也包括,符合第三条:至此简化完成。不可思议,B没了!至此,一开始的代码就简化成了这样:if(a&&d||c){console.log('pass')}else{console.log('fail')}太爽了。感谢您看到这里,希望对您有所帮助。