读书笔记之《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 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...
随机推荐
- 2014.3.4-C语言学习小结
位操作: 知识点: 1.位运算符 2.位移运算符 1.将指定位设置为12.将指定位设置为03.获取指定位的内容 ==========================复习二进制 1.二进制转换 10-- ...
- Windows使用SSH管理Ubuntu
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/manage-ubuntu-on-wind ...
- .NET平台技术体系
.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标 一 .NET平台技术体系梳理 .NET平台应用领域众多(桌面开发,web开发,移动开发),不断有新的编程爱好者开始学习或从其他平台转移到 ...
- 线程池python
原创博文,转载请注明出处 今天在学习python进程与线程时,无意间发现了线程池threadpool模块,见官方文档. 模块使用非常简单,前提是得需要熟悉线程池的工作原理. 我们知道系统处理任务时,需 ...
- 用django搭建一个简易blog系统(翻译)(三)
06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...
- Jenkins中关于一些插件的使用
Jenkins中关于一些插件的使用方法 最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用bui ...
- 使用js加载图像和setDataXML()加载数据
使用js加载图像和setDataXML()加载数据 前面一篇对FusionCharts进行了一个简单的介绍,而且建立了我们第一个图形,但是那个是在HTML中使用<OBJECT>和<E ...
- 【Chrome】如何在C++中增加给JavaScript调用的API
本文示例说明了如何在Chrome浏览器中增加JavaScript API.为了简化,先假设是在已有的namespace中增加一个新的API,文章的最后将指出如果增加一下全新的namespace所需注意 ...
- Linux:用at和crontab调度作业
一.有2种作业调度方式 1.突发性的,就是只运行作业一次而不是定期运行,使用at命令. 例如在进程A运行一段时间后关闭该进程. 2.定期运行,就是每隔一定的周期运行一次,使用crontab命令. 如每 ...
- 开源 免费 java CMS - FreeCMS1.4-功能说明-站点管理
下载地址:http://code.google.com/p/freecms/ 站点管理 FreeCMS支持网站群模式,并支持无限树级管理. 1. 添加一级站点 从左侧管理菜单点击站点管理进入. 提示 ...