天天看点

编写可读代码的艺术 读书笔记

编写可读代码的艺术

书名:编写可读代码的艺术

作者:Dustin Boswell & Trevor Foucher

译者:尹哲,郑秀雯

主要内容:

  • 简化命名、注释和格式的方法,使每行代码都言简意赅。
  • 梳理程序中的循环、逻辑和变量来减少复杂度并理清思路。
  • 在函数级别解决问题,例如重新组织代码块,使其一次只做一件事。
  • 编写有效的测试代码,使其全面而简洁,同时可读性更高。

前言

可读性基本定理:代码的写法应当使别人理解它所需的时间最小化。

第一部分 表面层级的改进

把信息装在名字里

关键思想
无论命名变量、函数还是类,把信息装在名字里。
           
  • 选择专业的词
  • 避免空泛的名字
  • 用具体的名字代替抽象的名字
  • 使用前缀或后缀来给名字附带更多信息
    • 后缀如计量单位
  • 决定名字的长度
    • 不要为了短而使用一些对新同事不友善的缩写
  • 利用名字的格式来表达含义
    • 有目的的使用大小写、下划线等

不会误解的名字

关键思想
要多问自己几遍:“这个名字会被解读成其他的含义吗?”要仔细审视这个名字。
           
  • 不要使用二义性单词作为名字
  • 推荐用min和max来表示极限
  • 推荐用first和last来表示包含的范围
  • 推荐用begin和end来表示包含/排除范围
  • 使用is和has这样的词来明确表示它是布尔值,避免使用反义的词
  • 遵从行业习惯

审美

使用一致的布局,让读者快速习惯代码风格。
让相似的代码看上去相似。
把相关的代码行分组,形成代码行。
           
  • 重新安排换行来保持一致和紧凑
  • 用方法来整理不规则的东西
  • 在需要时使用列对齐
  • 选一个有意义的顺序,始终一致的使用它
    • 让变量的顺序与对应的HTML表单中字段的顺序相匹配
    • 从“最重要”到“最不重要”排序
    • 按字母顺序排序
  • 把声明按块组织起来
  • 把代码分成“段落”
  • 一致的风格比“正确”的风格更重要

该写什么样的注释

关键思想
注释的目的是尽快帮助读者了解得和作者以一多。
           
  • 不要为了注释而注释
  • 代码之美而不是注释之美
  • 不要为能快速推断出的事实写注释
  • 给常量加注释
  • 为代码中的瑕疵加注释
  • 记录自己有价值的简介
  • 公布可能的陷阱
  • “全局观注释” 解释类之间的协作,数据流流程,项目入口等
  • “总结性注释”

写出言简意赅的注释

关键思想
注释应当有很高的“信息/空间率”
           
  • 让注释保持紧凑
  • 避免使用不明确的代词
  • 润色粗糙的句子
  • 精确的描述函数的行为
  • 用输入/输出例子来说明特别的情况
  • 声明代码的意图
  • “具名函数参数”的注释
  • 采用信息含量高的词-

第二部分 简化循环和逻辑

把控制流变得易读

关键思想
把条件、循环以及其他对控制流程的改变做得越“自然”越好,运用一种方式使读者不用停下来重读的代码。

相对于追求最小化代码行数,一个更好的度量方法是最小化人们理解它所需的时间。
           
  • 条件语句中的参数的顺序
    • 比较的左侧 “被问询的”表达式,它的值更倾向于不断变化
    • 比较的右侧 用来做比较的表达式,它的值更倾向于常量
  • if/else语句块的顺序
    • 首先处理正逻辑而不是负逻辑的情况
    • 先处理掉简单的情况
    • 先处理有趣的或者是可疑的情况
  • ?:条件表达式(三目运算符)
    • 默认情况下都用if/else,三目运算符?:只有在最简单的情况下使用。
  • 避免do/while循环
  • 从函数中提前返回
    • 有些程序员认为函数中永远不应该出现多条return语句,这是胡说八道。从函数中提前返回没有问题,而且常常很受欢迎。
  • 最小化嵌套
    • 当你对代码做改动时,从全新的角度审视它,把它作为一个整体来看待
    • 通过提早返回来减少嵌套(if:return; for:continue)

拆分超长的表达式

关键思想
把你的超长表达式拆分成更容易理解的小块。
           
  • 用作解释的中间变量
  • 总结变量 只是用一个短很多的名字来代替一大块代码
  • 使用德摩根定理
  • 不要滥用短路逻辑
    • 要小心“智能”的小代码块——它们往往在以后会让别人读起来感到困惑。

变量和可读性

  • 减少变量
  • 缩小变量作用域
  • 常量使得代码更容易阅读

第三部分 重新组织代码

抽取不相关的子问题

关键思想
把通用代码和项目专有代码分开。
           
积极地发现并抽取不相关的子逻辑:  
(1)看看某个函数或代码块,问问你自己:这段代码高层次的目标是什么?  
(2)对于每一行代码,问一下:它是直接为了目标而工作的吗?这段代码高层次的目标是什么?  
(3)如果足够的行数在解决不相关的子问题,抽取代码到独立的函数中。  
           
  • 纯工具代码
  • 其他多用途代码
  • 通用代码
  • 项目专有的功能
  • 简化已有接口
  • 按需重塑接口
  • 过犹不及

一次只做一件事

关键思想
应该把代码组织得一次只做一件事情。
           

把想法变成代码

如果你不能把一件事解释给你祖母听的话说明你还没有真正理解它:

  • 对着一个同事一样用自然语言描述代码要做什么
  • 注意描述中所使用的关键词和短语
  • 写出与描述所匹配的代码

少写代码

  • 质疑和拆分你的需求
  • 保持小代码库
  • 熟悉开源项目

继续阅读