位运算让代码更出彩?

59 阅读2分钟

你肯定了解过react源码中,位远算在优先级(Lanes)处理中的极致应用,是不是惊叹于设计之巧妙。在看完那段源码之后的很长一段时间里,我都在想把位远算的使用带到平时的开发中。想着是否有场景可以让位远算也发挥其能力,让代码看起来很“美丽”。

但是当你用起来是否也一样极致呢?

就在上周,遇到一个需求。整理了一下思路,大概是要写下面的逻辑:

// 下面为模拟的类似逻辑的代码

function sortList(list: Object[], timeSort boolean, ifSetState boolean) {
    const descFlag = 'desc', ascFlag = 'asc';
    if (ifSetState) {
        list.sort(SortTools.compare('byTime', timeSort ? descFlag : ascFlag))
    } else {
        list.sort(SortTools.compare('byTime', timeSort ? ascFlag : descFlag))
    }
}

我当时并没有直接按上面的方式写下来。很神奇地,我当时产生了一种这里用位运算“异或”来解决是否是更好的想法?

梳理一下这里的逻辑就是:

  1. 如果 ifSetStatetimeSort 都为 true,使用 desc
  2. 如果 ifSetStatetimeSort 都为 false,使用 desc
  3. 如果 ifSetStatetruetimeSortfalse,使用 asc
  4. 如果 ifSetStatefalsetimeSorttrue,使用 asc

这不跟异或(都为0或者都为1时远算结果为false,不相同时为true)本身的逻辑是一致的吗?

所以上面的代码就可以用异或来简化:

function sortList(list: Object[], timeSort boolean, ifSetState boolean) {
    const descFlag = 'desc', ascFlag = 'asc';    
    list.sort(SortTools.compare('byTime', timeSort ^ ifSetState ? ascFlag : descFlag))
}

在同事做code-review时,针对这个位运算我们有一些讨论:位运算的加入虽然简化了流程,但是不是也降低了代码的可读性呢?下面是我的想法:

关于代码可读性, 应该有不同的维度考虑,比如

  • 友好、准确的变量、函数的命名
  • 一致的代码风格
  • 良好的代码结构
  • 注释
  • 更高维度的,比如正确的使用设计模式、少一些复杂的算法等等

在我看来用 if + 三元 的逻辑看起来 和 位远算 + 三元 在逻辑上都是清晰的,前者的意图可能会显而易见,后者的优势在于简洁。如果综合业务处理逻辑的话,我想这两种方式的可读性都是可以接受的。而如果非要觉得后者的可读性更差的话,也可以添加类似上面梳理的逻辑作为注释辅助理解。

这样的逻辑优化不会给项目带来质的提升,但是偶尔写出一些漂亮的代码至少可以让自己满足的。而如果每段代码都精心设计,不断思考、优化,确实能给项目带来实质性飞跃的。

q