编写可读代码的艺术笔记

编写可读代码的艺术

表面层次上的改进

命名、注释以及审美——可以用于代码库每一行的小提示。

简化循环和逻辑

在程序中定义循环、逻辑和变量,从而使得代码更容易理解。

重新组织你的代码

在更高层次上组织大的代码块以及在功能层次上解决问题的方法。

精选话题

把"易于理解"的思想应用于测试以及大数据结构代码的例子。

第1章:代码应当易于理解

1.代码应当易于理解。

2.代码的写法应当使别人理解它所需的时间最小化。

第一部分:表面层次的改进

第2章:把信息装到名字里

1.使用专业的单词。

2.避免空泛的名字。

3.使用具体的名字来更细致地描述事物。

4.给变量名带上重要的细节。

5.为作用域大的名字采用更长的名字。

6.有目的地使用大小写、下划线等。例如,在类成员变量后面加上“_”来区分局部变量。

第3章:不会误解的名字

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

2.命名极限最清楚的方式是要在限制的东西前面加上max_或者min_。

3.当为布尔值命名时,使用is和has这样的词来明确表示它是个布尔值。

4.要小心用户对特定词的期望。例如,用户期望get( )或者size( )是轻量的方法。

第4章:审美

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

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

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

第5章:该写什么样的注释

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

2.什么地方不需要注释:

  • 能从代码本身中迅速地推断的事实。
  • 用来粉饰烂代码的“拐杖式注释”——应该把代码改好。

3.你应该记录下来的想法包括:

  • 对于为什么代码携程这样而不是那样的内在理由(“指导性批注”)。
  • 代码中缺陷,使用像TODO:或者XXX:这样的标记。
  • 常量背后的故事,为什么是这个值。

4.站在读者的立场上思考:

  • 预料到代码中哪些部分会让读者说:“啊?”并且给它们加上注释。
  • 为普通读者意料之外的行为加上注释。
  • 在文件/类的级别上使用“全局观”注释所有的部分是如何一起工作的。
  • 用注释来总结代码块,使读者不致迷失在细节中。

第6章:写出言简意赅的注释

1.注释应当有很高的信息/空间率。

2.尽量精确地描述函数的行为。

3.在注释中用精心挑选的输入/输出例子进行说明。

4.声明代码的高层次意图,而非明显的细节。

5.用嵌入的注释(如Function(/*arg =*/...))来解释难以理解的函数参数。

6.用含义丰富的词来使注释简洁。

第二部分:简化循环和逻辑

第7章:把控制流变得易读

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

2.相对于追求最小化代码行数,一个更好的度量方法是最小化人们理解它所需的时间。

3.当你对代码做改动时,从全新的角度审视它,把它作为一个整体来看待。

4.嵌套的代码块需更加集中精力去理解。

第8章:拆分超长的表达式

1.把你的超长表达式拆分成更容易理解的小块。

2.要小心“智能”的小代码段——它们往往在以后会让别人读起来感到困惑。

3.帮助读者识别代码中的主要概念。

第9章:变量与可读性

1.减少变量,即那些妨碍的变量。

2.减小每个变量的作用域,越小越好。

3.只写一次的变量更好。(const、final、常量)使得代码更容易理解。

第三部分:重新组织代码

第10章:抽取不相关的子问题

1.看看某个函数或代码块,问问自己:这段代码高层次的目标是什么?

2.对于每一行代码,问一下:它是直接为了目标而工作吗?

3.如果足够的行数在解决不相关的子问题,抽取代码到独立的函数中。

把一般代码和专有代码分开:它使程序员关注小而定义良好的问题,这些问题已经同项目的其他部分脱离。

第11章:一次只做一件事

1.列出代码所做的所有“任务”。

2.尽量把这件任务拆分到不同的函数中,或者至少是代码中不同的段落中。

第12章:把想法变成代码

如果你不能把一件事解释给你祖母听的话,说明你还没有真正理解它。——阿尔伯特·爱因斯坦

编写更清晰的代码:

1.像对着一个同事一样用自然语言描述代码要做什么。

2.注意描述中所用的关键词和短语。

