代码格式化

来源:互联网 发布:淘宝店现在还挣钱么 编辑:程序博客网 时间:2024/05/19 18:16

代码的格式化是编程风格的核心,是如何编写出高质量的代码的基础。同时,开发团队如果采用统一的编码风格也会为提高团队开发效率打下良好的基础。

下面会针对每一个代码格式化进行说明:

  • 缩进
    代码每行的缩进层级采用以四个空格的方式。其他方式会存在一定的”问题“:
    • 使用制表符(TAB键),由于开发人员使用的IDE/文本编辑器不同,所以制表符的"长度”不一;
    • 使用2个空格代码会显得”过于紧凑“;
    • 使用8个空格代码整体会被”拉长”;

    由于采用了“空格”缩进的方式,开发人员可以同时结合“制表符(TAB键)“方式,从而减少开发人员的输入。
    对于绝大部分IDE/文本编辑器都可以将制表符(TAB键)设置为替换N个空格。下面仅提供Sublime、Vim对应的方法以作参考,如果使用其他开发工具请自行修改:

    Sublimehttp://www.micmiu.com/software/common/sublime-text2-tab-space/Vimhttp://blog.csdn.net/jiang1013nan/article/details/6298727
  • 行长/换行
    在代码的开发过程中,不可避免的会出现一行代码”过长“的情况,这些代码从执行效率的角度考虑没有任何影响,但是可读性不高。
    所以,对于此类代码需要做的格式化操作就是“适当”的换行,具体遵循以下原则:
    • 每行代码控制在80个字符以内;
    • 当每行代码超出规定的最大“限制”时,需要进行手动折行处理;

    对于折行操作,我们应该在何处进行呢?这里,仅提供一个指导性原则:在某个操作符后进行折行操作(赋值相关操作符例外)
    另外,对于进行折行操作的行除了“第一行”以外其他行要进行缩进,这里规定为两个层次的缩进,即2个TAB(8个空格)
    例子1: 

    推荐
    if ($isExists && $isUseful && $data['start_time'] &&$data['end_time'] && 
            $total> ACTIVITY_VISITE_TOTAL   ) {
        // ......
    }
    不推荐
    if ($isExists && $isUseful && $data['start_time'] &&$data['end_time'] &&$total > ACTIVITY_VISITE_TOTAL ) {
        // ......
    }

    例子2:

    推荐
    $result = $data['comment_num'] +$data['page_view'] +$data['topic_num'] + 
            $data['price'] * Yii::$app->params('price_base_num');
    不推荐
    $result = $data['comment_num'] +$data['page_view'] +$data['topic_num'] +$data['price'] * Yii::$app->params('price_base_num');

    注:这里提到的换行仅针对一行代码内容过长而已,其他的”换行“格式化会在指定的规则中进行说明

  • 空行
    空行是一个简单但是常常被忽略或者说不重视的代码格式化方式。代码最终是要转换成计算机”可读的形式“,但是源码应该是提供给开发人员的“可读的文本段落”。
    我们不应该把代码一大段的揉在一起,应该使用空行来确保把语义有关联的代码“放置”在一起。下面提出一些基本的增加空行的指导性规则:
    • 方法以及函数之间;
    • 控制语句前后;
    • 多行/单行注释之前;
    • 方法/函数内的业务逻辑判断之间;
    • 方法/函数同类操作前后;

    另外,针对上述的原则如果出现空行“重叠“的情况,只保留一个空行
    例子1:

class MyModel extends Model
{
    publicfunction method1()
    {
        // method body
    }
     
    publicfunction method2()
    {
        // method body
    }
     
    publicfunction method3()
    {
        // method body
    }
}
class MyModel extends Model
{
    publicfunction method1()
    {
        // method body
    }
    publicfunction method2()
    {
        // method body
    }
    publicfunction method3()
    {
        // method body
    }

例子2:

class MyModel extends Model
{
    /**
     * @const STATUS_ENABLE
     */
    constSTATUS_ENABLE = 1;
     
    /**
     * method1
     */
    publicfunction method1()
    {
        $result= [];
         
        // 获取Model数据
        $result= self::findOne();
         
        // other content....
    }
}
class MyModel extends Model
{
    /**
     * @const STATUS_ENABLE
     */
    constSTATUS_ENABLE = 1;   
    /**
     * method1
     */
    publicfunction method1()
    {
        $result= [];
        // 获取Model数据
        $result= self::findOne();
        // other content....
    }
}

例子3:

