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

2023-11-25 17:13:29 +08:00
 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 个)想问下各位是否也有在项目中这样写的经验?

5615 次点击
所在节点    Java
27 条回复
post90sraccoon
2023-11-26 10:49:09 +08:00
可读性重要的吗,代码是给人看的
zhady009
2023-11-26 12:15:20 +08:00
又不是写内核,这种性能带来的提升在应用级上没啥意义
adoal
2023-11-26 12:32:26 +08:00
位运算都成了高级技巧…
hez2010
2023-11-26 17:56:45 +08:00
一般位运算方式存储数值是为了节省空间,但是 Java 压根连值类型都没有,走哪都得 box ,这 box 一下多出来的大小都比你省出来的空间远大的多。
所以我的评价是在 Java 里这么写没用,但是在其它语言里有用。
rhoasneg
2023-11-28 10:27:47 +08:00
@tool2d 你可以看下我新加的附言内容,可能和你理解有点不同。。。
tool2d
2023-11-28 10:51:08 +08:00
@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
2023-11-28 10:55:39 +08:00
@tool2d 你这种代表状态值的使用是正常的,但是他这种感觉就是刻意在埋坑的

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

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

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

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

© 2021 V2EX