细节决定成败
Part 1
代码应当易于理解
比下面的代码好:
return index >= 0 ? params * 10 : params * 5;
它比下面这段要好些还是差些?
if (index >= 0) {
return params * 10;
} else {
return params * 5;
}
代码的写法应当使别人
理解它所需的时间最小化
assert((!(k = foo(key))) || !k->IsObj());
理解起来要比两行代码花更多时间:
k = foo(key);
if (k != NULL) assert(!k->IsObj());
PART 2
把信息放到名字里
send deliver dispatch announce distribute routefind search extract locatestart launch create begin openmake create set up build generate comp
1. 选择专业的词
2. 避免泛泛的名字
3. 用具体的名字代替抽象的名字
比如建立和使用一个特殊的本地数据库作为本地
日志输出,run_locally这个名字只表达了模糊的
操作位置,却无法表示具体的作用, use_local_database就比较合适了.
4.用前缀或后缀来给名字附带更多信息
delay_ms 表示了延迟的时间单位
PART 3
不会误解的名字
例子:Filter()
假设你在写一段操作数据库结果的代码:
results = Database.all_objects.filter("year <= 2011")
结果现在包含哪些信息?
• 年份小于或等于2011的对象?
• 年份不小于或等于2011年的对象?
推荐用 min 和 max 来表示(包含)极限
命名极限最清楚的方式是在要限制的东西前加上
max_或者min_
1. 不会误解的名字是最好的名字
对于包含的范围,first和 last 是好的选择。
对于包含 排除范围, begin 和 end 是最好的选择,
因为它们最常用。
PART 4
审美
Key:
1. 重新安排换行保持一致和紧凑。
2. 用方法整理不规则的东西。
3. 在需要时使用列对齐。
4. 选择一个有意义的顺序,始终一致的使用它。
5. 把声明按块组织起来。
6. 把代码分成段落。
7. 个人风格与一致性。
修改后
再举一个例子
这样不仅让代码更有美感,而且还有几个附带作用:
1.消除了大量重复代码,让代码变的紧凑。
2.让代码的重要部分变的直白(名字和错误字符串),更改过后一眼就能分辨。
3.添加新的测试将会简单。
PART 5
该写怎样的注释
通常来讲,我们不需要“拐杖式注释”——试图粉饰可读性差的代码的注释。
写代码的人常常把这条规则表述为:
好代码 > 坏代码 +好注释。
1 . 为瑕疵写注释。
可以在代码需要改进或者未完成的时候编写注释
有几种标记在程序员中很流行:
TODO: 我还没处理的事情。
FIXME: 已知无法运行的代码。
HACK:对一个问题不得不采用的比较粗糙的解决方案。
XXX: 危险!这里有重要问题。
2 . 为常量加注释。
需要描述清楚它是什么或者为什么它是这个值的原因,因为以后调整
这个变量的人可能需要知道调整的规则,另外对一个高精度调整过的
值可能不应该大幅调整,诸如此类的原因。
3 . 站在读者上的立场上思考