分类: C/C++
2013-02-20 10:23:36
常见的编码陷阱
9.False——Happy方法
Ruby或Python开发者常常关注一些微小的异常,这是相当不错的事情。如果有地方出错就会抛出异常并且你会立即知道问题所在。
在PHP中,特别是使用比较老的框架,如CodeIgniter,与抛出异常相比,它仅仅返回一个flase值,并且把错误字符串分配给其他一些属性。这就驱使你使用get_error()方法。
Exception-happy远远好于false-happy。如果代码里面存在错误(例如不能连上S3下载图片,或者值为空等),然后抛出一个异常,你也可以通过继承Exception类来抛出特定的异常类型,例如:
1 classCustomExceptionextendsException{}
抛出自定义类型异常会让调试变得更加容易。
10.Use Guard Clauses
使用if语句控制函数或方法的执行路径是很常见的事情,如果if条件为true就执行if里面的代码,否则就执行else里面的代码。例如下面这段代码:
2 functionsomeFunction($param){
3 if($param=='OK'){
4 $this->doSomething();
5 returntrue;
6 }else{
7 returnfalse;
8 }
9 }
这是很常见的意大利面条式的代码,通过转换条件对上述代码进行优化,不仅可以增加其可读性,看起来还会更加简单,如下:
10 functionsomeFunction($param){
11 if($param!='OK')returnfalse;
12 $this->doSomething();
13 returntrue;
14 }
11.使用While进行简单的迭代
使用for进行循环是很常见的事情:
15
for(vari=0;i
16
...
17
}
当然,for循环也有许多优势,但是对于一些的循环,使用while或许会更好:
18
vari=x;
19
while(i--){
20
...
21
}
12.保持方法可维护性
让我们来看一下这个方法:
22
classSomeClass{
23
functionmonsterMethod(){
24
if($weArePilots){
25
$this->goAndDressUp();
26
$this->washYourTeeth();
27
$this->cleanYourWeapon();
28
$this->takeYourHelmet();
29
if($this->helmetDoesNotFit())
30
$this->takeAHat();
31
else
32
$this->installHelmet();
33
$this->chekcYourKnife();
34
if($this->myAirplain()=="F22")
35
$this->goToArmyAirport();
36
else
37
$this->goToCivilianAirport();
38
$this->aim();
39
$this->prepare();
40
$this->fire();
41
}
42
}
43
}
再看如下代码:
44
classSomeClass{
45
functionmonsterMethod(){
46
if($weArePilots){
47
$this->prepareYourself();
48
$this->tryHelmet();
49
$this->findYourAirport();
50
$this->fightEnemy();
51
}
52
}
53
privatefunctionprepareYourself(){
54
$this->goAndDressUp();
55
$this->washYourTeeth();
56
$this->cleanYourWeapon();
57
$this->chekcYourKnife();
58
}
59
privatefunctiontryHelmet(){
60
$this->takeYourHelmet();
61
if($this->helmetDoesNotFit())
62
$this->takeAHat();
63
else
64
$this->installHelmet();
65
}
66
privatefunctionfindYourAirport(){
67
if($this->myAirplain()=="F22")
68
$this->goToArmyAirport();
69
else
70
$this->goToCivilianAirport();
71
}
72
privatefunctionfightEnemy(){
73
$this->aim();
74
$this->prepare();
75
$this->fire();
76
}
77
}
对比两段代码,第二段代码更加简洁、可读和可维护。