-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy path编写可读代码的艺术.txt
More file actions
90 lines (76 loc) · 3.17 KB
/
Copy path编写可读代码的艺术.txt
File metadata and controls
90 lines (76 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
1.把信息塞入名字中
使用专业的单词,例如不用Get,而用Fetch、Download更好
避免空泛的名字,像tmp,retval,除非使用它们有特殊的理由,例如泛型swap中临时变量。
使用具体的名字更细致地描述事物,ServerCanStart 比 CanListenOnPort更模糊。
给变量名带上重要的细节,例如带上单位_ms,或者在未处理的变量前面加上raw_。
为作用域大的名字采用更长的名字,屏幕有限对于几屏之间都可见的变量名要易于理解,只存在几行之间的变量用短一点的名字更好。
有目的地使用大小写,下划线等。类成员、局部变量后面加上_区分。。。
2.审美
使用一致布局,让读者很快习惯这种风格
让相似的代码看上去相似
把相关的代码行分组,形成代码块
一致的风格比正确的风格更加重要!
注释的目的是尽量帮助读者了解得和作者一样多。
不要为那些从代码本身就能快速推断带事实写注释。
3. 把控制流变得更加易读
比较语句:变量左,常量右
if/else 先处理正确,简单,易读达情况,通常是这样。
某些编程结构,三目运算符,do-while,goto通常会导致代码的可读性变差,最好别用。
do
{
continue; // 循环只执行一次
}while (a)
嵌套代码,每层嵌套都需要读者把更多的上下文“压入栈”。应该把它们改成更加线性的代码。
通常提早返回可以减少嵌套代码并让代码整洁,“保护语句”尤其有用。
4. 拆分超长的表达式
拆分长表达式,引入解释、总结类型变量,但是有一种例外:switch case中不能定义变量,
((layer*)ptr)->get_ref( ( ((layer*)ptr)->get_param() ) = 5;
拆分长表达式,遵循DRY原则,寻找相同的模式,通过函数、模版、宏层面优化。
5. 变量与可读性
减少变量
减少没价值变量
中间变量
控制流变量
缩小变量的作用域
避免 全局、局部命名冲突
让你的变量对尽量少对代码行可见
不同模块、类、函数、语句块
把变量移到最少代码可以看到的地方。
C++ if语句的作用域
Info* ptr = ReadBytes();
if ( info )
{
// ;;
}
if ( Info* ptr = ReadBytes() )
{
// ;;;
}
只写一次的变量更好
const,final修饰,不需要动脑筋考虑
6. 抽取不相关的子问题
将核心逻辑提取成函数以后,意料之外的好处:代码自成一体后改进它变得更容易。如添加功能,改进可读性,处理边界情况。
不相关子问题,不相交表示正交,
==人从某一点开始平庸,代码从某一念之间开始走向混沌==
符合DRY原则:do not repeat yourself.
接口尽量简洁,但是过犹不及。把握力度~
提升函数意料之外的好吃:
class Test{
map<str_t, int*> _block_map;
public:
int get_block(str_t key) {
return _block_map[key];
}
}
// ==> 方便增加缓存
class Test{
map<str_t, int*> _block_map;
int* _cached_block;
str_t _cached_key;
public:
int get_block(str_t key) {
if (_cached_key == key)
return _cached_block;
return _block_map[key];
}
}