《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. ASP.NET MVC应用程序使用异步及存储过程

    ASP.NET MVC应用程序使用异步及存储过程 是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译 ...

  2. [Usaco2008 Jan]Cow Contest奶牛的比赛[神奇的FLOYD]

    Description FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平 ...

  3. [Usaco2008 Feb]Line连线游戏[暴力][水题]

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

  4. SQLSERVER利用FOR XML PATH实现分组拼接字符串

    首先看一下数据结构表 IF(OBJECT_ID('tempdb..#tProduct')IS NOT NULL) DROP TABLE #tProduct SELECT * INTO #tProduc ...

  5. win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)

    使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...

  6. [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成

    [字符串与数组] Q:Write a method to decide if two strings are anagrams or not 题目:写一个算法来判断两个字符串是否为换位字符串.(换位字 ...

  7. 迟到的 WPF 学习 —— 依赖项属性

    本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...

  8. EasyUI tree扩展获取实心节点

    <script type="text/javascript"> //扩展 获得tree 的实心节点 $(function(){ $.extend($.fn.tree.m ...

  9. MEF只导出类的成员

    MEF只导出类的成员 通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放 ...

  10. WampServer Mysql配置

    WAMP:Windows下的Apache+Mysql+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件.可点击此处下载WampServer,然后,按照提示安装WAMP.需要说 ...