初級程序員自檢手冊

jopen 9年前發布 | 7K 次閱讀 程序員

function sayHello($name)
{
    $time = date('Y-m-d H:i:s');
    $weather = 'what a sunshinny day!';

echo "Hello $name!";

} </pre>

癥狀:可能編程的時候買的股票剛升職、剛交了女朋友,心情格外的好,隨便寫上點什么?可能之前做需求變更時,代碼邏輯沒有刪干凈?可能在練習打字。

解毒:提交代碼庫前,自己做review,看能夠讓自己滿意么?如果你真檢查了,就是要保留上述代碼,那么,恭喜你,做程序員太委屈了你,其實你應該去做產品經理!

只注釋不清理代碼

初級程序員自檢手冊

癥狀:廢了好大的勁,最終沒有調用。猜測代碼邏輯是一開始有用的,但是后續需求調整,從動態請求變成一張靜態圖片了,做需求的人沒有認真看代碼邏輯,直接修改了最終展示圖片的位置,而沒有管其他的邏輯,導致這種空跑邏輯的存在。

解毒:修改別人代碼的時候是需要謹小慎微的,但是也不能容忍垃圾代碼的存在,拿不準的可以找人結對或者review。沒有代碼潔癖的程序不是好產品經理!

代碼中有死循環

初級程序員自檢手冊

癥狀:我中有你,你中有我。相互調用前沒有溝通清楚?還是就是一個人寫的?死循環調用,直至到達系統設置的最大執行時間或者內存溢出,進程掛掉。

解毒:在加入版本庫前走讀代碼,自檢一下,看人腦能跑通么?多問問自己如果出錯了怎么辦?總不能只考慮正常邏輯吧。

反復調用同一函數

$p = new Person();
$p->name = 'Tom';
$p->sex = 'male';
$p->address = 'balizhuang #1 1-1-101, chaoyang district, beijing, china';
$p->save();

//確保存入db sleep(3); $p->save(); </pre>

癥狀:數據來的不容易,一定要保障數據的可靠性,要存入db。擔心系統忙,萬一當時系統真的很忙呢,還是多保存一遍比較穩妥,心理踏實。

解毒:額,這個么,建議你寫代碼時候桌子上擺個關公再點上三炷香,似乎更靠譜。嘗試用系統執行的角度去思考代碼的運行狀況,或者step by step的進行debug調試,能夠幫助我們思考,識別出無用的代碼。如果第一次save()報錯,那就讓他報錯好了

捕獲異常但是不處理或者改變異常信息

try
{
    $p = new Person();
    $p->name = 'Tom';
    $p->sex = 'male';
    $p->address = 'balizhuang #1 1-1-101, chaoyang district, beijing, china';
    $p->save();
}
catch (Exception $e)
{
    //再次嘗試下看db能保存么?
    if (false == $p->save())
    {
        throw new MyException('保存db失敗了');
    }   
}  

癥狀:這是上個問題的升級版,也許是想加強對錯誤的處理,起碼再努力看看?實在不成再拋出一個我的異常。捕獲異常進行錯誤重試未嘗不可,但是首先要注意是否只捕獲了你關心的異常?而不是一攬子全收了,再次失敗后,再拋出了一個新的異常,那底層帶上來的上下文信息可就被吞并了,上層更無法判斷是什么問題了。

解毒:只捕獲業務關心的異常,不要吞噬上下文信息。

同步依賴外部系統

function getUser($userName)
{
    $user = getUserByDB($userName);
    //取用戶相關微信號
    $api = new WeixinAPI();
    $user->code = $api->callWeixinHttpApi('http://weixin.qq.com/xxxx');
    return $user;
}  

癥狀:在本系統調用過程中,同步調用了外部系統(微信)的遠程接口,如果外部服務掛了,接口返回不正常時,本系統也無法正常使用。

解毒:依賴外部服務的功能分成:強依賴,比如這個功能是調用對方提供的接口來打電話,如果對方不可用,本系統即不可用;和弱依賴,比如只是在頁面右側廣告位顯示下微信的二維碼,如果對方不可用,不要影響我方其它業務。

要加入錯誤捕獲或者放入消息隊列進行異步處理,不要讓其阻斷本系統的其它功能。如:

function getUser($userName)
{
    $user = getUserByDB($userName);
    try
    {
        $api = new WeixinAPI();
        $user->code = $api->callWeixinHttpApi('http://weixin.qq.com/xxxx');
    }
    catch (WeixinException $e)
    {
        //add logs here
    }
    return $user;
}  

一旦微信不可用,WeixinAPI拋出異常,會導致整個系統也不可用。主動捕獲可能發生的異常,不要讓其阻礙本系統的正常使用。

命名過于籠統或者隨意

癥狀:HTMLHelper,UserManager,XString... 具體可以參考: xstring.php 。在各種helper,manager類中,往往混雜了大量說不清楚,或者職責模棱兩可的地方,于是我們發明了粘合劑類,用于填充那些誰也不管的功能。

解毒:粘合劑不是一定不能有,但是要在設計時就考慮清楚其職責,而不是籠統的起一個xxxHelper來放。其他人可不知道你這個到底是干嘛的,也不敢用。久而久之就成了垃圾箱。

進階:深層次的問題是在面向對象開發過程中的職責不清,到底什么邏輯放到service中,什么邏輯放到實體或者知識類中?可以參考: message系統服務 .

推薦閱讀:

  • 初級程序員自檢手冊

  • 初級程序員自檢手冊

書的圖片可以點擊哦。

以上這些都是根據最近我看到的一些問題總結出來的,歡迎大家一起補充更多的例子進來。

原文 https://github.com/yangshiqi/wiki/blob/master/ysq/wrongcode.md

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!