《The Art of Readable Code》
- Dustin Boswell, Trevor Foucher    O'Reilly出版

整体认知:
这本书写得很好,每一章后面的总结,很简练,很到位。

问题:
什么样的代码才是可读性好的代码?
- 书中给出的衡量标准是,让新手读你的代码,看从开始读到完全理解所花的时间,时间越少说明代码可读性越好。
   这里的新手,也指之后需要维护你写的代码的同事,或者几个月之后重新审视代码的你自己。

什么样的命名是好的命名呢?
 - 名字包含所需的信息,新手看了很容易理解。

如何才能取个好的名字呢?
- 具体来说有:
 1. Use specific words
    a. GetPage(url) → FetchPage() or DownloadPage()
    get太普通,并没有太多具体意思。
    b. int BinaryTree::Size();  → Height() or NumNodes() or MemoryBytes()
 2. Avoid generic names, like tmp and retval,
 3. Prefer concrete names over abstract names
    e.g.  name a fun which test whether the server can linsten on a given TCP/IP port
    ServerCanStart()  -- NG
    CanListenOnPort() -- Good

  e.g. 定义了一个C++宏,目的是禁止类重载拷贝构造函数和复制构造函数。
    #define DISALLOW_EVIL_CONSTRUCTORS(ClassName) \  -- NG
        ClassName(const ClassName&); \
        void operator=(const ClassName&);

#define DISALLOW_COPY_AND_ASSIGN(ClassName) ... -- Good

e.g. 一个命令行程序,在本地跑的时候加上一个参数能够输出额外的debug信息,但是耗时间,
   在服务器上跑时,就不加上参数。
    --run-locally  -- NG
    --extra_logging    --Good
    --use_local_database --Good
    4. attach important details, 例如一个变量如果是表示时间并且是毫秒单位,可以加上_ms后缀
  给一个待处理的字符串,加上raw_前缀等。
    5. 变量名的长短根据可见范围来定。简单的循环变量用i,j,k就可以了,但是函数的变量或类的变量
      要考虑包含更多信息。
    6.利用语言特有的约定。比如大写、下划线和连字符分别在什么情况下用,在部门里统一即可。
       例如: html里class用-连接,id用_连接。再有js里jquery变量,加上前缀$等。

如何才能取个不让人误解的名字? (chap 2)

    0. Think about what other meanings could someone interpret from this name?
    results = Database.all_objects.filter("year <= 2011")
     -> select()     ==> to pick out
        exclude() (my exp: filterOut()) ==> to get rid of
    eg.

def Clip(text, length):
        ...
    -> Truncate(text, length) -> Truncate(text, max_chars)

1. Prefer min & max for (inclusive) limits
    e.g.
    CART_TOO_BIG_LIMIT = 10
    if shopping_car.num_items() >= CART_TOO_BIG_LIMIT [bug, should be >]
         Error("Too many items in cart.")
    -> MAX_ITEMS_IN_CART = 10

2. prefer first & last for inclusive ranges -> [first, last]
    e.g.
    print integer_range(start=2,stop=4)   [bad]
    print integer_range(first=2,last=4)   [good]
    set.PrintKeys(first="Bart", last="Maggie")

comment: unlike stop, word last is clearly inclusive

prefer begin & end for inclusive/exclusive ranges -> [begin, end)
    e.g. PrintEventsInRange("OCT 16 12:00am","OCT 17 12:00am")

3. naming booleans
    e.g.
    bool read_password = true;  [bad, ambiguous]

-> bool need_password;
       bool user_is_authenticated;

comment: In general, adding words like is, has, can, or should can make booleans more clear

e.g. SpaceLeft()
    -> HasSpaceLeft()

It's best to avoid negated terms in a name.

bool disable_ssl = false;
    -> bool use_ssl = true;

4. Matching expectations of users

e.g. get*()  用户的预期是简单操作,获取某个变量的值

double getMean() {   [bad]
        ...
    }

-> computeMean()   [good, 听起来像个更重更耗时的操作]

e.g. list::size()

void ShrinkList(list<Node>& list, int max_size) {
        while (list.size() > max_size) { // bug, O(n)
            FreeNode(list.back());
            list.pop_back();
        }
    }

怎么样的布局是美的呢?如何利用(空格/换行/注释)使得代码更易读? (Chap 4)

0. 总的方法
        - consistent layout
        - make similar code look similar
        - group related lines
    一些示例如下:
e.g.1 bad

e.g.1 good

e.g.1 better

1. column alignment
    2. pick a meaningful order, use it consistently
      - in the order of <input> fields in HTML
      - "most important" -> "least important"
      - alphabetically
    3. organize declarations into blocks
    e.g.2 bad

e.g.2 good

4. break code into "paragraph"
    e.g.3bad

e.g. 3 good

    5. personal style vs consistency
    e.g. 有些人喜欢将方法或类的起始括号放在一行,有人喜欢另起一行
        正确做法是遵从project的规定

idea: Consistent style is more important than the "right" style

如何利用注释使代码更可读?(chap 5)

    0.注释的作用, 帮助读者尽可能多的知道作者做了什么
    - know what not to comment
    - record your thoughts as you code
    - put yourself in the reader's shoes, to imagine what they'll need to know

1. what not to commet
    读注释需要时间; 注释需要占用屏幕空间,所以尽可能避免无用注释(一眼就能看出来的, "what/how")
    good code > bad code + good comments

2. record your thoughts
    - Include "Director Commentary"
    - Comment the flaws in your code
       TODO: / FIXME: / HACK: / XXX:
    - comment on your constants
        The "story" for how a constant got its value

3. put yourself in the Reader's shoes

Think ahead about a function/class
    - What is surprising about this code?
    - How might it be misused?

