常见的编码陷阱

PHP篇

7.适当的时候使用三元操作

If…else语句是大多数语言的重要组成部分。但有些简单的事情,比如根据条件进行赋值,你很有可能会这样写:

  1. if ($greeting)
  2. {
  3.     $post->message = ‘Hello’;
  4. }
  5. else
  6. {
  7.     $post->message = ‘Goodbye’;
  8. }

其实使用三元操作只需一行代码就可以搞定,并保持了良好的可读性:

  1. $post->message = $greeting ? ‘Hello’ : ‘Goodbye’;

8.抛出异常,而不是采用盗梦空间式的嵌套(Inception-Style Nesting)

多层次的嵌套是丑陋的、难以维护和不可读的。下面的代码是个简单的例子,但是随着时间的推移会变得更糟:

  1. // anti-pattern
  2. $error_message = null;
  3. if ($this->form_validation->run())
  4. {
  5.    if ($this->upload->do_upload())
  6.    {
  7.       $image = $this->upload->get_info();
  8.       if ( ! $this->image->create_thumbnail($image[‘file_name’], 300, 150))
  9.       {
  10.          $error_message = ‘There was an error creating the thumbnail.’;
  11.       }
  12.    }
  13.    else
  14.    {
  15.       $error_message = ‘There was an error uploading the image.’;
  16.    }
  17. }
  18. else
  19. {
  20.    $error_message = $this->form_validation->error_string();
  21. }
  22. // Show error messages
  23. if ($error_message !== null)
  24. {
  25.    $this->load->view(‘form’array(
  26.       ‘error’ => $error_message,
  27.    ));
  28. }
  29. // Save the page
  30. else
  31. {
  32.    $some_data[‘image’] = $image[‘file_name’];
  33.    $this->some_model->save($some_data);
  34. }

如此凌乱的代码,是否该整理下呢。建议大家使用异常这个清洁剂:

  1. try
  2. {
  3.    if ( ! $this->form_validation->run())
  4.    {
  5.       throw new Exception($this->form_validation->error_string());
  6.    }
  7.    if ( ! $this->upload->do_upload())
  8.    {
  9.       throw new Exception(‘There was an error uploading the image.’);
  10.    }
  11.    $image = $this->upload->get_info();
  12.    if ( ! $this->image->create_thumbnail($image[‘file_name’], 300, 150))
  13.    {
  14.       throw new Exception(‘There was an error creating the thumbnail.’);
  15.    }
  16. }
  17. // Show error messages
  18. catch (Exception $e)
  19. {
  20.    $this->load->view(‘form’array(
  21.       ‘error’ => $e->getMessage(),
  22.    ));
  23.    // Stop method execution with return, or use exit
  24.    return;
  25. }
  26. // Got this far, must not have any trouble
  27. $some_data[‘image’] = $image[‘file_name’];
  28. $this->some_model->save($some_data);

虽然代码行数并未改变,但它拥有更好的可维护性和可读性。尽量保持代码简单。

9.False——Happy方法

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

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

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

  1. 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. }

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

未经允许不得转载:哈勃私语 » 常见的编码陷阱

本文共10061个字 创建时间:2015年8月27日23:31   
分页阅读:上一页 1 2 3 下一页

分享到:更多 ()