V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
taogen
V2EX  ›  程序员

吐槽一下 Java JRE 的源码可读性有点差

  •  
  •   taogen ·
    tagnja · 2020-08-21 09:26:17 +08:00 · 4006 次点击
    这是一个创建于 1338 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想了解一下 java.util.concurrent.ConcurrentHashMap,发现可读性太差了。

    吐槽点如下:

    • 大部分局部变量都是单个字母命名( WTF )。
    • 大量的位运算(不明觉厉)。
    • 大量的魔法值( WTF )。
    • 很多层嵌套循环在一个方法中(头晕目眩)。
    • 一个 if 判断条件中,含大量的与、或子句,且含许多赋值语句。

    以上或许都是为了追求极致性能,但是可读性真的太差了。

    23 条回复    2020-08-21 22:27:56 +08:00
    wsy2220
        1
    wsy2220  
       2020-08-21 09:30:00 +08:00 via Android   ❤️ 3
    底层数据结构实现是可以为了性能牺牲可读性的
    yangbonis
        2
    yangbonis  
       2020-08-21 09:36:22 +08:00 via iPhone
    单个字母命名屏蔽垃圾信息,都是通用的逻辑,又不是业务,取名字反而是干扰。
    yangbonis
        3
    yangbonis  
       2020-08-21 09:37:23 +08:00 via iPhone
    你只是站在自己角度觉得可读性差,站在作者角度,说不定人家觉得很好。
    yanzhiling2001
        4
    yanzhiling2001  
       2020-08-21 09:41:48 +08:00   ❤️ 2
    看到 jre 我就过来了 www.injdk.cn
    taogen
        5
    taogen  
    OP
       2020-08-21 09:43:30 +08:00
    @yangbonis #2 当有多个单字母变量在一起时,很难记住每个变量的含义,除非对代码非常熟悉。
    lamy
        6
    lamy  
       2020-08-21 09:49:12 +08:00 via Android
    和 c++ stl 比一下
    Still4
        7
    Still4  
       2020-08-21 09:49:38 +08:00
    你才搞了几年,写底层的搞了多少年,不是说资历就是能力,而是人家这么做一定有道理,底层必然优先性能,可读性靠边站,参考这个

    https://www.v2ex.com/t/691522
    flippydoo
        8
    flippydoo  
       2020-08-21 09:56:16 +08:00 via iPhone
    这可读性都能差?但凡你好好看了 chm 类上面的注释和属性注释都不会这么讲,douglee 差不多用注释写了篇论文了
    ChanKc
        9
    ChanKc  
       2020-08-21 09:57:23 +08:00 via Android
    函数里面单个字母还挺正常的
    位运算看习惯就好,很多和 2 相关的运算,用位运算都比乘除要快。而且我看位运算的基本都有注释。
    sockpuppet9527
        10
    sockpuppet9527  
       2020-08-21 10:33:18 +08:00   ❤️ 1
    1. 局部变量单个字母命名:个人习惯问题,一般为单次首字母,看多了也习惯了,kernel 里面长词也会这样,打个比方,super block = sb , inode = i or n , Group Descriptors = gdt, Multiple mount protection = mmp
    2. 位运算:位运算很常见也很方便,如果不明觉厉我个人会认为这是你的问题,举个简单的例子:掩码,再举个简单的例子:两个 32 位变量支持 64 位变量。
    如果不用位运算,去写一大堆逻辑来支撑某个功能,那样做反而更复杂。
    3. 魔法值:不知道楼主说的是不是 Magic number 。如果是的话,那我想说,如果你是 jre 的维护者,你不考虑版本兼容问题?

    其他逻辑上的,大项目的基础功能都是这样的,面向的不是业务,考虑的东西以及开发的经验都是日积月累的。
    sockpuppet9527
        11
    sockpuppet9527  
       2020-08-21 10:38:59 +08:00
    @sockpuppet9527 #10 补充一下,JRE 最少还有注释,还不断重构。
    一些维护十年、二十年的开源项目注释都很少,patch 打的多了也不重构(开发者无精力),兼容多代的版本,兼容多个平台(指 OSX/WIN32/SUN/UNIX/LINUX),甚至因为 GCC 版本问题而弄得一些兼容(特指不通过 CONTAINER_OF 转型,直接强转)。这类看起来才是头大。
    开源就是这样的,如果面对单一业务线,精简很多,也不需要考虑那么多。
    chihiro2014
        12
    chihiro2014  
       2020-08-21 10:40:44 +08:00
    啊这,JDK 的东西和 JRE 有啥关系。JUC 里面的注释已经足够好了,至少市面上没有比他更好的文档。
    taogen
        13
    taogen  
    OP
       2020-08-21 10:45:16 +08:00
    @chihiro2014 JDK 包含 JRE,还有开发工具,以及 Java 文档。JRE 是运行时环境,主要包含是 Java 标准库代码和其它运行时的代码。
    chihiro2014
        14
    chihiro2014  
       2020-08-21 10:51:30 +08:00
    @taogen 啊这,长见识了
    cccy0
        15
    cccy0  
       2020-08-21 11:02:27 +08:00
    @yanzhiling2001 #4 现在装环境基本都是从这下载, 还是很不错的 ( 话说木兰是放上去搞笑的么
    j2gg0s
        16
    j2gg0s  
       2020-08-21 12:43:18 +08:00
    这种级别的东西,性能的优先级是远高于可读性的。

    另一个骚操作是提高参与门槛
    yanzhiling2001
        17
    yanzhiling2001  
       2020-08-21 12:47:40 +08:00
    @cccy0 鞭尸
    newmlp
        18
    newmlp  
       2020-08-21 13:34:22 +08:00
    是你水平太菜
    slyang5
        19
    slyang5  
       2020-08-21 14:10:53 +08:00
    有没有想过,是自己的水平不够呢 ?
    taogen
        20
    taogen  
    OP
       2020-08-21 14:20:35 +08:00
    @slyang5 可读性差是事实。水平一般也是事实。
    看过《 clean code 》,对代码的可读性深有感悟。我觉得性能固然重要,可读性也比较重要。
    有些对性能影响不大的地方,可以适当地提升可读性。如,变量的名称,if 条件用一个方法封装,function 代码的结构层次化。
    luxinfl
        21
    luxinfl  
       2020-08-21 14:40:14 +08:00
    觉得可读性差,自己照着写逻辑呗,多好
    xiangbohua
        22
    xiangbohua  
       2020-08-21 16:47:08 +08:00   ❤️ 1
    刚开始看吧,很容易发出这样的吐槽,对前人的代码要有敬畏心的嘛
    等你看熟了,你的关注点就不再是什么变量一个字母啊这种细节,而是这地方怎么打破双亲委派的模型了啊,这种问题
    Balthild
        23
    Balthild  
       2020-08-21 22:27:56 +08:00
    入职接手项目吐槽屎山的时候我也没见有多少人讲要敬畏前人的代码……

    想到了启功先生提出的书画鉴定七大忌:
    一、皇威
    二、挟贵
    三、挟长
    四、护短
    五、尊贤
    六、远害
    七、容众
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2600 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:07 · PVG 13:07 · LAX 22:07 · JFK 01:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.