关于可读性与高级技巧之间的折衷

查看 98|回复 7
作者:rhoasneg   
今天在对我们企业项目里进行 CR ,其中发现有位同事在保存 id 列表时采用位运算的方式,将 int 类型的列表转成 二进制值,代码:
    private int getFlag(List[I] flags) {
        int result = 0;
        if (flags == null) {
            return 0;
        }
        for (Integer flag : flags) {
            result |= 1
在取出列表时,则:
    private List[I] toFlagList(int flag) {
        List[I] result = new ArrayList();
        for (int i = 0; i >> i) & 1) == 1) {
                result.add(i);
            }
        }
        return result;
    }
这种写法,我个人觉得,在存储数值较多的列表时还不错,就是代码可读性不好(对于平时不怎么使用到位运算的同事),此外,这种时间换空间的方式,是否收效甚微呢?( id 列表值不多,就一个下拉框,在可预见的未来应该也不会超过 10 个)想问下各位是否也有在项目中这样写的经验?

int, result, integer, flag

kdd0063   
这看你从什么角度看问题了。如果从 tech lead 的角度来看,项目代码的风格统一,可读性与可维护性是第一位的,很多时候甚至比性能收益更重要。这段 PR 带来了更差的可读性,可维护性,因为数据量很小所以根本不会体现多么高的性能收益,几乎属于纯粹的炫技行为,这几个点一叠加,必定是要打回重改的。
zhujinliang   
过早优化是万恶之源
passive   
简单干净低耦合的函数,做好边界场景的测试,里面写成花都不管。
nagisaushio   
第二段代码。。
不懂位运算的人看不懂
懂位运算的人看了觉得写得烂
综上肯定会被打
rhoasneg
OP
  
@kdd0063 是的,就我个人角度看的话,这种写法对于人来说,是不友好的(毕竟代码是给人看的),并且后续在定位问题上也会很麻烦
@zhujinliang 其实要说优化的话,我感觉似乎也没优化到点上吧,因为需要一次返回多条数据,所以他实际上在返回的时候,还需要对每条数据进行转换
rhoasneg
OP
  
@passive 这种函数输出的结果,如果线上出现相关异常,定位会比较麻烦吧
rhoasneg
OP
  
@nagisaushio hhhhhhh
您需要登录后才可以回帖 登录 | 立即注册

返回顶部