吐槽一下 Java JRE 的源码可读性有点差 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
taogen
V2EX    程序员

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

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

    想了解一下 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
    你只是站在自己角度觉得可读性差,站在作者角度,说不定人家觉得很好。
    40EaE5uJO3Xt1VVa
        4
    40EaE5uJO3Xt1VVa  
       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
    你才搞了几年,写底层的搞了多少年,不是说资历就是能力,而是人家这么做一定有道理,底层必然优先性能,可读性靠边站,参考这个

    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
    这种级别的东西,性能的优先级是远高于可读性的。

    另一个骚操作是提高参与门槛
    40EaE5uJO3Xt1VVa
        17
    40EaE5uJO3Xt1VVa  
       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     Solana     5359 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 08:52 PVG 16:52 LAX 01:52 JFK 04:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86