编写可读代码的艺术 | 读后感

还记得当时在特训营听到的第一句话吗?

代码是给人看的,偶尔在机器上运行一下。

既然代码是给人看的,那么怎样才能让人看懂呢?于是便有了《编写可读代码的艺术》这本书。

全书共分为四个部分:表面层次的改进、简化循环和逻辑、重新组织代码,以及精选话题。

表面层次的改进

这部分主要关注于命名、审美、注释。

命名
  1. 把信息装到名字里 —— 读者通过名字就可以获得大量信息,即见明知意
    • 选择专业的词 —— eg:不用 get,使用 fetch 或 download
    • 避免空泛到底名字 —— eg:避免使用 tmp 等,除非有必须使用的理由。
    • 用具体的名字代替抽象的名字
    • 给变量名加上重要的细节
    • 为作用域大的名字采用更长的名字
    • 有目的的使用大小写
  2. 不会误解的名字 —— 读者根据名字可以体会到你的本意,而不会有其他的理解。
审美
  1. 存在多个代码块做相似的事情,让它们有同样的剪影。
  2. 把代码块按 “列” 对齐,让代码更容易浏览。
  3. 使用空行把代码分成逻辑上的 “段落”
注释

严格说来,当你的代码在命名方面符合见明知意,并且代码的审美也是比较好的,那么代码是不需要注释的,所以我跳过了该部分。

简化循环和逻辑

该部分本质和第一部分的目标是一样的,让循环和逻辑中的代码容易理解。

把控制流变得易读
  1. 使用 while 循环时,把改变的值写在左边,稳定的值写在右边。例如:
while(max < 30)
  1. 使用 if / else 时,先处理简单的情况。例如:
if (max < 30) {
  return max;
}
return max + 30;
  1. 三目运算符、do/while 循环会导致代码的可读性变差,尽量减少使用。
拆分超长的表达式

当某个表达式中含有较长的字表达式时,建议将该超长子表达式赋值给一个变量,然后将改变量作为表达式的变量。eg:

if line.split(':')[0].strip() == "root":
  ···

改为:

username = line.split(':')[0].strip();
if username == "root":
  ···

其好处:

  • 将巨大的表达式拆成小段
  • 通过简单的名字描述子表达式,让代码更具可读性
  • 帮助读者识别代码中的主要概念
变量与可读性
  1. 减少变量,即减少那些妨碍的变量
  2. 减少每个变量的作用于,越小越好。把变量移到一个有最少代码可以看到它的地方。
  3. 只写一次的变量更好。那些只设置一次值的变量,使得代码更容易理解。

重新组织代码

前面都在对代码做出微小的改动,该部分会讨论函数级别将对代码做出更大的改动。

抽取不相关的子问题

把一般代码和项目专有的代码分开。使得最后大部分都是一般代码,通过建立一大组库和辅助函数来解决一般问题,剩下的只是让程序与众不同的核心部分。

Eg:项目中常常会有个专门的目录( util )来存放项目中用到的工具类,目录(exception)来存放项目中使用异常类,etc。

一次只做一件事

在你的代码中存在某个超长的函数,此时,你可以拆分该函数,从中抽取子函数,使得每个子函数只做一件事。以此来简化函数中的逻辑。

把想法变成代码

用自然语言描述程序,然后用这个描述来帮助你写出更自然的代码。需做到一下几点:

  1. 能够清楚的描述逻辑
  2. 了解库函数
  3. 把这个方法应用于更大的问题
少写代码

代码库的代码越多,则越重,在其上开发也就越难,同时每行新代码都要测试赛、写文档和维护。因此我们需要做到以下几点,来实现少写代码:

  1. 从项目中消除不必要的功能,不要过度设计。
  2. 重新考虑需求,解决版本最简单的问题,只要能完成工作就行。
  3. 经常性地通读标准库的整个 API,保持对它们的熟悉程度。

精选话题

前面我们讨论了很多增强代码可读性的要点,在这部分我将其应用于实践中。

测试与可读性

代码的可读性很重要,测试代码的可读性同样主要重要。因此为了改进测试,我们需要做到以下几点:

  1. 每个测试的最高一层应该是越简明越好。最好每个测试的输入/输出可以用一行代码来描述。
  2. 如果测试失败了,它所发出的错误消息应该能让你容易跟踪并修正这个 bug。
  3. 使用最简单的并且能够完整运用代码的测试输入。
  4. 给测试函数取一个有完整描述性的名字,以使每个测试所测试到的东西很明确。
  5. 要使它易于改动和增加新的测试。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 第一部分 表面层次的改进 可读性代码的改进从 表面层次 的改进开始:选择好的名字、写好的注释、代码整洁的写成更好的...
    wyb1995阅读 949评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 第一部分 打好基础 Laying the Foundation 第一章 欢迎进入软件构建的世界 Welcome t...
    白桦叶阅读 4,627评论 0 17
  • 老樟树下乘凉的乡村们,悠闲安乐。,总是来去匆匆,总是没有好好感受和品味你的美,我亲爱的老家。 早晨的阳光穿过老樟树...
    涛声远去阅读 444评论 0 0
  • 勇于接触一些正能量的事物或人,多尝试,多去接触,总是能够找到自己所适合,所喜欢的东西的。总是能够有所收获的。 拉拖...
    念诺阅读 186评论 0 0