9、False——Happy方法

  Ruby或Python开发者常常关注一些微小的异常,这是相当不错的事情。如果有地方出错会抛出异常并且你会立即知道问题所在。

  在PHP中,特别是使用比较老的框架,如CodeIgniter,与抛出异常相比,它仅仅返回一个flase值,并且把错误字符串分配给其他一些属性。这驱使你使用get_error()方法。

  Exception-happy远远好于false-happy。如果代码里面存在错误(例如不能连上S3下载图片,或者值为空等),然后抛出一个异常,你也可以通过继承Exception类来抛出特定的异常类型,例如:


class CustomException extends Exception {}


  抛出自定义类型异常会让调试变得更加容易。

  10、Use Guard Clauses

  使用if语句控制函数或方法的执行路径是很常见的事情,如果if条件为true执行if里面的代码,否则执行else里面的代码。例如下面这段代码:


1.function someFunction($param) {  
2.    if ($param == 'OK') {  
3.       $this->doSomething();  
4.       return true;  
5.    } else {  
6.       return false;  
7.    }  
8.}
 


  这是很常见的意大利面条式的代码,通过转换条件对上述代码进行优化,不仅可以增加其可读性,看起来还会更加简单,如下:


1.function someFunction($param) {  
2.    if ($param != 'OK') return false;  
3.    $this->doSomething();  
4.    return true;  
5.}
 


  11、使用While进行简单的迭代

  使用for进行循环是很常见的事情:


1.for (var i = 0; i < x; i++) {  
2.    ...  
3.}
 


  当然,for循环也有许多优势,但是对于一些的循环,使用while或许会更好:


1.var i = x;  
2.while (i--) {  
3.    ...  
4.}
 


  12、保持方法可维护性

  让我们来看一下这个方法:


1.class SomeClass {  
2.   function monsterMethod() {  
3.      if($weArePilots) {  
4.         $this->goAndDressUp();  
5.         $this->washYourTeeth();  
6.         $this->cleanYourWeapon();  
7.         $this->takeYourHelmet();  
8.         if($this->helmetDoesNotFit())  
9.            $this->takeAHat();  
10.         else 
11.            $this->installHelmet();  
12.         $this->chekcYourKnife();  
13.         if($this->myAirplain() == "F22")  
14.            $this->goToArmyAirport();  
15.         else 
16.            $this->goToCivilianAirport();  
17.         $this->aim();  
18.         $this->prepare();  
19.         $this->fire();  
20.      }  
21.   }  
22.}
 


  再看如下代码:


1.class SomeClass {  
2.   function monsterMethod() {  
3.      if($weArePilots) {  
4.         $this->prepareYourself();  
5.         $this->tryHelmet();  
6.         $this->findYourAirport();  
7.         $this->fightEnemy();  
8.      }  
9.   }  
10.   private function prepareYourself() {  
11.      $this->goAndDressUp();  
12.      $this->washYourTeeth();  
13.      $this->cleanYourWeapon();  
14.      $this->chekcYourKnife();  
15.   }  
16.   private function tryHelmet() {  
17.      $this->takeYourHelmet();  
18.      if($this->helmetDoesNotFit())  
19.         $this->takeAHat();  
20.      else 
21.         $this->installHelmet();  
22.   }  
23.   private function findYourAirport() {  
24.      if($this->myAirplain() == "F22")  
25.         $this->goToArmyAirport();  
26.      else 
27.         $this->goToCivilianAirport();  
28.   }  
29.   private function fightEnemy() {  
30.      $this->aim();  
31.      $this->prepare();  
32.      $this->fire();  
33.   }  
34.}
 


  对比两段代码,第二段代码更加简洁、可读和可维护。