註釋應該聲明代碼的高層次意圖,而非明顯的細節html
反例java
說明算法
上文方法用於根據參數生成簽名,註釋中詳細描述了簽名算法的實現步驟,這其實就是過分描述代碼明顯細節編程
正例api
總結數組
在文件/類級別使用全局註釋來解釋全部部分如何工做編程語言
正例函數
總結工具
一般每一個文件或類都應該有一個全局註釋來概述該類的做用spa
公共api須要添加註釋,其它代碼謹慎使用註釋
反例
說明
以上接口提供dubbo rpc服務屬於公共api,以二方包的方式提供給調用方,雖然代碼簡單缺乏了接口概要描述及方法註釋等基本信息。
正例
總結
公共api必定要有註釋,類文件使用類註釋,公共接口方法用方法註釋
在註釋中用精心挑選的輸入輸出例子進行說明
正例
總結
對於公共的方法尤爲是通用的工具類方法提供輸入輸出的例子每每比任何語言都有力
註釋必定要描述離它最近的代碼
反例
說明
該方法有一行代碼從map裏刪除了一個數據,註釋放在了put調用以前,而沒有直接放在remove以前
正例
總結
註釋要放在距離其描述代碼最近的位置
註釋必定要與代碼對應
反例
說明
註釋中說明生成隨機字符串的長度不能超過16字符,實際代碼已經修改成32個字符,此處註釋會產生誤導讀者的反作用
正例
總結
必定要給常量加註釋
反例
正例
總結
給每個常量加一個有效的註釋
巧用標記(TODO,FIXME,HACK)
示例
配置標記
能夠擴展IDE修改標記的配置,好比加入解決人,關聯缺陷等信息,以IDEA爲例修改入口以下:
總結
適當添加警示註釋
正例
說明
該方法建立了一個大小固定爲1且類型爲Map的數組鏈表,這個用法比較奇怪,須要註釋說明緣由
總結
代碼裏偶爾出現一些很是hack的邏輯且修改會引發較高風險,這個時候須要加註釋重點說明
註釋掉的代碼
反例
說明
常見套路,爲了方便須要的時候從新複用廢棄代碼,直接註釋掉。
正例
同上,刪除註釋部分代碼
總結
不要在代碼保留任何註釋掉的代碼,版本管理軟件如Git能夠作的事情不要放到代碼裏
循規蹈矩式註釋
反例
說明
分析上述代碼能夠發現兩處註釋很是彆扭和多餘:
正例
總結
日誌式註釋
反例
說明
修改已有代碼不少人會手動添加註釋說明修改日期,修改人及修改說明等信息,這些信息大可能是冗餘的
正例
代碼同上,刪除該註釋
總結
不要在代碼中加入代碼的著做信息,版本管理能夠完成的事情不要作在代碼裏
「柺杖註釋」
反例
說明
示例代碼簡單實現了更新指定map k-v等功能,若是目標map不存在則使用指定k-v初始化一個map並返回,方法名爲 updateConfigWithSpecifiedKV ,爲了說明方法的完整意圖,註釋描述了方法的實現邏輯
正例
總結
拋棄「柺杖註釋」,不要給很差的名字加註釋,一個好的名字比好的註釋更重要
過分html化的註釋
反例
說明
類註釋使用了大量的html標籤用來描述,實際效果並無帶來收益反而增長閱讀難度
正例
總結
Java
文件/類註釋規範
目前IDE安裝 靈狐 後會自動配置IDE的file templates爲以下格式:
強烈建議使用如上配置,統1、簡潔就是最好。__若是有特殊須要須要定製類註釋能夠參考下圖:
方法註釋
IDE提供了統一的方法註釋模版,無需手動配置,好的方法註釋應該包括如下內容:
舉個例子:
塊註釋與行註釋
Python
文件註釋
重點描述文件的做用及使用方式
類註釋
函數註釋
多行註釋與行尾註釋
Golang
行註釋
經常使用註釋風格
包註釋
/**/ 一般用於包註釋, 做爲一個總體提供此包的對應信息,每一個包都應該包含一個doc.go用於描述其信息。
JavaScript
經常使用/**/與//,用法基本同Java。
Shell
只支持 # ,每一個文件都包含一個頂層註釋,用於闡述版權及概要信息。
其它
待完善
本文先總結了註釋在編程中的最佳實踐場景並舉例進行了說明,而後就不一樣編程語言提供了一些註釋模版及規範相關的實踐tips。關於註釋我我的的認知是:註釋即代碼,註釋即文檔,寫好註釋一個工程師必備的素質之一,在整潔代碼前提下,更少的註釋是跟高的追求。關於註釋的實踐暫時寫到這裏,後面會持續完善,也歡迎你們提供好的tips,文中代碼大多出自於平常業務項目,也有部分摘自開源庫,如有不妥之處敬請指正。
本文做者:竹澗
本文爲雲棲社區原創內容,未經容許不得轉載。