??
???? 最近經(jīng)常看一些朋友寫的源代碼,總是感覺編碼規(guī)范問題還沒有成為大家的關(guān)注點,導(dǎo)致代碼的通用可讀性相對比較差;
所以在此嘮叨幾句編碼規(guī)范(以struts2+spring2+hibernate3架構(gòu)的項目為例),大家各取所需,歡迎拍磚!
一、規(guī)范存在的意義
??? 應(yīng)用編碼規(guī)范對于軟件本身和軟件開發(fā)人員而言尤為重要,有以下幾個原因:
??? 1、好的編碼規(guī)范可以盡可能的減少一個軟件的維護(hù)成本 , 并且?guī)缀鯖]有任何一個軟件,在其整個生命周期中,均由最初的開發(fā)人員來維護(hù);
??? 2、好的編碼規(guī)范可以改善軟件的可讀性,可以讓開發(fā)人員盡快而徹底地理解新的代碼;
??? 3、好的編碼規(guī)范可以最大限度的提高團隊開發(fā)的合作效率;
??? 4、長期的規(guī)范性編碼還可以讓開發(fā)人員養(yǎng)成好的編碼習(xí)慣,甚至鍛煉出更加嚴(yán)謹(jǐn)?shù)乃季S;
二、命名規(guī)范
??? 1、一般概念
??????? 1、盡量使用完整的英文描述符
??? ??? 2、采用適用于相關(guān)領(lǐng)域的術(shù)語
??? ??? 3、采用大小寫混合使名字可讀
??? ??? 4、盡量少用縮寫,但如果用了,必須符合整個工程中的統(tǒng)一定義
??? ???
??? ??? 5、避免使用長的名字(小于 15 個字母為正常選擇)
??? ??? 6、避免使用類似的名字,或者僅僅是大小寫不同的名字
??? ??? 7、避免使用下劃線(除靜態(tài)常量等)
???? 2、標(biāo)識符類型說明
??????? 1、包( Package )的命名
??? ??? ??? Package 的名字應(yīng)該采用完整的英文描述符,都是由一個小寫單詞組成。并且包名的前綴總是一個頂級域名,
??? ??? ??? 通常是 com、edu、gov、mil、net、org 等;
??? ??? ??? 如: com.yjhmily.test
??? ??? 2、類( Class )的命名
??? ??? ??? 類名應(yīng)該是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量保證類名簡潔而富于描述。
??? ??? ??? 使用完整單詞,避免縮寫詞 ( 除非工程內(nèi)有統(tǒng)一縮寫規(guī)范或該縮寫詞被更廣泛使用,像 URL , HTML)
??? ??? 如: FileDescription
??? ??? 3、接口( Interface )的命名
??? ??? ??? 基本與 Class 的命名規(guī)范類似。在滿足 Classd 命名規(guī)則的基礎(chǔ)之上,保證開頭第一個字母為 ”I”,
??? ??? ??? 便于與普通的 Class區(qū)別開。其實現(xiàn)類名稱取接口名的第二個字母到最后,且滿足類名的命名規(guī)范;
??? ??? 如: IMenuEngine
??? ??? 4、枚舉( Enum )的命名
??? ??? ??? 基本與 Class 的命名規(guī)范類似。在滿足 Classd 命名規(guī)則的基礎(chǔ)之上,保證開頭第一個字母為 ”E” ,
??? ??? ??? 便于與普通的 Class區(qū)別開。
??? ??? 如: EUserRole
??? ??? 5、異常( Exception )的命名
??? ??? ??? 異常( Exception ) 通常采用字母 e 表示異常,對于自定義的異常類,其后綴必須為 Exception
??? ??? 如: BusinessException
??? ??? 6、方法( Method )的命名
??? ??? ??? 方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。
??? ??? ??? 方法名盡可能的描述出該方法的動作行為。返回類型為 Boolean 值的方法一般由“ is ”或“ has ”來開頭
??? ??? 如: getCurrentUser() 、 addUser() 、 hasAuthority()
??? ??? 7、參數(shù)( Param )的命名
??? ??? ??? 第一個單詞的首字母小寫,其后單詞的首字母大寫。參數(shù)量名不允許以下劃線或美元符號開頭,
??? ??? ??? 雖然這在語法上是允許的。參數(shù)名應(yīng)簡短且富于描述。
??? ??? 如: public UserContext getLoginUser(String loginName);
??? ???
??? ??? 8、常量字段 ( Constants )的命名
??? ??? ??? 靜態(tài)常量字段( static final ) 全部采用大寫字母,單詞之間用下劃線分隔;
??? ??? 如: public static final Long FEEDBACK;
??????? public static Long USER_STATUS;
?三、注釋規(guī)范
??????? 一個很好的可遵循的有關(guān)注釋的經(jīng)驗法則是:
??? ??? ??? 問問你自己,你如果從未見過這段代碼,要在合理的時間內(nèi)有效地明白這段代碼,你需要一些什么信息???
??? ??? 1、一般概念
??????????? 1、注釋應(yīng)該增加代碼的清晰度
??? ??? ??? 2、保持注釋的簡潔
??? ??? ??? 3、在寫代碼之前或同時寫注釋
??? ??? ??? 4、注釋出為什么做了一些事,而不僅僅是做了什么
??? ??? 2、注釋哪些部分
??????????? 1、Java 文件:必須寫明版權(quán)信息以及該文件的創(chuàng)建時間和作者;
??? ??? ??? 2、類:類的目的、即類所完成的功能,以及該類創(chuàng)建的時間和作者名稱;多人一次編輯或修改同一個類時,
??? ??? ??? ??? 應(yīng)在作者名稱處出現(xiàn)多人的名稱;
??? ??? ??? 3、接口: 在滿足類注釋的基礎(chǔ)之上,接口注釋應(yīng)該包含設(shè)置接口的目的、它應(yīng)如何被使用以及如何不被使用。
??? ??? ??? ??? 在接口注釋清楚的前提下對應(yīng)的實現(xiàn)類可以不加注釋;
??? ??? ??? 4、方法注釋: 對于設(shè)置 (Set 方法 ) 與獲取 (Get 方法 ) 成員的方法,在成員變量已有說明的情況下,
??? ??? ??? ??? 可以不加注釋;普通成員方法要求說明完成什么功能,參數(shù)含義是什么且返回值什么;另外方法的創(chuàng)建
??? ??? ??? ??? 時間必須注釋清楚,為將來的維護(hù)和閱讀提供寶貴線索;
??? ??? ??? 5、方法內(nèi)部注釋: 控制結(jié)構(gòu),代碼做了些什么以及為什么這樣做,處理順序等,特別是復(fù)雜的邏輯處理部分,
??? ??? ??? ??? 要盡可能的給出詳細(xì)的注釋;
??? ??? ??? 6、參數(shù): 參數(shù)含義、及其它任何約束或前提條件;
??? ??? ??? 7、屬性: 字段描述;
??? ??? ??? 8、局部 ( 中間 ) 變量: 無特別意義的情況下不加注釋;
??? ??? 3、注釋格式
??????????? 遵循工程規(guī)定的統(tǒng)一注釋格式,一般情況下會以 codetemplates.xml 格式的文件導(dǎo)入 IDE(Eclipse)
??? ??? ??? 或者用Eclipse默認(rèn)的;
四、代碼格式規(guī)范
??? ??? ??? 遵循工程規(guī)定的統(tǒng)一代碼格式,一般情況下直接使用 IDE(Eclipse) 自帶的默認(rèn)代碼格式對代碼進(jìn)行格式化;
五、其他規(guī)范
??? ?? JSP 文件命名
??? ??? ??? 采用完整的英文描述說明 JSP 所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,
??? ??? 如: viewMessage.jsp 、editUser.jsp 等。
六、工程特有命名規(guī)范
??????? 1、持久層
??????????? 1、 Hibernate 映射文件及實體
??? ??? ??? ??? 與數(shù)據(jù)庫表名稱完全對應(yīng);
??? ??? ??? ??? 如: Advertisement.hbm.xml 、 Advertisement.java
??? ??? ??? 2、數(shù)據(jù)訪問 DAO
??? ??? ??? ??? DAO 接口和實現(xiàn)類名稱必須完全符合正常接口和實現(xiàn)類的命名規(guī)則,且最后以 ”DAO” 結(jié)尾
??? ??? ??? ??? DAO 內(nèi)的數(shù)據(jù)訪問方法必須足夠抽象的描述出對數(shù)據(jù)庫的基本 CRUD 操作;
??? ??? ??? ??? 如: ICrossAdDAO( 接口 ) 、 CrossAdDAO( 實現(xiàn)類 )
??? ??? ???
??? ??? ??? 3、各種操作數(shù)據(jù)庫的 HQL 配置文件
??? ??? ??? ??? HQL 文件的個數(shù)原則上與系統(tǒng)的 Services 層的服務(wù)個數(shù)相等,且以服務(wù)名稱命名 HQL 文件;
??? ??? ??? ??? 如: resource.hbm.xml
??? ???2、服務(wù)層
??????????? 1、服務(wù)接口和實現(xiàn)
??? ??? ??? ??? 服務(wù)接口和實現(xiàn)類必須完全符合正常接口和實現(xiàn)類的命名規(guī)則;以工程定義的服務(wù)名為主體,
??? ??? ??? ??? 并統(tǒng)一以 ”Serv” 結(jié)尾
??? ??? ??? ??? 如: IResourceServ( 服務(wù)接口 ) 、 ResourceServ( 接口實現(xiàn)類 )
??? ??? ??? 2、服務(wù)接口方法
??? ??? ??? ??? 方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。
??? ??? ?? 方法名盡可能的描述出該方法的動作行為。
??? ??? ??? ??? 返回類型為 Boolean 值:用“ is ”或“ has ”來開頭
??? ??? ??? ??? 得到某數(shù)據(jù): get+ 數(shù)據(jù)描述名詞復(fù)數(shù) + 數(shù)據(jù)類型;
??? ??? ??? ??? 得到所有數(shù)據(jù): get+All+ 數(shù)據(jù)描述名詞復(fù)數(shù) + 數(shù)據(jù)類型;
??? ??? ??? ??? 通過 XXX 得到 / 查詢某數(shù)據(jù): get/query+ 數(shù)據(jù)描述名詞復(fù)數(shù) + 數(shù)據(jù)類型 +By+ 條件;
??? ??? ??? ??? 添加某數(shù)據(jù): save/add+ 數(shù)據(jù)描述名詞 ()
??? ??? ??? ??? 更新某數(shù)據(jù): save/update+ 數(shù)據(jù)描述名詞;
??? ??? ??? ??? 刪除某數(shù)據(jù): delete/remove+ 數(shù)據(jù)描述名詞;
??? ??? ??? 3、業(yè)務(wù)對象
??? ??? ??? ??? 業(yè)務(wù)名稱 +BO
??? ??? ??? 4、查詢參數(shù)對象
??? ??? ??? ??? 凡是繼承 Abst***QuerySpec 的查詢參數(shù)類全部滿足以下規(guī)則:
??? ??? ??? ??? Query+ 所要查詢的數(shù)據(jù)描述名詞 +Spec
??? ??? ??? ??? 作為參數(shù)傳入時,參數(shù)名必須為:所要查詢的數(shù)據(jù)描述名詞 +Spec
??? ??? ??? ??? 如: QueryProgramSpec
??? ???3、MVC 層???????????
??????????? 1、Action 控制層
??? ??? ??? ??? Action 類名:功能模塊名稱 +Action ;
??? ??? ??? ??? Actoin 方法名稱盡可能的描述出頁面遷移的去向
??? ??? ??? ??? 如: LoginAction( 登錄用 action) , toWelcome( 轉(zhuǎn)向歡迎頁的 action 方法 )
??? ??? ??? 2、資源文件
??? ??? ??? ??? 系統(tǒng)全局資源文件: globalMessages_+ 字符編碼類型 +.properties
??? ??? ??? ??? 功能模塊內(nèi)部的資源文件: package.properties
??? ??? 4、Spring 配置文件
??????????? 1、Action 相關(guān)配置文件
??? ??? ??? ??? 文件目錄: WebRoot/WEB-INF/spring/action/ 功能模塊名稱 +_ApplicationContext.xml
??? ??? ??? 2、Services 相關(guān)配置文件
??? ??? ??? ??? 文件目錄: WebRoot/WEB-INF/spring/services/Services_ApplicationContext.xml
??? ??? ??? 3、全局性配置文件
??? ??? ??? ??? 文件目錄: WebRoot/WEB-INF/spring/工程名+_ApplicationContext.xml
??? ???5、JSP 文件
??? ??? ??? 采用完整的英文描述說明 JSP 所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,
??? ??? ??? 如: viewMessage.jsp 、editUser.jsp 等。