读书笔记之《The Art of Readable Code》
《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》的更多相关文章
- 《HTML5与CSS3基础教程(第8版)》
<HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro ...
- HTML5与CSS3基础教程(第7版) 高清PDF扫描版
HTML5与CSS3基础教程(第7版)试读不仅介绍了文本.图像.链接.列表.表格.表单.多媒体等网页元素,也介绍了如何为网页设计结构.布局,添加动态效果.格式化等形式,此外还涉及调试和发布.聚合和吸引 ...
- HTML5与CSS3基础教程(第8版) PDF扫描版
<HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...
- 【02】HTML5与CSS3基础教程(第8版)(全)
[02]HTML5与CSS3基础教程(第8版)(全) 共392页. (魔芋:大体上扫了一遍.没有什么新东西,都是入门的一些基础知识.) 已看完. [美]elizabeth cast ...
- HTML5与CSS3基础教程第八版学习笔记11~15章
第十一章,用CSS进行布局 开始布局注意事项 1.内容与显示分离 2.布局方法:固定宽度和响应式布局 固定宽度,整个页面和每一栏都有基于像素的宽度 响应式布局也称为流式页面,使用百分数定义宽度 3.浏 ...
- HTML5和CSS3基础教程(第8版)-读书笔记(3)
第11章 用CSS 进行布局 网站设计主要有两大类型:固定宽度和响应式. 对于固定(fixed)布局,整个页面和每一栏都有基于像素的宽度.顾名思义,无论是使用移动电话和平板电脑等较小的设备查看页面,还 ...
- HTML5和CSS3基础教程(第8版)-读书笔记(2)
第7章 CSS构造模块 7.1 构造样式规则 样式表中包含了定义网页外观的规则.样式表中的每条规则都有两个主要部分:选 择 器(selector) 和 声 明 块(declaration block) ...
- HTML5和CSS3基础教程(第8版)-读书笔记
第1章 网页的构造块 一个网页主要包括以下三个部分: n 文本内容(text content):在页面上让访问者了解页面内容的纯文字. n 对其他文件的引用(referen ...
- HTML5和CSS3基础教程(第8版)-读书笔记(4)
第16章 表单 表单有两个基本组成部分:访问者在页面上可以看见并填写的控件.标签和按钮的集合:以及用于获取信息并将其转化为可以读取或计算的格式的处理脚本. 基本的表单字段类型包括文本框.单选按钮.复选 ...
- 读书笔记之《HTML5 与 CSS3 基础教程》
1· 读前预期 考虑到对于 Web 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...
随机推荐
- Javascript多线程引擎(九)
Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...
- Android开发方法学
这是Cyril Mottier最近更新的一篇文章,原谅地址在这里:Android开发方法学. 这篇文章是他介绍自己所在项目小组(Capitaine Train Android Team)设计.开发时的 ...
- 如果gen.lib.rus.ec这个电子书下载站上不去了,那就用这个吧
如果著名的gen.lib.rus.ec这个电子书下载站上不去了,那就用这个吧: 万千合集站 http://www.hejizhan.com/ 里面除了镜像索引了gen.lib.rus.ec上的所有英文 ...
- 【ios开发】Block编程
1 什么是block iOS SDK 4.0开始,Apple引入了block这一特性.字面上说,block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传 ...
- GoLang获取struct的tag
GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...
- Event对象的事件句柄
<html> <!-- onresize 事件会在窗口或框架被调整大小时发生 --> <!--onresize="alert('窗口的大小得到变化就会执行我') ...
- nginx日志简单分析工具
自己有个tony6.com的服务器,上面挂着我的博客,web服务器是nginx. 由于最近一直在折腾python,所以简单写了个nginx日志分析工具,它可以分析出每个IP的点击数量和IP所在地. # ...
- ios开发实践之UIDatePicker(已对之前无法解决的问题做了解答)
需求:要做一个生日选择的控件,但除了选择之外还需要自定义几个控件,跟生日选择控件组合一起. 做法:自定义了一个UIImageView,并且作为背景.在这个背景view上再添加其他button和时间选择 ...
- Setting up Ubuntu in CoLinux–changing local/keyboard to be English
Today i installed the CoLinux with Ubuntu package, but the default locale setting of the system is G ...
- Oracle中复制表结构和表数据
一.复制表结构及其数据 create table new_table as (select * from old_table); 二.只复制表结构 create table new_table as ...