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

185 天前
 rhoasneg

今天在对我们企业项目里进行 CR ,其中发现有位同事在保存 id 列表时采用位运算的方式,将 int 类型的列表转成 二进制值,代码:

    private int getFlag(List<Integer> flags) {
        int result = 0;
        if (flags == null) {
            return 0;
        }
        for (Integer flag : flags) {
            result |= 1 << flag;
        }
        return result;
    }

在取出列表时,则:

    private List<Integer> toFlagList(int flag) {
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < 32; i++) {
            if (((flag >>> i) & 1) == 1) {
                result.add(i);
            }
        }
        return result;
    }

这种写法,我个人觉得,在存储数值较多的列表时还不错,就是代码可读性不好(对于平时不怎么使用到位运算的同事),此外,这种时间换空间的方式,是否收效甚微呢?( id 列表值不多,就一个下拉框,在可预见的未来应该也不会超过 10 个)想问下各位是否也有在项目中这样写的经验?

3753 次点击
所在节点    Java
27 条回复
post90sraccoon
184 天前
可读性重要的吗,代码是给人看的
zhady009
184 天前
又不是写内核,这种性能带来的提升在应用级上没啥意义
adoal
184 天前
位运算都成了高级技巧…
hez2010
184 天前
一般位运算方式存储数值是为了节省空间,但是 Java 压根连值类型都没有,走哪都得 box ,这 box 一下多出来的大小都比你省出来的空间远大的多。
所以我的评价是在 Java 里这么写没用,但是在其它语言里有用。
rhoasneg
182 天前
@tool2d 你可以看下我新加的附言内容,可能和你理解有点不同。。。
tool2d
182 天前
@rhoasneg sql 写的有点奇怪,理论上运算一次就可以了,不需要拼接 sql 。

可能是编程领域不一样,我代码里大量使用位运算,比如下面这种:

enum {
PERM_ACTIVE = (1<<0), // 帐号被激活状态,
PERM_CHANNEL = (1<<1), // 添加/删除频道权限
PERM_PUB = (1<<2), // 发布文章权限
PERM_REVIEW = (1<<3), // 审批权限
PERM_DEL = (1<<4), // 删除文章权限
};
rhoasneg
182 天前
@tool2d 你这种代表状态值的使用是正常的,但是他这种感觉就是刻意在埋坑的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/995145

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX