我对于代码可读性的理解

查看 186|回复 18
作者:iamee   
总在这个论坛看到有人强调所谓的代码可读性,但后来我发现这些人在说的所谓可读性非常肤浅。
比如认为下面的代码中,方式 1 比方式 2 更可读。
// JavaScript
// 1
if (condition) {
    return true;
} else {
    return false;
}
// 2
return !!condition;
我的观点
一、代码是否可读与程序员的实际水平强相关
有效工作经验 5 年的程序员和有效工作经验 1 年的程序员对于可读性的理解是非常不同的(请注意是有效工作经验)。
这里举个 C 语言的例子,一个 C 语言的初学者和对 C 语言比较熟悉的人,对于下面这段代码的可读性的评价一定是非常不同的:
#define MAGIC_HEADER "tox3"
if (*(uint32_t *)p != *(uint32_t *)MAGIC_HEADER) {
    report_error("Bad magic header");
}
二、奇技淫巧的“度”在哪里?
[ol]
  • 凡事都有极端,过度使用一些不值得的技巧(比如对于可读性的损伤很大,但对性能并没有帮助)是没有意义的。
  • 取决于团队水平,最好不要在水平对于你来说过于低下而你又没有话语权的团队久留,会被同化。
    [/ol]
    三、我认为的可读性
    我认为,一份真正可读的代码,一定是代码中隐含的想法,而不是这段代码是用 if else 还是三目运算符。
    我读过很多优秀开源项目的代码。其中某些项目甚至充满了大家对于“屎山”的评价标准:魔数乱飞、代码格式乱七八糟,还有各种奇技淫巧。但当你真的读懂了作者的奇妙想法,知道了这个项目的优秀的性能来自于优秀的设计,知道了写出这样的一个项目需要掌握多少高深的知识,你真的还会觉得这是“屎山”吗?
    四、项目质量和个人成长息息相关
    如果你想获得有效的工作经验,一定要远离业务代码!!对于代码的良好品味,是很难通过看书习得的,唯一的途径就是参与一些水平远在自己之上的人领导的项目。如果确实没办法找到这样的工作,可以考虑在业余时间参与感兴趣的开源项目。

    代码, 可读性, return, 程序员

  • tool2d   
    "一定要远离业务代码", 太理想化了,公司招人进来,就是为了写业务代码。
    只能说,写业务代码也别太敷衍。一般来说,重构个几次后,能让自己满意就够了。
    同样是程序员,项目不用,语言不同,代码可能天差地别。
    Pipecraft   
    说的很好 👍
    iamee
    OP
      
    @tool2d 没办法,这就是现实。不能把话说死,但绝大部分业务项目都是屎山,参与这种项目对技术成长的帮助很有限。
    wu67   
    其实在 v 站刷的时间久了, 你就会发现其实程序员群体的素质也是良莠不齐的, 他们对可读性的理解自然不同.
    更离谱的是, 在互联网人、程序员群体占比较大的本站, 也能看到“关于敏感数据存储是否要加密”类似的贴, 还有人觉得没必要加密的...
    反正我已经 block 了十来个以前觉得技术还不错的人, 越是细节的问题, 越能体现出观点的不同...
    ZSeptember   
    为什么要远离业务代码,如何远离业务代码,什么不是业务。
    产品业务代码,还是做基础设施,只是业务领域不同而已,和代码可读性没有必然联系。
    产品业务代码烂,很多时候时候是因为代码质量当时不是最关键的问题而已。。
    可读性也远远不是用了什么技巧什么的就不可读了。
    最重要的是封装,,比如命名语义化,写的函数,类,单一职责什么的。只要你封装的好,内部是否用了什么技巧不影响阅读。
    Leviathann   
    什么叫远离业务?
    业务就是软件软件就是业务
    snarkprayer   
    读是行为,目的是理解意图,那么目标就应该是:容易理解+所有人的理解是一致的
    ```javascript
    // bad
    function delay(fn, time) {...}
    // good
    function delayExecute(fn, millisecond) {...}
    ```
    iamee
    OP
      
    @ZSeptember
    @Leviathann
    每个人对业务代码(贬义)的阈值不同,这里可以认为是对自己水平提升没有帮助的项目。
    yesterdaysun   
    我觉得得先统一一下, 什么叫"可读性"
    我觉得可读性是一个偏主观的指标, 抛却主观的部分, 一定有一些相对"客观"的部分, 否则就变成评价一段代码"美不美"这样纯主观的东西了
    就比如你提到有些"大神"的代码, 魔数乱飞、代码格式乱七八糟,还有各种奇技淫巧, 从我看来奇技淫巧我可以接受, 但是魔数乱飞、代码格式乱七八糟这些部分我不能接受, 我可以承认这段代码它能跑, 能得到结果, 写他的人是个高手, 但是你要我承认它"可读".
    即使这样, 我也不会要求它"可读", 为什么? 因为可能这个人写这段代码的目的就不是为了可读, 比如曾经看到大神些的计算圆周率的代码, 3 行代码, 一堆 a,b,c,d,e,f 的变量, 各种魔数, 但是就是算出圆周率 1000 位了, 他写这段代码的目的就是为了炫技, 就是为了做到最短代码, 极致的技巧, 这个时候, "可读"是不必要的, 甚至追求的就是不可读, 反而这里的奇技淫巧才是最重要的
    但是同样的, 搬砖人有机会写这样的代码吗? 是没有的, 工作环境下, 写出能跑的代码是第一要务, 其次是可维护性高的代码, 而"可读性"能间接或直接的提高"可维护性", 所以我们都在追求可读性, 其中我认为相对客观的指标有不使用魔数, 代码格式整齐, 括号整齐, 含义正确清晰的命名, 职责清晰的接口/类/函数的划分, 正确的数据结构, 相对主观的部分是使用高级的语言技巧(闭包, 生成器函数, 新的语法), 惯用的高级技法, 设计模式, 特定算法等等
    我觉得你要对达成什么样的可读性先定义好, 比如我随便写一段算法代码 dp[i][j]=dp[i-1][j-1], 懂算法的人看到这段代码, 立刻知道我是在做动态规划的递推方程, 对他来说这段代码的可读性很高, 你给他换个变量名, 换个写法, 他可能反而认不出来这段代码在干什么, 但是你给一个算法小白看这个, 他只会觉得"可读性"很差.
    所以就像你说的"可读性"是和什么人看有很大关系的, 如果只是追求自己"可读", 那就自己定标准, 如果是追求所有团队成员"可读", 那就要用你的影响力, 让他们接受这个标准, 如果是和论坛上的人讨论"可读", 那最好只讨论相对客观的标准, 主观的部分注定辩不出结果
    比如我说这个技巧可以 3 行变一行, 又非常简洁, 但是就会有人不认可, 比如我说这个设计模式这样用很好, 但是就有人说你滥用设计模式, 老老实实写不好么, 这些都辩不出个所以然. 但是如果有人使用奇奇怪怪的变量名, 拼错单词的名字, 大量使用魔数, 喷他就没问题, 就算他嘴硬硬杠, 也不用管他, 因为其实我们都知道这样肯定是有问题的, 顶多被甩几句"又不是不能用","能跑就行","我看得懂"之类的
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部