再談談代碼規范的事


  談起代碼質量,可讀性,可維護性等,總是說,我們要有一套代碼規范來嚴格執行。我經歷的公司,大多都有代碼規范,至於最終代碼規范有沒有發揮作用么,你猜……
  代碼規范從制定到實施到發揮作用,其實還是有很多小的細節,今天我就來說說我看到的一些細節。

代碼規范的本身的問題

從規范目標細節的角度,代碼規范分為:

  • 注釋
  • 命名
  • 縮進空格
  • 語句格式
  • 規模
  • 可靠性
  • 語言特殊項

代碼規范從實施的角度,我分了幾類:

  1. 簡單易執行
    命名、注釋就是簡單易執行
  1. 一般可執行
    操作符++和— —操作符的應用是否符合規范?
    只讀不可寫的常量加上readonly或者const
  1. 有難度自行掌控
    一屏原則:一個方法體的代碼幅應該在一屏比較和合理;邏輯復雜的代碼可以抽離出方法體;
    int的返回值是否合理?(負值為失敗,非負值成功)
  1. 強迫症規范
    很多關於空格類的規范,就屬於強迫症規范

@Class的寫法
寫法模板:@class class1, class2;
建議的寫法

1
@class UIView, UIImage;

 

不建議的寫法

1
2
@class UIPress;
@class UIPressesEvent;

 

以上的規范,純屬編寫規范的人的個人喜好,寫法上我覺得沒有對錯,有一些過線。

5.關於特定語言或者數據庫的編碼特殊限定需求
例如:進行equal判斷時,倒着寫的規范:
if(“true”.equals(isLogin)){return true;}
用StringBuffer代替String;用Stringbulider代替StringBuffer;

  網上我還是看了不少的規范,真的好的規范不多。代碼規范一般會由團隊里資深的程序員來制定,制定的方法一般是網上找一個基本的Base版,再做增減。專業的事交給專業的人來做,代碼規范的制定應該由在一線摸爬滾打很多年的程序員主導,由多人參與共同制定,牽頭人最好是做過很多大項目,有多年編程經驗,為人謙虛,並一直保持學習狀態的全棧工程師。

  一個好的代碼規范,必須由所有的團隊成員一起認同,共同來維護,而不是由制定的人,來負責推廣監督執行。在一開始制定的時候,就要充分的聽取各方的意見,達成一致。有的代碼規范太細,在寫代碼的時候,沒法細摳,在事后也沒有機會review,與其不能執行,不如簡化些,更接地氣。有的代碼規范太抽象,例如函數規模,代碼規模等,還是要有可量化標准,可執行的方法,最好能有工具支持,例如寫代碼時的提示,編譯代碼前的格式自動檢查等等。