3.写出与描述所匹配的代码。

第13章:少写代码

1.从项目中消除不必要的功能,不要过度设计。

2.重新考虑需求,解决版本最简单的问题,只要能完成工作就行。

3.经常性地通读标准库的整个API,保持对它们的熟悉程度。

第四部分:精选话题

第14章:测试与可读性

1.每个测试的最高一层应该越简明越好。最好每个测试的输入/输出可以用一行代码来描述。

2.如果测试失败了,它所发出的错误消息应该能让你容易跟踪并修正这个bug。

3.使用最简单的并且能够完整运用代码的测试输入。

4.给测试函数一个有完整描述性地名字,以使每个测试所测到的东西很明确。例如:Test_<FunctionName>_<Situation>这样的名字。

表1:可测试性差的代码特征,以及它所带来的设计问题

特征 可测试性的问题 设计问题
使用全局变量 对于每个测试都要重置所有的全局变量(否则,不同的测试之间会互相影响) 很难理解哪些函数有什么副作用。没办法独立考虑每个函数,要考虑整个程序才能理解是不是所有的代码都能工作
对外部组件有大量依赖的代码 很难给它写出任何测试,因为要先搭起太多的脚手架。写测试会标胶无趣,因此人们会避免写测试 系统会更可能因某一依赖失败而失败。对于改动来讲很难知道产生什么样的影响。很难重构类。系统会有更多的失败模式,并且要考虑更多恢复路径
代码有不确定的行为 测试会很古怪,而且不可靠。经常失败的测试最终会被忽略 这种程序更可能会有条件竞争或者其他难以重现的bug。这种程序很难推理。产品中的bug很难跟踪和改正

表2:可测试性较好地代码的特征,以及它所产生的优秀设计

特征 对可测试性的好处 对设计的好处
类中只有很少或者没有内部状态 很容易写出测试,因为要测试一个方法只要较少的设置,并且有较少的隐藏状态需要检查 有较少状态的类更简单,更容易理解
类/函数只做一件事 要测试它只需要较少的测试用例 较少/较简单的组件更加模块化,并且一般来讲系统有更少的耦合
每个类对别的类的依赖很少;低耦合 每个类可以独立地测试(比对个类一起测试容易得多) 系统可以并行开发。可以很容易修改或者删除类,而不会影响系统其他部分
函数的接口简单,定义明确 有明确的行为可以测试。测试简单接口所需要的工作量较少 接口更容易让程序员学习,并且重用的可能性更大
时间: 2024-11-05 20:29:25

编写可读代码的艺术笔记的相关文章

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

