常见的编码陷阱
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<x;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 }
对比两段代码,第二段代码更加简洁、可读和可维护。