《编写可读代码的艺术》读后总结分享

2015年5月27日晚19:45左右,我们开发小组开了一个分享会,会上靖哥哥做主要分享人,我负责记录大家讨论的精华部分,然后整理成文;本文包含了原书中的主要思想,也包含了我们小组的实战总结。

可读性基本定理

代码的写法应当使别人理解它的时间最小化。
这也是这本书的目标,简单说,好的代码应当易于理解。

如何使代码易于理解呢?可以从四个方面来改进:

一. 表面层次上改进:命名,注释和审美

要多问自己几遍:“这个名字会被别人解读成其他的含义吗?”要仔细审>视这个名字。

提到命名,看似简单,实则不易。名字是给人读的,不是给机器读的,所以不是说只要编译器编译通过就算完事了,还要看名字本身是否有助于别人理解它背后的意义。这里的名字包括,变量名,类名,方法名或者函数名。

最佳的命名是这样的:名字本身不能比它的含义大,也不能比它的含义小,要刚好包含它的含义,如果无法刚好包含,通常说明这个名字的意义太大,可能需要考虑拆分职责。

取名字往往需要仔细斟酌,要选择当前语境下最合适的词,比如:一个方法是取get,还是fetch,还是download呢?有时可能会实在找不出一个感觉很合适的词,职责划分也没啥问题,该怎么办呢?这时就需要和团队内的同事一起讨论,只要大家达成共识就行,即便大家选定的词仍无法准确表达背后的含义,以后团队内其它同事在阅读这个代码的也能迅速理解,毕竟大家曾经达成过共识,会留下印象。

程序代码的名字都是英文,我们中国人很多往往对英文的意思的细微差别难以分辨,但取好名字最重要的目的是让团队内的人看到的时候,能迅速理解,而不是给外国人去评估的,所以当你在写代码过程中,遇到起名字的困难时,请团队来讨论真的是个好方法,虽然团队的理解在外国人看来也不一定准确,但能让团队成员能比较容易的读懂你的代码。还记得可读性基本定理吗?当新人加入的时候,对于哪些看起来不那么准确的名字,可以鼓励新人在熟悉的代码的时候,说出自己的看法,新人也和大家一起达成共识,这也应该是融入团队文化的一部分。

注释的目的是尽量帮助读者了解得和作者一样多。

不过,不要为了注释而注释,当你准备加注释的时候,先问一个问题:

“我可以通过优化此处的代码,来让读者更明白这段代码的意思吗?比>如使用更合适的变量或者函数名,能做到吗?”

当你写代码的时候,需要留意如下应该写注释的情况:

  1. 加入有意义的评论,或者提示,让读者更清楚代码的背景,意图,成效等。比如:

// 出乎意料的是,对于这些数据用二叉树比哈希表快40%

再比如:

//TODO(dustin):处理除JPEG以外的图像格式

  1. 加入全局观的注释,或者总结性的注释

思考如下场景:有新人刚刚加入你的团队,她坐在你旁边,而你需要让她熟悉代码库。在你带领她浏览代码库的时候,你可能会指着某些文件或者某些类说这样的话:

“这段代码把我们的业务逻辑和数据库黏在一起了。任何应用层代码都不该直接使用它。”

“这个类看上去很复杂,但它实际上只是个巧妙的缓存。它对系统中的其它部分没有任何依赖。”
这样的一分钟的随意对话之后,你的新团队成员就知道的比她自己阅读源代码更多了。

而这正是应该写入注释中的信息。

  1. 克服“作者心理阻滞”

很多程序员不喜欢写注释,因为觉得会花很多时间。其实当你在写代码的时候,遇复杂问题时,把你的所思所想要精要的话写出来,就可以了,这些话往往正是读者在阅读的时候所需要的。

例如:

//小心:这段代码不会处理列表中的重复(因为这很难做到)

有时自己的所思所想有点混乱,尝试用精要的注释来整理你的思路是个好办法。

有时写出言简意赅的注释也很困难,也要像重构代码一样重视它们,重视它们就是重视你的同事。

顺便提一下代码美化相关的,代码美化也能辅助读者快速理解代码。有三条原则:

  1. 使用一致的布局,让读者很快就习惯这种风格。

  2. 让相似的代码看上去相似

  3. 把相关的代码行分组,形成代码块。

二. 简化循环和逻辑

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

有几种方法可以让代码的控制流更易读。

在写一个比较时
> while (bytes_expected > bytes_received)
把改变的变量写在左边并且把更稳定的变量写在右边更好一些
> while (bytes_received < bytes_expected)

你也可以重排if/else的语句中的语句块。通常来讲,先处理正确的/简单的/有趣的情况。有时这些准则会冲突,但是当不冲突时,应当遵守这些准则。

尽量避免嵌套的代码块。应该把它们改成更加线性的代码来避免深嵌套。

通常来讲提早返回可以减少嵌套并让代码整洁。

要把超长的表达式拆分成更加容易理解的小块。
减少不必要的变量。
减少每个变量的作用域,越小越好。
如果有些变量的值不会发生变化,最好明确指出。比如,加上const, final类似的修饰。

三. 重新组织你的代码

  • 抽取出那些与程序主要目的“不相关的子问题”,单独成为一个函数。
  • 使每个函数只做一件事,每个变量只关心一个唯一的意义。
  • 先用自然语言描述代码,然后用这个描述来帮助你找到更整洁的解决方案。(通常你这时的描述,都可以作为注释)

这三条看似简单,实则需要训练,通常只要在写代码的过程中反复思考,回想这些建议,就会有意想不到的收获。好的的程序员往往一步三回头,也就是每写一部分代码的时候,他都会回头看看曾经的设计思路是否仍旧适合,是否需要调整,当下的代码逻辑是否足够清晰,是否需要重新整理,这些问题看似多,但当思考的多了,并以成为习惯,这些思考过程往往会缩短成直觉反应,直觉会告诉你该怎么做,你就会发现自己异常高效,因为写出的代码相当优美,大大节省后期维护时间。

少写代码,别费神实现你不需要的功能

通常我的经验是,不要做过早设计和实现,让你的设计最小化,只要你确信现在的设计能够完全胜任现在的需求,而且能在不重做的情况下满足未来新增需求,比如未来改动少量代码和新增一些代码,就可以了,没必要现在就为未来编码,因为未来太不确定,代码上做太多准备,可能会造成很大的浪费。

尽量保持代码的小巧,不要冗余代码;
删除没用的代码,即便将来50%的可能性会再有用,也不要手软。
熟悉你周边的库,不要重新发明轮子

站在今天对未来的预估,总是存在很大差距,可以先把这些暂时没用的代码放在另外的代码仓库里,需要用的时候再拿出来,不要让它成为你阅读代码和维护代码的障碍。

End

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 万事开头难,好久没有正经写过什么东西了,but什么东西都是逼出来的,buddy给我布置了寒假小作业,so,写写试试...
    随风老童阅读 823评论 7 2
  • 前言:人生有很多第一次,作为一只不谙世事的小程序媛,第一次踏出校门,开始实习,感触良多,其中,颇为震撼的一点是,原...
    sunnyaxin阅读 949评论 3 4
  • 文风草书美人图,巴西太守新亭侯。 断喝曹军千余骑,出征暴酒失英雄。 【2016,9,22。三古月南】
    三古月南阅读 247评论 0 1
  • Map不由Collection接口派生,Map提供key到value的映射。一个Map中不能包含相同的key,每个...
    spiritTalk阅读 485评论 0 2
  • To be honest, I am glad that guy likes my moment massage....
    去社阅读 177评论 0 0