你肯定了解过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))
}
}
我当时并没有直接按上面的方式写下来。很神奇地,我当时产生了一种这里用位运算“异或”来解决是否是更好的想法?
梳理一下这里的逻辑就是:
- 如果
ifSetState和timeSort都为true,使用desc - 如果
ifSetState和timeSort都为false,使用desc - 如果
ifSetState为true,timeSort为false,使用asc - 如果
ifSetState为false,timeSort为true,使用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