变量命名的最高原则:真实物理意义。
- 形式最好要统一:img_idx ⇒ row_idx ⇒ col_idx
- 不要太介意变量名称的长度,其长度如果能换来含义的清晰,还是值得的。
- 变量的命名是一完整语句的简练版:
- with_**,without_**
- 常见简写
- acc ⇒ access,accumulate
- cur ⇒ current,
- reps ==> 代表,cands ==> 候选(candidate,候选者)
前缀与后缀:
pre-:pre- 开头的函数或者变量名,通常会在程序的核心流程之前发生、进行;
比如事先的排序;
void precalc(){ sort(A, A+n); }
0. 简短而具有描述性
- name 要好于 n
- student_name 要好于 s_n
- name_length 则要好于 length_of_a_student_name
1. 初始值的命名
如牛顿拉普生方法求解方程的根时对初始值的命名及赋值,
double guess;
// 猜测值,大概值
比如求解
cos(x)−x3=0
cos
(
x
)
−
x
3
=
0
或者简单的代数分析, −1≤cos(x)≤1⇒−1≤x3≤1⇒−1≤x≤1 − 1 ≤ cos ( x ) ≤ 1 ⇒ − 1 ≤ x 3 ≤ 1 ⇒ − 1 ≤ x ≤ 1 ,或者数形结合,简单的绘图,我们定义初始值为 0.5:
double guess = 0.5;
while (abs(f(guess)) > 1e-9)
guess -= f(guess)/f_prime(guess);
2. 变量的命名:实际意义
- stride:表示步长,tol:total
- num_**:表示什么什么的数目
- **num:表示什么什么号
patch 表示块,batch 表示批, numPatches:patch 的数目
batchNumPatches:num patches per batch
所以 numPatches / batchNumPatches = batch 的数目; - duration:持续的时间,time:则表示时刻;
3. 变量的命名:动词
- “unroll” :flatten and concatenate
- make:
- makebatches
- acc:accumulate,累积
- wait_time_acc:时间的累积
- total_time_acc:
- sumP = sum(P);
- logU = log(U);
4. 变量的命名:形容词
dummy:adj. 虚拟的;假的,n. 傀儡;哑巴;仿制品
elems.append(None) # add a dummy element
5. 各种**器,**机(er)
我们在书中看到各种**器,**机,并非什么高深的物理概念,而只是一段代码逻辑而已。
- (1)converter:转换器
- (2)mnist_loader:数据加载
6. 变量名称的理解
(1)unroll:展开
如典型的神经网络的参数,以二层为例,W1(s2*s1),W2(s1*s2),b1(s2),b2(s1),这四个参数 unroll 之后
theta = [W1(:); W2(:); b1; b2];
- skip:表示跳过,或者忽视(ignore,discard)的个数,
7. 抽象还是具体?
函数的参数(当然指的是形参),起名,尽量抽象;
void mySort(vector<int>& array);
而在客户端,调用端,起名,要尽量具体,见名知义,
vector<int> input(n); vector<int> mySorted = input; vector<int> reference = input;
8. 时态
完成时,表已经执行过的操作;进行时,则表示正在执行。
- visited:显然表示已被访问过的;
- isWriting:
函数一般执行的是一系列的动作,因此以动宾短语作为函数名,
void visit(const BTree& bt);
- 而变量一般则为名词,visited