使用逻辑等值演算简化代码

288 阅读1分钟

情景: 记录数组中的最大值。
思路: 使用 last 来存放之前的最大值,使用 new 表示新的值,通过判断两者的大小来决定是否更新最大值 last

  • 最直接
// 如果 last 为空,或者 last 小于 new 的时候更新
if last == nil || (last != nil && new > last) {
    last = new
}

n 个条件,对应2^n 个分支

上面的表达式中,实际上描述了 2^2 = 4 个分支中的 3 个,因此可以通过最后一个分支的逻辑非来简化:

  • 逻辑非
// 如果 last 不为空,且大于 new,就无需更新。取逻辑非就是需要更新。
if !(last != nil && new <= last) {
    last = new
} 

基于语言的一些语法特性,我们在代码里更常见的是 占位法

  • 占位法
// 回顾更新数据的条件:last == nil || new > last
// 将 last == nil 的情况改成能使第二个式子:new > last 恒成立的方式,实现两个命题的整合。
if new > last ?? MIN { // MIN 是一个一定比 new 小的值
    last = new
}