表面内容 1.代码的写法应当是别人理解他所需的时间最小化.一条注释可以让你更快理解代码.尽管减少代码行数是一个好目标,但是八里街代码所需的时间最小化是一个更好的目标. 2.选择专业的词,比如函数名使用getxxx(),这个get没有表达出很多信息,是从缓存中得到?从数据库中得到?或者从网络得到?如果是网络,可以用更专业的fetchxxx()或者downloadxxx() 3.tmp,retval这样泛泛的名字,可以根据情况命名,比如tmpFile,让人知道变量是一个临时的文件.(tmp这个名字只

《编写可读代码的艺术》——简单总结

上个月好像冥冥中自有安排一样,我在图书馆看到这本 <编写可读代码的艺术> ( The Art of Readable Code) 期间因为工作的原因,停停看看,这几天终于看完了,可以大概总结如下: 1. 把信息装进名字里,给变量起个好名字 2. 审美,把代码分成段落,对齐 3. 应当取个好名字,而不是用注释去粉饰它 4. 用注释记录你的思想,比如当时为什么要这样写,记录开发过程中有哪些思考 5. 将自己代码中的不足和瑕疵记录下来,方便今后别人的维护,不要顾忌别人的看法! 6. 注释应该言简意赅

《编写可读代码的艺术》---变量和可读性

对变量的草率使用,会导致程序的难以理解,原因是以下几点 变量越多,就越难以全部跟踪他们的动向 变量的作用域越大,就需要跟踪它的动向越久 变量改变的越频繁,就越难以跟踪它的当前值. 下面来讨论如何改善这些问题. 1 减少变量 仅当我们需要的时候,才使用变量,下面将列举出一些没必要存在的变量的. 1.1 没有价值的临时变量 一般有经验的程序员是不会刻意写个没有价值的临时变量.造成临时变量没有使用价值的原因,可能是多次修修改改之后遗留的结果. 来个日期赋值的例子 DateTime now = Date

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

本书与代码整洁之道类似,强调的不是编程的技巧,而是代码编写的注意点. 有的开发者可能觉得自己的代码自己懂就比较好,不在乎变量和函数的命名以及缩进等等,但是这里的别人也可能是几个月后的自己! 因此,代码的可读性对于别人和自己都很重要. 本文内容 本书短小精悍,相比于<代码整洁之道>要薄的多,但是要注意的地方,基本也都讲明白了: 本书的主要内容如下: 有时候并不是代码越少,就越容易理解,也许多写几行代码比如三目运算符?和if/else,他们可以写出相同的逻辑,但是如果表达式很长,三目运算符显然更不

《编写可读代码的艺术》

本书干货很多,许多确实可行的建议,是都是写好代码的必经之路,下面为我总结的导图和部分章节的概述. 很好的一本书,推荐给大家. 总结思维导图 第二章 本章唯一的主题是:把信息塞入名字中.这句话的含义是,读者仅通过读到名字就可以获得大量信息. 使用专业的单词————例如,不用Get,而用Fetch或者Download可能会更好,这由上下文决定. 避免空泛的名字,像tmp和retval,除非使用它们有特殊的理由. 使用具体的名字来更细致地描述食物————server can start()这个名字就比

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

代码应当易于理解 代码的写法应当使他人理解它所需的时间最小化 把信息装进名字中 清晰和精确比装可爱好 使用专业的词 使用具体的名字来更细致地描述事物 给变量名带上重要的细节 为作用域大的名字采用更长的名字 有目的地使用大小写,下划线等 要多问自己几遍:"这个名字会被别人解读成其他的含义吗?" 要仔细审视这个名字,不会被误解的名字是最好的名字 命名极限最清楚的方式是在要限制的东西前加上max_或者min_ 为布尔值命名时,避免使用反义的词(例如disable_ssl) 要小心用户对特定词

编写可读代码艺术之表面层析

前言 4年前,我拒绝自己承认程序员,那时在8位MCU上用C语言处理ROM芯片时序问题. 1年前,我不承认自己是一个程序员,那时我在处理工业相机返回的三维数据. 现在,我不得不承认乐于去成为自己是一个程序员.工程师,程序员几乎无所不能,虽然很苦逼.程序员就要干程序员事,这篇就算小铺开张吧,写的不好,多多原谅. 如果说自己的编程历史,07年我在用C语言,09年我在用Verilog,11年我开始用C++.不管什么时候.什么语言,我对自己的基本要求是: 代码要有注释,代码架构要清晰. 但是在我看完<th

修改代码的艺术笔记

使用单元测试使修改代码变得简单. 在编程的时候考虑测试:使用类的方法来代替方法,这样可以通过在测试中编写继承类,改变相应方法的行为,达到避免执行某些函数的目的,更好的解依赖. 使用包含预处理的头文件来制造接缝.#ifdef TESTING...  endif 通过修改链接时的包含路径,另外的写专门用于测试的类.(最佳,清晰而且便于维护测试代码) 如果是函数调用的内部函数是多态的,通过基类的对象传参,通过测试对象控制内部函数的行为,而不要封装new来的对象在函数内部. 不用static和私有函数,

&quot;编写高质量代码&quot;一书笔记

css : base  :   共用样式 common: 通用控件样式 page: 页面级样式 js base 位于三层最底层,职责一是封装不同浏览器下js的差异,提供统一的接口,依靠它来完成跨浏览器兼容的工作,职责二是扩展js语言底层提供的接口,让它提供 更多更为易用的接口,base层是给common层和page层提供接口. common 位于三层的中间,依赖于base层提供的接口,common提供可供复用的组件,它是典型mvc模式中的M,和页面内的具体功能没直接关系,common层的功能是给