  • public function method()
    {
        $result= [];
     
        if($data['id']) {
            // process code
        }
     
        if($data['token']) {
            // process code
        }
     
        if($data['content']) {
            // process code
        }
     
        // other code
    }
    public function method()
    {
        $result= [];
        if($data['id']) {
            // process code
        }
        if($data['token']) {
            // process code
        }
        if($data['content']) {
            // process code
        }
        // other code
    }

    例子4:

    推荐
    public function actionLogout()                                                                              
    {   
        $session= Yii::$app->session;
     
        $session->remove('user');
        $session->remove('form');
        $session->remove('follow_product');
     
        unset($session['user']);
        unset($session['form']);
        unset($session['follow_product']);
     
        if(PublicLibrary::is_ajax()) {
            echoPublicLibrary::format_res_encode('11','退出成功!');
        }else {
            return$this->redirect(['/']);//跳转到完善信息
        }  
    }
    不推荐
    public function actionLogout()                                                                              
    {  
        $session= Yii::$app->session;
        $session->remove('user');
        $session->remove('form');
        $session->remove('follow_product');
        unset($session['user']);
        unset($session['form']);
        unset($session['follow_product']);
        if(PublicLibrary::is_ajax()) {
            echoPublicLibrary::format_res_encode('11','退出成功!');
        }else {
            return$this->redirect(['/']);//跳转到完善信息
        }  
    }

    另外,控制语句嵌套中内部的控制语句不必非要增加空行,例如:

    推荐
    if ($data && is_array($data)) {
        foreach($data as $key => $item) {
            if($item['id']) {
                // process code
            }
        }
    }
    不推荐
    if ($data && is_array($data)) {
         
        foreach($data as $key => $item) {
     
            if($item['id']) {
                // process code
            }
        }
    }

    总之,使用空行进行代码格式化的目的是为了提高代码的可读性,上述内容也是基本的指导性规则。
    在复杂的代码结构中,开发人员可以在保证可读性的原则下进行微调

  • 空格
    空格也是格式化代码中处处可见的,对于代码中何处增加空格没有标准性规定,这里也提供基本的规则:
    • 操作符前后(赋值操作符:+=、-=、*=等算整体);
    • 控制语句左圆括号左侧、右圆括号右侧以及左花括号左侧;

    例子1:

    $result = 100;
    $result .= $content;
    $result = $data['id'] ?$data['id'] : false;
    $result = [
        'key1'=> $value1,
        'key2'=> $vakue2,
    ];
     
    $result=100;
    $result.=$content;
    $result=$data['id']?$data['id']:false;
    $result = [
        'key1'=>$value1,
        'key2'=>$vakue2,
    ];
     

    例子2:

    if ($condition) {
        // process code
    }
     
    foreach ($data as$key => $val) {
        // process code
    }
     
    switch ($type) {
        // process code
    }
    if($condition){
        // process code
    }
     
    foreach($dataas $key=>$val){
        // process code
    }
     
    switch($type){
        // process code
    }

    额外补充,不需要增加空格的情况:

    • 对象成员变量的引用以及方法的调用— ->前后;
    • 方法/函数调用—括号前后;
    • 语句结尾;
    • $result = Yii::$app->getUrlManager();
      $model->status = ProductBase::STATUS_FIRST;
      $newModel->id =$model->id;
      $form = Yii::$app->request->post('product');
      $result = $model->getById($id);
      $result = Yii::$app -> getUrlManager();
      $model -> status = ProductBase::STATUS_FIRST;
      $newModel-> id = $model -> id;
      $form = Yii::$app -> request -> post('product');
      $result = $model -> getById ($id );
    • 花括号
      对于代码块来说花括号是必不可少的,类、方法、函数定义以及控制语句都离不开它。
      花括号的对齐方式就目前来看主要有两种风格:
      • 将左花括号"{"放置到块语句代码首行的最后的位置;
      • 将左花括号"{“放置到块语句代码首行的下一行且使其占据一行;

      对于上述的两种风格我们均采用,但是需要使用在不同的块语句中。
      对于第一种对齐方式,使用在具有控制语句的“块代码”中;

      if ($condition) {
          // condition process
      }
       
      foreach ($data as$key => $val) {
          // loop process
      }
       
      while $condition) {
          // loop process
      }
       
      switch ($val) {
          // switch process
      }

      第二种对齐方式使用在类、方法、函数的定义中;

      class MyModel extends Model
      {
          publicfunction method()
          {
       
          }
           
          // other method
      }
       
      functionmyFunc()
      {
          // function body
      }
  • 0 0
    原创粉丝点击