代碼規范的養成,習慣比規范更重要

  代碼規范除了制定,其實更注重每個程序員的執行。程序員每天寫代碼的時候更規范,當然會比之后再review代碼,再整理代碼做的好的多。而寫代碼時的控制,更多的是一種習慣。代碼規范前幾條里必然有命名,縮進等,這些每天寫代碼的基本,必然是每個程序員的習慣,而不是時刻掛在腦子里,要想一下的東西。就像前端程序員寫html的時候,一定會注意封閉性,寫一個<div></div>一定成對出現。

  對於剛開始寫代碼的小白來說,只要寫一段時間的代碼,習慣也會慢慢養成。這種養成是IDE協助下的養成。或者說,養成了IDE建議我們的習慣。舉例說,JAVA的eclipse協助生成get;set;的代碼,默認的會有setApplicationId這樣的大小寫習慣,會有{在前一行最后的默認習慣

1
2
3
for(int i=0;i<max;i++){
r[i]=0;
}

 

  而同樣的,C#的著名IDE Visual Studio就會幫.Net程序員養成,{}分行的習慣(默認配置是這樣的)

1
2
3
4
for(int i=0;i<max;i++)
{
r[i]=0;
}

 

  漸漸的,IDE幫我們區分了這個程序員是寫什么代碼出身的,給程序員的代碼打上了不同種類的標准印記。有些左撇子在小時候,父母會強制他們用右手拿筷子吃飯,IDE的這種強制,對之后程序員的制定代碼規范也有深深的印記。他們會覺得,自己最熟悉的那種類型,那種習慣就是正確的。我看了很多語言的代碼規范后,發現這種IDE的習慣的影響力還真的是很強,也會影響到代碼規范的制定。

  另一方面,有的習慣是工具幫不了我們的。例如代碼規模的控制,例如有野生程序員喜歡用拼音來命名。一些優秀程序員需要養成的習慣:

  • 用合理命名的習慣
  • 定期整理代碼的習慣->清理無用代碼->分割大段代碼為更小的函數
  • 注釋的習慣
  • 寫文檔的習慣

當然好的習慣遠遠不止以上這些,好習慣就是每個程序員的功底,內功,基礎越好的程序員,寫代碼的效率當然越高。

代碼規范的推行方式

  IDE對於代碼規范的影響,從側面說明了另外一個問題,代碼規范的推行問題。

  我目前想到的代碼規范的推行方式,定制工具,培養習慣,code review。

  聽說,百度以前學Google的時候,也搞了一套類似的模式。新程序員入職的時候,要先學習代碼規范,然后學會整個編碼發布的流程,其中就有自動化檢查代碼規范的流程,如果不通過,就回去繼續改,不能發布。新程序員一般都要花上一兩天學習這套東西,否則工作永遠完成不了。這里說的就是代碼規范的強制推行工具,幫助或者說限制程序員必須要按照制定的標准來。

  學會使用統一的工具,統一開發環境或者IDE工具,使用統一的ESLint,JSLint配置。或者公司有統一的代碼規范檢查工具。

  當然,有的規范可以工具化,有的不可以
  例如大小寫問題,下划線問題,每行長度問題,if后{}位置問題,空格的編寫等。單個函數不超過規定行數?縮進層數是否不超過規定?這些很容易用工具來檢查。
  包裝類做簡單預算前是否保證非空? 建議都使用包裝類。方法調用前是否有非空判斷?這些就沒這么容易了。而前面舉例的一些自行掌控的規范,更是只能看程序員的素質了。

  代碼規范推行的最后一招,就是code review。具體分實時review,編寫后review,meeting review。 實時是指結對編程的那種方式,編寫后是說Leader幫忙檢查代碼,meeting review的代價最大,一組人一起審閱代碼。

  代碼規范為什么難以推行?因為沒有自動化。規范的條條框框這么多,隨時記在腦子里,怎么可能?不要指望程序員手工寫代碼的時候,能認真執行這些規則。從推行方式來看,IDE工具或者統一配置IDE工具的方式最簡單->定制代碼檢查和規范工具->培養程序員習慣->code review。而現實情況見的最多的執行方案,是先安排個人制定一套規范,用代價最高的code review的方式來推行,幾次之后,大家都覺得性價比低而放棄了。一個好的代碼規范的推行,要更多的自動化,更早的在編寫過程中處理問題。

代碼規范的其他

  • 代碼規范不應該做的事情
    太細節的東西不要管,假設我告訴你每天出門先邁右腳會走好運,每天你能做的到嗎?例如,有看到過下面的規范要求,除
    非IDE工具可以自動幫我做到這些,我個人就覺得,管的有些太細。
    屬於個人習慣的東西,不要強加在別人身上。但同一份代碼,多個人編寫,盡量參照之前的風格。別讓后人看一份代碼的時候產生混亂的感覺。

    1
    2
    3
    4
    5
    一般寫法
    app_name="支付寶";

    規范要求,為了可讀性,前后需要加入空格
    app_name = "支付寶";
  • 代碼規范解決不了代碼腐化的問題
      一個長期在維護的代碼,時間長了,難免出一些問題。例如需求的反復變化,導致的代碼的雜亂,原先的需求是做一個貸款超市,過幾天需求變了,變成了信用卡超市,過幾天又變成了信用卡還款及記賬工具,這些並不是代碼規范就能解決的。根本的處理方法是重構,或者新代碼的分割。

  • 代碼規范也會與時俱進
      技術更新很快,工程過程中遇到的問題也是層出不窮,因此,代碼規范也不會是一招定論的,需要不斷地更新、補充、完善,這樣才能與時俱進,保持生命力。舉例說JAVA8中引入了Lambda表達式,對於半路出家的程序員,這種表達式如果寫的抽象一些,可讀性會出點問題的。有必要對於Lambda寫法上做一定的規范。還有如C#和js中引入的await和async的異步寫法,沒學過直接看代碼的時候,確實會發生不能理解的問題,說明還沒有成熟規范寫法,也沒有深入學習語法的時候,新技術常常會導致可讀性下降。

小結

  一個技術團隊的氣質的重要表現就是團隊的代碼規范。一個阿里出來的程序員,之后寫出來的代碼,必然也會有之前的習慣,因為都是受過同一個代碼規范熏陶的,這就是團隊氣質的體現,每當看到小公司混亂代碼的時候,就會想大廠和小廠的不同。如果團隊的開發都帶有相同的氣質,這個團隊的統一性,戰斗力就會是驚人的,外人看來,這就是團隊而不是寫代碼的個體了。代碼規范及其執行對於技術團隊十分的重要,制定好代碼規范,推行好代碼規范,持續的優化,會讓團隊的效率大大的提升,是每一個技術團隊Leader的重要抓手。

附件

什么樣的代碼規范才能得到程序員的認可?
http://www.cocoachina.com/programmer/20180327/22782.html
關於代碼規范的一些參考
https://blog.csdn.net/mengdonghui123456/article/details/68066766
這可能是史上最全的Android代碼規范
https://www.jianshu.com/p/f5a55dff62f0
阿里巴巴java代碼規范
https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM