<The Art of Readable Code> 笔记二 (上)
2024-08-26 20:20:21
第2章 封装信息到名字 (Packing information into names)
2.1 use specific words
GetPage() 不如 FetchPage() 和 DownloadPage() 更具体; BinaryTree 类中的 Size() 不如 Height()、NumNodes() 或 MemoryBytes() 更明确
class BinaryTree {
int Size();
...
}
同理,Thread 类中的 通常是 Kill(),而不是 Stop(),并且一般 Pause() 和 Resume() 成对出现
class Thread {
void Stop();
...
}
一些常用词语的替代词
send | deliver, dispatch, announce, distribute, route |
find | search, extract, locate, recover |
start | launch, create, begin, open |
make | create, set up, build, generate, compose, add, new |
2.2 avoid generic names
1) retval
下面的 retval 求的是 “平方和”,因此,用 sum_squares 代替更为合适
var euclidean_norm = function (v) {
var retval = 0.0;
for (var i = 0; i < v.length; i += 1)
retval += v[i] * v[i];
return Math.sqrt(retval);
};
2) tmp
tmp 合适的例子
if (right < left) {
tmp = right;
right = left;
left = tmp;
}
但是,下面这个 tmp 就不如改为 user_info 了
String tmp = user.name();
tmp += " " + user.phone_number();
tmp += " " + user.email();
...
template.set("user_info", tmp);
同样,下面的 tmp_file 也比 tmp 更为明确
tmp_file = tempfile.NamedTemporaryFile()
...
SaveDate(tmp_file, ...)
3) i, j, k
i, j, k 非常容易混淆,不如改为 clubs_i, members_i, users_i 方便,再次简化为 ci, mi, ui
for (int i = ; i < clubs.size(); i++)
for (int j = ; j < clubs[i].members.size(); j++)
for (int k = ; k < users.size(); k++)
if (clubs[i].members[k] == users[j])
cout << "user[" << j << "] is in club[" << i << "]" << endl;
2.3 use concrete names
例如,当监听端口时, ServerCanStart() 是抽象的,不如 CanListenOnPort() 具体
之前的谷歌规范中,为了避免 c++ 编译器自动生成拷贝构造函数和赋值算子,使用了如下宏:
class ClassName {
private:
DISALLOW_EVIL_CONSTRUCTORS(ClassName);
public:
...
};
其定义为:
#define DISALLOW_EVIL_CONSTRUCTORS(ClassName) \
ClassName(const ClassName&); \
void operator=(const ClassName&);
实际上,这个名字并不好,现在已经改为了 DISALLOW_COPY_AND_ASSIGN(ClassName)
c++11 中,由于 delete 关键字的引入,已经解决了此问题,无须使用该宏了。可参见 C++11 之 delete 和 default
最新文章
- JetBrains注册码计算(IntelliJ IDEA 15.0注册码激活)
- 华东交通大学2016年ACM“双基”程序设计竞赛 1009
- 2.html5的基本格式
- Test,Nginx Hello World Module
- [jquery]高级篇--获取div子元素
- UVA 10518 How Many Calls?
- java IoC
- Java基础学习笔记四 Java基础语法
- Python3 字符串与hex之间的相互转换
- MongoDB调优-查询优化-MongoDB Profiler
- android:应用性能优化SparseArray
- (转)python WSGI框架详解
- layoutSubviews相关总结
- 如何获取c:forEach里面点击时候的值
- 25+开源的在线购物软件(PHP, JavaScript 和 ASP.Net)
- Oracle 12C卸载图文教程
- windows兼容方式安装python[转]
- 用Eclipse进行远程Debug代码
- vscode环境配置
- Gradle Goodness: Working with Live Task Collection
热门文章
- 给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方
- luogu P4137 mex
- 【二分查找-最大化平均值】POJ2976 - Dropping Test
- 【manacher+FFT】BZOJ3160-万径人踪灭
- python3-开发进阶Flask的基础(2)
- noip200806火柴棒等式
- hihocoder编程收割赛20
- mysql 部分参数说明
- Redis-Linux安装
- Chrome浏览器video样式控制-隐藏下载按钮