Pulpcode

捕获,搅碎,拼接,吞咽

0%

临时变量应该叫啥?

没有什么比给变量命名更头痛的。类名,成员变量,全剧变量,函数还好。但是那些只用一次的变量给它们命名简直令人头痛。
同时那些a1,a2,aa,bb, 的命名方式又是很欠打的。其实对于这种只用一次的变量,真的需要一个好的方式来为他们命名。

我记得王垠大神曾经写过一篇blog,叫“解决问题和消灭问题”,而消灭问题明显要比解决问题更加的”上档次”。
如果说给临时变量一个好的命名算是处理问题,那么什么才算是消灭问题呢?我觉得就是大多数临时变量就没必要命名
等你明白我的这句话,就会发现你命名的好坏,表示你会不会用临时变量,而这临时变量又和你的代码结构,代码的简练程度息息相关

首先你要明白为什么要为一个变量命名。

  • 你要使用这个变量不止一次。
  • 名称本身是自解释的。

所以我们可以根据这些,定义如下几条规则:

  • 如果一个变量只使用一次,那么不要为它命名,除非为它赋值很长。(如果只是用一次,完全可以不要它)
  • 不要乱缩写。result不要写成 res,department 不要写成 depart(降低可读性)
  • 打死不用 aa,bb,a1,a2。(完全没有自解释,降低可读性)

下面是几个实际的例子:

只使用一次的没有必要为其命名。

1
2
3
4
5
// bad
result = dosomething();
return result;
// good
return dosomething();

能用三目运算符不用逻辑判断语句(if else)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// bad
string oddeven(int value)
{
string result = "";
if(value % 2==0)
{
result = "even";
}else
{
result = "odd";
}
return result;
}
// good
string oddeven(int value)
{
return value % 2 == 0 ? "even": "odd"
}

如果你写了几个相似的临时变量名,那么请先想一想有没有必要取这么多?

1
2
3
4
5
6
7
8
9
// bad
amount1 = os.query<Porjectstaff>.where(1).count();
amount2 = os.query<Projectstaff>.where(2).count();
amount3 = os.query<Porjectstaff>.where(3).count();
projectAmount = amount1 + amount2 + amount3;
// good
projectAmount = os.query<Porjectstaff>.where(1).count();
projectAmount += os.query<Projectstaff>.where(2).count();
projectAmount += os.query<Projectstaff>.where(3).count();

amount1,amount2,amount3这样为每个临时变量命名,其实根本就没必要。


有个性与没个性,(有个性的单独命名,没个性的放在容器)

你可能会问我,什么叫有个性,什么叫没个性?

1
2
3
4
5
6
7
8
9
10
11
12
int []a = {1, 2, 3, 4};
a[0] ...
a[1] ...
a[2] ...
a[3] ...
// 这四个变量是通过数组访问的,它们并没有名字,所以叫"没个性"

int one = 1;
int two = 2;
int three = 3;
int four = 4;
// 这四个变量每一个有自己的名字,所以它们"有个性"

比如前段时间,我写过一个代码,提取四段字符串来生成一个项目编号。

1
2
3
4
5
6
7
string department   =  Department.Abbr;                         // 部门缩写
string projecttype = ProjectType.Name; // 项目类型缩写
string serialnumber = string.Format("{0000}", SerialNumber); // 流水号
string year = StartDate.year; // 项目年份

ProjectNumber = string.Format("{0}-{1}-{2}-{3}",
department, projecttype, serialnumber, year);

就像我之前说的那样,这种”个性”命名根本就没有必要,后面已经能够读的出来了。
所以这是我的新的写法:

1
2
3
4
5
6
7
string []symbol = string{
Department.Abbr,
ProjectType.Name,
string.Format("{0000}", SerialNumber),
StartDate.year
}
ProjectNumber = string.Format("{0}-{1}-{2}-{3}", symbol);

好的命名它本身的可读性。连注释都省了