天天看點

怎麼樣才能不寫出别人嘴裡的爛代碼

每個人對于好的代碼在自己不同的時期都有不一樣的了解。當個人所在的層次變化,好代碼的概念也會跟着變化。

怎麼樣才能不寫出别人嘴裡的爛代碼

剛敲代碼的時候

"老夫上手就是複制粘貼,别跟我說什麼編碼規範,設計模式"。剛入行的人一般都是接觸到底層業務的開發,而且一般是比較淺顯的業務需求。編碼本身也有金字塔層級,最底端的人用于做着繁雜,混亂,變化莫測的業務需求。基本上今天寫完明天改的那種。在這樣的前提下,對于一個剛剛接觸敲代碼行業的新人而言,考慮編碼規範,設計模式,幾乎是不可能的。一切以按時完成任務為主要目的。

工作換了幾次,改過幾次别人的代碼

"這寫的什麼玩意,簡直是一坨翔,還不如自己重寫"。寫代碼一定時間之後,自己的能力有所提升,接觸到的東西越多,逐漸形成一套自己的感性認識。會一種感覺什麼是好的代碼,什麼是不好的代碼,但僅僅是感性層面的認識。

但是,每次當你辛苦重寫完之前那套你認為是"一坨翔"的代碼之後,你會發現,靠,跑不通了,不是這報錯就是那報錯。修修補補之後發現,自己重寫的代碼與重寫自己自己的構想有很大出入。

又一段時間之後,終于代碼穩定沒啥爆bug的地方了,後面的人員看你的代碼,還是想着,"這寫的什麼玩意,就是一坨翔"

在改别人的代碼與被别人改代碼掙紮多年

随着時間推移,發際線的上升,開始腦袋比較靈光了。看事情知道從不同的角度去看了,知道任何事情的存在必定有一定存在的因素。不再是一上來就把别人寫的代碼重寫一遍,更多的是按一定的标準去重構。

重構跟重寫是有很大差別的。重寫是在了解代碼邏輯之後,全部按自己的思路完全實作一遍。重構是修改代碼中不符合規範,或不正确的地方,不合理的地方。

相對于重寫而言,優秀的重構所需要的能力比重寫要高很多。重寫我不用管内外部依賴,反正都是推翻重新來過。而重構需要相容整個項目,甚至是外部項目的依賴。

怎麼樣才能不寫出一坨翔

說了這麼多廢話,其實我也不知道什麼樣的代碼是好的代碼,畢竟大家都說好的代碼是不存在的。

隻是說,盡可能的符合多數人的習慣,簡潔不備援的代碼是稍微好的代碼。

工作中整理了一些習慣,避免自己把代碼寫成一坨翔:

1)不要犯低級的文法錯誤,盡管不是ERROR級别的錯誤

這是最基本的,學習一門程式設計語言,不應該在對外項目代碼中有文法錯。文法錯誤隻會讓人家覺得你很low,是一個菜鳥。

例如定義常量,非靜态方法不要使用靜态方式調用

defiend(APP) or defien(APP,1);
           

複制

2)檢查使用者輸入資料

業務中有一條規矩,永遠不要相信使用者的輸入資料。不能假設使用者會按你需要的資料給你請求資料。

例如:

if($params['status'])
{

}
           

複制

params

是使用者請求參數,在判斷取值之前,應該先判斷是否有這個資料吧

3) 函數定義,預設參數應該放在末尾

例如下面的:

function makeSign($data,$header='',$clientip){

}
           

複制

4)判斷語句減少嵌套

function makeSign($data){

    if($data['status'] == 1)
    {
        if($data['client_id'] == 2)
        {
            if($data['type'] == 3)
            {
                //....業務邏輯2
                $status = 1;
            }
            else
            {
                //....業務邏輯1
                $status = 0;
            }
        }
        else
        {
            //....業務邏輯1
            $status = 0;
        }
    }
    else
    {
        //....業務邏輯1
        $status = 0;
    }
    return $status;
}
           

複制

可修改為:

function makeSign($data){
    $data = array_merge(['status'=>0,'type'=>0,'client_id'=>0],$data);
    if($data['status']!=1 || !$data['type']!=1 || $data['client_id']!=1)
    {
        //....業務邏輯1
        return $status;
    }
    //....業務邏輯2
    return 1;
}

           

複制

5)函數的輸出盡可能同意,或者可以根據外部指定傳回不同類型

function checkDataClient($clientId){
    if($clientId%2){
        return true;
    }
    return false;
}
function getdata($data){
    $data = array_merge(['client_id'=>0],$data);
    $res = $this->checkDataClient($data['client_id']);
    if( $res )
    {
        return $data;
    }
    return ['code'=>1,'msg'=>'非法使用者'];
}
           

複制

getdata方法,在client_id的資料非法的時候與合法的時候傳回的資料格式不一緻。

修改:

function getdata($data){
    $data = array_merge(['client_id'=>0],$data);
    $res = $this->checkDataClient($data['client_id']);
    if( $res )
    {
        return ['code'=>0,'msg'=>'','data'=>$data];
    }
    return ['code'=>1,'msg'=>'非法使用者','data'=>[]];
}
           

複制

6)類對象不要互相引用

時刻注意,建構的代碼應該是一個層級的樹狀結構而不應該是網狀結構。當代碼變成網狀結構的時候就是災難爆發的時候,動任何一個地方都有可能引爆全部業務。互相引用也會造成記憶體的問題

7)編碼規範化,最好是強制格式化指定的規範

規範不要靠嘴說!不要靠嘴說!不要靠嘴說!直接用工具格式化。任何語言都有業界比較好的規範,遵循規範,起碼你代碼看上去,閱讀起來比較友善。

8)代碼放置的位置要慎重

業務疊代的過程中,代碼改來改去,今天加點,明天删點。但是代碼的位置一定要思考清楚。

比如一個登陸驗證:

function init(){
    if(!session('user_name'))
    {
        getUserNameFromDb(session('user_id'));
    }
    if(!session('user_id'))
    {
        throw new \Exception("請先登入", 1);
    }
    ...
}
           

複制

這一看就是後期修改添加的代碼,還放錯位置了

可用工具

代碼格式化可以用

phpcs

代碼的低級錯誤 可以用

phplint

,

phpstan

做代碼靜态檢查

代碼設計層面,代碼規範上,命名等可以使用

phpmd