e.g. 5.1.2 no comment cause question

e.g. 5.1.2 solution

e.g. 5.1.3 sample
   

e.g. 5.1.4 sample

4. summary comments

e.g. 5.1.5 sample of summary comments

It's especially helpful to have summary comments in longer functions where there are a few large "chunks" inside

e.g. 5.1.6 sample of summary comments

知道了注释写什么之后如何写更好呢?(chap6)

    0. comments should have a high information-to-space ratio.

如何写好流程控制语句(if-else/switch/while/for)使得代码更可读些?

读书笔记之《The Art of Readable Code》的更多相关文章

  1. 《HTML5与CSS3基础教程(第8版)》

    <HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro    ...

  2. HTML5与CSS3基础教程(第7版) 高清PDF扫描版​

    HTML5与CSS3基础教程(第7版)试读不仅介绍了文本.图像.链接.列表.表格.表单.多媒体等网页元素,也介绍了如何为网页设计结构.布局,添加动态效果.格式化等形式,此外还涉及调试和发布.聚合和吸引 ...

  3. HTML5与CSS3基础教程(第8版) PDF扫描版​

    <HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...

  4. 【02】HTML5与CSS3基础教程(第8版)(全)

    [02]HTML5与CSS3基础教程(第8版)(全)   共392页.   (魔芋:大体上扫了一遍.没有什么新东西,都是入门的一些基础知识.) 已看完.       [美]elizabeth cast ...

  5. HTML5与CSS3基础教程第八版学习笔记11~15章

    第十一章,用CSS进行布局 开始布局注意事项 1.内容与显示分离 2.布局方法:固定宽度和响应式布局 固定宽度,整个页面和每一栏都有基于像素的宽度 响应式布局也称为流式页面,使用百分数定义宽度 3.浏 ...

  6. HTML5和CSS3基础教程(第8版)-读书笔记(3)

    第11章 用CSS 进行布局 网站设计主要有两大类型:固定宽度和响应式. 对于固定(fixed)布局,整个页面和每一栏都有基于像素的宽度.顾名思义,无论是使用移动电话和平板电脑等较小的设备查看页面,还 ...

  7. HTML5和CSS3基础教程(第8版)-读书笔记(2)

    第7章 CSS构造模块 7.1 构造样式规则 样式表中包含了定义网页外观的规则.样式表中的每条规则都有两个主要部分:选 择 器(selector) 和 声 明 块(declaration block) ...

  8. HTML5和CSS3基础教程(第8版)-读书笔记

    第1章 网页的构造块 一个网页主要包括以下三个部分: n        文本内容(text content):在页面上让访问者了解页面内容的纯文字. n        对其他文件的引用(referen ...

  9. HTML5和CSS3基础教程(第8版)-读书笔记(4)

    第16章 表单 表单有两个基本组成部分:访问者在页面上可以看见并填写的控件.标签和按钮的集合:以及用于获取信息并将其转化为可以读取或计算的格式的处理脚本. 基本的表单字段类型包括文本框.单选按钮.复选 ...

  10. 读书笔记之《HTML5 与 CSS3 基础教程》

    1· 读前预期 考虑到对于 Web 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...

随机推荐

  1. Entity Framework,TransactionScope 混合使用的问题讨论

    using (var ts = new TransactionScope()) { string connStr = "Data Source=.;Initial Catalog=Test; ...

  2. Windows Server 服务器安全配置

    Windows Server 服务器安全配置 好吧,我标题党了.我只了解一些基本的安全配置.如果你是大湿,请绕道或者给予我严厉的批评让我进步谢谢. 编辑这篇文章用的编辑器编辑的,当我单击查看的时候发现 ...

  3. Shards

    跟我一起云计算(5)——Shards   什么是sharding Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库 (server)上,从而缓解单一数据库的性能问题.不太严格的 ...

  4. C#串口通信程序详解

    C#串口通信程序详解 摘要:创建C#串口通信程序需要注意什么呢?创建C#串口通信程序的步骤是什么?那么本文就向你详细介绍创建C#串口通信程序集体的内容. 在.NET平台下创建C#串口通信程序,.NET ...

  5. 一维数组的 K-Means 聚类算法理解

    刚看了这个算法,理解如下,放在这里,备忘,如有错误的地方,请指出,谢谢 需要做聚类的数组我们称之为[源数组]需要一个分组个数K变量来标记需要分多少个组,这个数组我们称之为[聚类中心数组]及一个缓存临时 ...

  6. DDD社区官网

    DDD社区官网上一篇关于聚合设计的几个原则的简单讨论: 聚合是用来封装真正的不变性,而不是简单的将对象组合在一起 聚合应尽量设计的小 聚合之间通过ID关联 聚合内强一致性,聚合之间最终一致性 从聚合和 ...

  7. 前端css:“圣杯布局”

    昨天面试前端,一面危险通过,面试官建议我看看“圣杯布局”,听起来很玄妙的名字,花了一晚上弄明白怎么回事,惊讶于前端工作的细节和技巧! 我先看几个基础,在后面要用到的: 1.CSS right/left ...

  8. Router

    backbone库学习-Router backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来 ...

  9. jQuery Easing 动画效果扩展

    jQuery API提供了简单的动画效果如淡入淡出以及自定义动画效果,而今天我给大家分享的是一款jQuery动画效果扩展增强插件jquery.easing.js,使用该插件可以实现直线匀速运功.变加速 ...

  10. eclipse plugin 导出插件包

    当我们的插件在完成一个阶段性开发的时候,我们要发布一个1.0的版本.这个时候会碰到一个问题.如何把我们的插件打成包?有多种途径,下面具体讨论一下. 首先从插件完成到被他人(或者我们自己)使用有两个步骤 ...