编写可读代码的艺术

写让人理解的代码

代码的写法应该使理解代码的人所需要的时间最小化

变量名

  1. 使用专业的词
  2. 避免使用空泛的词
  3. 给变量名带上附加信息
  4. 为作用域更大的变量起一个长的名字
  5. 有目的的使用大小写和下划线

让人不会误解的名字

不会误解的名字是最好的名字------------阅读代码的人应该理解你的本意,并且不会有其他的理解

  • 表示上下限:max min
  • 表示包含的范围:first last
  • 表示包含、排除某个范围:begin end

命名一个bool类型的值,应该使用 is 、has这样的词来明确它所表达的含义。避免使用反义词,比如disable。

要小心用户对特定词的期望,例如用户会认为get或者size 是一个轻量的方法。

写代码也需要审美

  1. 如果多个代码块做同样的事,尝试让他们有同样的剪影
  2. 把代码块按照 列 对齐可以让代码更容易阅读
  3. 如果一段代码中用到了A,B,C,那么在使用它们的下方就应该保持顺序一致性
  4. 使用空行将大段的代码分成逻辑上的"段落"

该写什么样的注释?

注释的目的是帮助读代码的人了解作者在写代码时的思想。

什么地方不需要注释

  • 能从代码本身中快速推断的事实
  • 用来装饰垃圾点(比如拗口的方法名),实际上应该把名称修改好

记录你的想法

  • 为什么代码写成这样而不是另一个样子的内在理由("指导性批注")
  • 代码中的不足,使用像TODO或者XXX这样的标记
  • 常量背后的意义,为什么是这个值?

在读者的立场思考

  • 预料到代码中哪些部分会让读者说:"哎嘿?什么鬼"给它们加上注释
  • 为小白意料之外的行为加注释
  • 在文件、类级别上使用"全局观"注释来解释所有部分是如何一起工作的
  • 用注释总结代码块, 让读者不会迷茫在细节里

如何写注释

  1. 不管你心里在想什么,先把它记录下来
  2. 读一下这段注释,看看它有什么需要改进的
  3. 不断改进

写言简意赅的注释

  • 当像"这里"和"it"这样的代词可能指代多个事物时,避免使用它们
  • 尽量精确的描述方法行为
  • 在注释中用精心挑选的输入/输出例子进行说明
  • 声明代码的高层次意图,而非明显的细节
  • 用含义丰富的词来使注释更加简洁

简化流程让代码容易阅读

  1. 写一个比较时,把改变的值放在左边,把确定的值放在右边
  2. 可以重新排列if else 代码块,优先处理正确的,简单的逻辑。有时这些准则会冲突,当不冲突时,遵循这些经验法则
  3. 像三目运算符,do while循环经常会导致代码可读性变差,最好不要使用它们,因为总是有更整洁的方式
  4. 嵌套的代码块需要花一些时间去理解,每层新的嵌套都会给读者"思维栈"push一条数据,应该让它们变得"线性",来避免深层嵌套
  5. 提早返回可以让代码更整洁

拆分又臭又长的表达式

引入"解释变量"代替较长的子表达式,有三个好处

  1. 它把巨大的表达式拆分成一个小段
  2. 通过简单的名字来描述一个子表达式,让代码文档化
  3. 它帮助读者识别代码中重要的概念
    用德摩根定理来操作逻辑表达式

变量与可读性

  1. 减少变量,通过立刻处理结果来消除中介变量
  2. 减少变量作用域,作用域越小越好
  3. 变量只写一次最好,只设置一次的变量会让代码变得更加容易理解

抽取无关的代码

一次只做一件事

把想法变成代码

少写代码

参考

  1. https://www.bilibili.com/video/BV1qs411L7tH/?p=4
相关推荐
Cyrus丶17 小时前
前端组件化开发指南(二)
前端·代码规范
陈陈陈建蕾5 天前
回顾前端 - 为多个小程序设计一个MonoRepo架构
前端·架构·代码规范
记忆深处的声音5 天前
vue2 + Element-ui 二次封装 Table 组件,打造通用业务表格
前端·vue.js·代码规范
y0ungsheep8 天前
CTF中的phar反序列化 [SWPU 2018]SimplePHP
运维·web安全·网络安全·php·代码规范
前端郭德纲12 天前
如何修改远程分支?修改了会影响什么?
git·github·代码规范
帅次14 天前
基于云平台的智能家居管理系统设计与通信协议分析
设计模式·重构·软件工程·软件构建·需求分析·代码规范·设计规范
是Yu欸20 天前
【深度学习代码调试5】标准化数据集:TensorFlow Datasets (TFDS)自动化数据加载与预处理
人工智能·python·深度学习·tensorflow·代码规范·1024程序员节
稍敛风翼21 天前
【知识】正反例分析面向对象的七大设计原则(超详细)
c++·代码规范·1024程序员节
PetterHillWater1 个月前
GitLab集成GPT进行自动化CodeReview实战
后端·gitlab·代码规范