每個人對于好的代碼在自己不同的時期都有不一樣的了解。當個人所在的層次變化,好代碼的概念也會跟着變化。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5Sa1MncrJzdldzdvwVO4gTO5UTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
剛敲代碼的時候
"老夫上手就是複制粘貼,别跟我說什麼編碼規範,設計模式"。剛入行的人一般都是接觸到底層業務的開發,而且一般是比較淺顯的業務需求。編碼本身也有金字塔層級,最底端的人用于做着繁雜,混亂,變化莫測的業務需求。基本上今天寫完明天改的那種。在這樣的前提下,對于一個剛剛接觸敲代碼行業的新人而言,考慮編碼規範,設計模式,幾乎是不可能的。一切以按時完成任務為主要目的。
工作換了幾次,改過幾次别人的代碼
"這寫的什麼玩意,簡直是一坨翔,還不如自己重寫"。寫代碼一定時間之後,自己的能力有所提升,接觸到的東西越多,逐漸形成一套自己的感性認識。會一種感覺什麼是好的代碼,什麼是不好的代碼,但僅僅是感性層面的認識。
但是,每次當你辛苦重寫完之前那套你認為是"一坨翔"的代碼之後,你會發現,靠,跑不通了,不是這報錯就是那報錯。修修補補之後發現,自己重寫的代碼與重寫自己自己的構想有很大出入。
又一段時間之後,終于代碼穩定沒啥爆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