JAVA代码走查审查规范
JAVA代碼走查審查規(guī)范
(內(nèi)部專用)
| 分類 | 重要性 | 檢查項(xiàng) | 備注 |
| 命名 |
|
|
|
|
| 重要 | 命名規(guī)則是否與所采用的規(guī)范保持一致? | 成員變量,方法參數(shù)等需要使用首字母小寫,其余單詞首字母大寫的命名方式,禁止使用下劃線(_)數(shù)字等方式命名 |
|
| 不要出現(xiàn)局部變量,成員變量大寫字母開頭等問題 | ||
|
| 一般 | 是否遵循了最小長度最多信息原則? | 各種命名盡可能短,表意準(zhǔn)確,除2代替‘to’,4代替‘for’外,不建議使用數(shù)字在命名中 |
|
| 重要 | has/can/is前綴的函數(shù)是否返回布爾型? | 成員變量,方法參數(shù),局部變量等為布爾型時(shí),如果出現(xiàn)has/can/is開頭,則將這些詞去掉 |
|
| 重要 | 類名是否存在重名問題? | 自己實(shí)現(xiàn)的類盡量不要和別人的類重名,盡管不在同一個(gè)包下,特別是子類和父類重名的情況 |
| 注釋 |
|
|
|
|
| 重要 | 注釋是否較清晰且必要? | 方法JAVADOC注釋中需要說明各參數(shù)、返回值及異常說明,參數(shù)說明需按照參數(shù)名稱及用意對(duì)應(yīng)標(biāo)注 |
|
| 重要 | 復(fù)雜的分支流程是否已經(jīng)被注釋? |
|
|
| 一般 | 距離較遠(yuǎn)的}是否已經(jīng)被注釋? |
|
|
| 重要 | 函數(shù)是否已經(jīng)有文檔注釋?(功能、輸入、返回及其他可選) | 文件,類(含接口,枚舉等),成員變量,方法前需要有JAVADOC的注釋 |
|
| 一般 | 特殊用法是否被注釋? |
|
| 聲明、空白、縮進(jìn) |
|
|
|
|
| 一般 | 每行是否只聲明了一個(gè)變量?(特別是那些可能出錯(cuò)的類型) |
|
|
| 重要 | 變量是否已經(jīng)在定義的同時(shí)初始化? |
|
|
| 重要 | 類屬性是否都執(zhí)行了初始化? |
|
|
| 一般 | 代碼段落是否被合適地以空行分隔? |
|
|
| 一般 | 是否合理地使用了空格使程序更清晰? | 基本代碼格式中的空格符不可缺少,這些空格出現(xiàn)在?,:,+,-,*,/,=,==,>,<,>=,<=,!=,及各種括號(hào)附近 |
|
| 提示 | 代碼行長度是否在要求之內(nèi)? | 每行不得超過120個(gè)字符 |
|
| 重要 | controller,service,?dao?中不要聲明有狀態(tài)的變量。 | 此變量不能被修改。如果要進(jìn)行修改,必須通過鎖進(jìn)行控制。 |
|
| 一般 | 折行是否恰當(dāng)? |
|
|
| 一般 | 集合是否被定義為泛型類型? | 定義集合時(shí),建議定義其泛型類型,減少類型轉(zhuǎn)換和警告錯(cuò)誤 |
| 語句/功能分布/規(guī)模 |
|
|
|
|
| 一般 | 包含復(fù)合語句的{}是否成對(duì)出現(xiàn)并符合規(guī)范? |
|
|
| 重要 | 是否給單個(gè)的循環(huán)、條件語句也加了{(lán)}? | if,else,else?if,while,for,case等代碼塊必須用{}包圍 |
|
| 一般 | 單個(gè)變量是否只做單個(gè)用途? |
|
|
| 重要 | 單行是否只有單個(gè)功能?(不要使用;進(jìn)行多行合并) |
|
|
| 重要 | 單個(gè)函數(shù)是否執(zhí)行了單個(gè)功能并與其命名相符? |
|
|
| 一般 | 操作符++和—?—操作符的應(yīng)用是否符合規(guī)范? |
|
| 規(guī)模 |
|
|
|
|
| 重要 | 單個(gè)函數(shù)不超過規(guī)定行數(shù)? |
|
|
| 重要 | 縮進(jìn)層數(shù)是否不超過規(guī)定? |
|
| 可靠性(總則/變量和語句) |
|
|
|
|
| 重要 | 是否已經(jīng)消除了所有警告? | 開發(fā)工具的警告 |
|
| 重要 | 常數(shù)變量是否聲明為final? |
|
|
| 重要 | 對(duì)象使用前是否進(jìn)行了檢查? |
|
|
| 重要 | 成員變量,局部變量是否在使用前被賦值? | 對(duì)象初始化為null的對(duì)象被調(diào)用前必須被重新賦值,如果賦值語句在try塊中,調(diào)用操作必須在try塊中 |
|
| 一般 | 局部對(duì)象變量使用后是否被復(fù)位為NULL? | 特別是?數(shù)組?集合?Map |
|
| 重要 | 對(duì)數(shù)組的訪問是否是安全的?(合法的index取值為[0,?MAX_SIZE-1])。 |
|
|
| 重要 | 是否確認(rèn)沒有同名變量局部重復(fù)定義問題? | 嚴(yán)禁局部變量名稱和類或?qū)ο蟪蓡T變量同名 |
|
| 一般 | 程序中是否只使用了簡單的表達(dá)式? |
|
|
| 重要 | 是否已經(jīng)用()使操作符優(yōu)先級(jí)明確化? |
|
|
| 重要 | 所有判斷是否都使用了(常量==變量?或者?常量.equals(變量))的形式? | 常量放在比較符前可以有效降低比較符寫成賦值語句?,減少空指針異常 |
|
| 重要 | 是否每個(gè)if-else?if-else語句都有最后一個(gè)else以確保處理了全集? |
|
|
| 重要 | 是否每個(gè)switch-case語句都有最后一個(gè)default以確保處理了全集? |
|
|
| 一般 | for循環(huán)是否都使用了包含下限不包含上限的形式?(k=0;?k<MAX) |
|
|
| 重要 | XML標(biāo)記書寫是否完整,字符串的拼寫是否正確? |
|
|
| 重要 | 對(duì)于流操作代碼的異常捕獲是否有finally操作以關(guān)閉流對(duì)象? | 關(guān)閉前需要判斷?流對(duì)象是否為空? |
|
| 提示 | 退出代碼段時(shí)是否對(duì)臨時(shí)對(duì)象做了釋放處理? |
|
|
| 重要 | 對(duì)浮點(diǎn)數(shù)值的相等判斷是否是恰當(dāng)?shù)?#xff1f; | 嚴(yán)禁使用==直接判斷浮點(diǎn)數(shù)值?。提供通用方法 |
|
| 重要 | 是否對(duì)象比較都使用了equals? | 對(duì)象(包括包裝類)比較必須使用equals,而不是使用==或!=操作 |
|
| 重要 | 使用equals進(jìn)行比較時(shí)是否確保比較的兩個(gè)對(duì)象類型一致? | equals方法比較的對(duì)象在對(duì)象類型確定的前提下,建議是同一類型的,例如Integer和""使用equals是不提倡的 |
|
| 一般 | 操作Map或Properties結(jié)構(gòu)對(duì)象,用于傳值時(shí)是否將Key定義為常量? | Session,Request等對(duì)象的setAttribute,getAttribute方法的key建議使用常量,不得手工輸入字符串 |
|
| 重要 | 是否在類型轉(zhuǎn)換前確保了類型的兼容? | 除非明確保證對(duì)象類型 |
|
| 重要 | 包裝類做簡單預(yù)算前是否保證非空??建議都使用包裝類。 | 包裝類進(jìn)行操作前,建議進(jìn)行非空(null?!=?xx)判斷,防止發(fā)生空指針異常 |
|
| 重要 | 對(duì)象屬性在使用前是否確保被準(zhǔn)確賦值? | 只讀屬性(只提供get方法的成員變量)除非特意返回固定值,否則必須提供set方法或在其他方法調(diào)用時(shí)將其賦值 |
|
| 重要 | 方法調(diào)用前是否有非空判斷? | 對(duì)參數(shù)的非空判斷必須出現(xiàn)在方法調(diào)用之前,否則說明前面可能導(dǎo)致空指針或者后者判斷是沒有必要的,非空判斷,默認(rèn)由調(diào)用者提供 |
|
| 重要 | 非線程安全的對(duì)象是否被正確保證線程安全? | DateFormat實(shí)例的format方法調(diào)用不是線程安全,類似的情況不適合使用static定義,建議使用ThreadLocal方式實(shí)現(xiàn),參看UnifiedCodeGenerator |
|
| 一般 | 相同用意的成員變量是否使用了相同的命名? | 不同實(shí)體Entity、VO、BO之間表示同一含義的成員變量,建議使用相同的名稱,盡量不要出現(xiàn),有的地方用username,有的地方用userName這樣的情況 |
| 可靠性(函數(shù)) |
|
|
|
|
| 重要 | 入口對(duì)象是否都被進(jìn)行了判斷不為空? |
|
|
| 重要 | 入口數(shù)據(jù)的合法范圍是否都被進(jìn)行了判斷? |
|
|
| 重要 | 是否對(duì)有異常拋出的方法都執(zhí)行了try...catch保護(hù)? |
|
|
| 重要 | 是否函數(shù)的所有分支都有返回值? |
|
|
| 重要 | int的返回值是否合理?(負(fù)值為失敗,非負(fù)值成功) |
|
|
| 一般 | 對(duì)于反復(fù)進(jìn)行了int返回值判斷是否定義了函數(shù)來處理? |
|
|
| 一般 | 關(guān)鍵代碼是否做了捕獲異常處理? |
|
|
| 一般 | 字典表定義是否用枚舉,或者有一個(gè)統(tǒng)一的定義? |
|
|
| 重要 | 是否對(duì)方法返回值對(duì)象做了null檢查,該返回值定義時(shí)是否被初始化? |
|
|
| 重要 | 是否對(duì)同步對(duì)象的遍歷訪問做了代碼同步? |
|
|
| 重要 | 是否確認(rèn)在對(duì)Map對(duì)象使用迭代遍歷過程中沒有做增減元素操作? | Map遍歷時(shí)執(zhí)行增減元素操作將拋出ConcurrentModificationException,對(duì)集合對(duì)象遍歷時(shí)建議都不要進(jìn)行增減元素操作。 |
|
| 重要 | 線程處理函數(shù)循環(huán)內(nèi)部是否有異常捕獲處理,防止線程拋出異常而退出? |
|
|
| 重要 | 原子操作代碼異常中斷,使用的相關(guān)外部變量是否恢復(fù)先前狀態(tài)? |
|
|
| 重要 | 函數(shù)對(duì)錯(cuò)誤的處理是恰當(dāng)?shù)?#xff1f; |
|
|
| 重要 | 異常捕獲后是否進(jìn)行了日志記錄或異常繼續(xù)拋出? | 異常捕獲后如果無法處理需要繼續(xù)拋出,如果可以處理,建議將異常日志進(jìn)行記錄 |
|
| 重要 | 是否構(gòu)造方法中不調(diào)用當(dāng)前對(duì)象的構(gòu)造方法 | 嚴(yán)禁在構(gòu)造方法中new一個(gè)當(dāng)前對(duì)象 |
| 可維護(hù)性 |
|
|
|
|
| 重要 | 實(shí)現(xiàn)代碼中是否消除了直接常數(shù)?(用于計(jì)數(shù)起點(diǎn)的簡單常數(shù)例外) |
|
|
| 重要 | 是否消除了導(dǎo)致結(jié)構(gòu)模糊的連續(xù)賦值?(如a=?(b=d+c?)) |
|
|
| 重要 | 是否正確使用了日志記錄? |
|
|
| 一般 | 是否有冗余判斷語句?(如:if?(b)?return?true;?else?return?false;) | “if?(b)?return?true;?else?return?false;”==》“return?b;”;禁止使用類似“if/while(表達(dá)式?==?true)或if/while(表達(dá)式?==?false)”的判斷 |
|
| 重要 | 是否把方法中的重復(fù)代碼抽象成私有函數(shù)? |
|
| 代碼警告 |
|
|
|
|
| 一般 | 是否清除了多余導(dǎo)入的包或類? |
|
|
| 重要 | 是否清除了只定義未使用的局部變量? | 嚴(yán)禁局部變量被定義或者初始化而未被使用,這種情況需要?jiǎng)h除該局部變量 |
|
| 一般 | 是否將魔鬼數(shù)字修改為常量使用? | 不允許直接使用除-2,-1,0,1,2,3,4,5,6,7,8,9,10外的數(shù)字,除此外的數(shù)字需要定義常量使用 |
|
| 提示 | 常量定義是否為static?final格式? | 常量定義格式為public/protected//private?static?final?Type?TYPE,static和final順序要保持一致 |
|
| 提示 | 實(shí)現(xiàn)序列化的對(duì)象是否定義了serialVersionUID? | 建議實(shí)現(xiàn)Serializable的類需要增加“private?static?final?long?serialVersionUID?=?1L;” |
| 可讀性 |
|
|
|
|
| 一般 | 是否用if?else結(jié)構(gòu)替換了三元運(yùn)算符? | 表達(dá)式復(fù)雜情況下?不要使用(flag?exp1:exp2)語句,該語句需要修改為if?else結(jié)構(gòu) |
|
| 一般 | 代碼注釋率是否結(jié)余30%~60%之間? | 代碼注釋率應(yīng)落在30%~60%之間 |
| 性能 |
|
|
|
|
| 重要 | 日志記錄的Log,Logger對(duì)象是否定義為常量? | 用于記錄日志的Log,Logger對(duì)象在類中定義必須是static?final的,建議定義為private的,因?yàn)檫@類對(duì)象初始化比較耗時(shí),不利系統(tǒng)運(yùn)行 |
| 日志 |
|
|
|
|
| 重要 | 打印信息是否都用日志管理? | 代碼中建議不要使用System.out.println打印信息,只有在系統(tǒng)啟動(dòng)或系統(tǒng)即將退出時(shí)使用,其余部分全部用日志記錄 |
| 圈復(fù)雜度 |
|
|
|
|
| 重要 | 單個(gè)類行數(shù)是否不大于500行? | 單個(gè)類建議行數(shù)小于500行,最多不超過1000行 |
|
| 重要 | 方法參數(shù)個(gè)數(shù)是否在7個(gè)以內(nèi)? | 方法參數(shù)個(gè)數(shù)建議不大于5個(gè),最多不超過7個(gè) |
|
| 重要 | 單個(gè)方法函數(shù)是否不大于30行? | 單個(gè)方法建議函數(shù)不大于30行,做多不超過60行 |
|
| 重要 | 單方法中try/for/while/switch/if最深深度是否不大于5? | 單方法中try/for/while/switch/if最深深度不允許大于5 |
|
| 重要 | 方法調(diào)用最深深度是否不大于15? | 方法內(nèi)部+內(nèi)部調(diào)用累計(jì)深度不允許大于15 |
| SQL空格 |
|
|
|
|
| 一般 | 連接符or、in、and、以及=、<=、>=等前后加上一個(gè)空格。 |
|
|
| 一般 | 逗號(hào)之后必須接一個(gè)空格。 |
|
|
| 一般 | 關(guān)鍵字、保留字和左括號(hào)之間必須有一個(gè)空格。 |
|
| SQL注釋 |
|
|
|
|
| 重要 | 對(duì)較為復(fù)雜的SQL語句加上注釋,說明算法、功能。注釋風(fēng)格:注釋單獨(dú)成行、放在語句前面。 |
|
|
| 重要 | 對(duì)重要的計(jì)算應(yīng)說明其功能。 | SQL中盡量少涉及業(yè)務(wù)邏輯 |
|
| 一般 | 可采用單行/多行注釋。(--?或?/*?*/方式)。 |
|
| SQL優(yōu)化性能建議 |
|
|
|
|
|
| 1?書寫SQL語句優(yōu)化細(xì)則 |
|
|
| 重要 | ???1)?盡量避免相同語句由于書寫格式的不同,而導(dǎo)致多次語法分析。 |
|
|
| 重要 | ???2)?多表連接時(shí),使用表的別名來引用列。 | 建議最多5個(gè)連接 |
|
| 重要 | ???3)?不要在任何代碼中使用?SELECT?*。 |
|
|
| 重要 | ???4)?where條件中盡量減少使用常量比較,改用參數(shù)變量。 |
|
|
| 重要 | ???5)?盡量少用嵌套查詢。如必須,請(qǐng)用not?exist代替not?in子句。 |
|
|
| 重要 | ???6)?用多表連接代替EXISTS子句。 |
|
|
| 重要 | ???7)?使用UNION?ALL提高性能?。 |
|
|
| 重要 | ???8)?in、or子句常會(huì)使用工作表,使索引失效;如果不產(chǎn)生大量重復(fù)值,可以考慮把子句拆開;拆開的子句中應(yīng)該包含索引。 |
|
|
|
| 2?排序注意事項(xiàng) |
|
|
| 重要 | ???1)?大量的排序操作影響系統(tǒng)性能,所以盡量減少orderby和group?by排序操作。如必須使用排序操作,請(qǐng)遵循如下規(guī)則: |
|
|
| 重要 | ?????a.?排序盡量建立在有索引的列上。 |
|
|
| 重要 | ?????b.?如結(jié)果集不需唯一,使用union?all代替union。 |
|
|
|
| 3?選用索引注意事項(xiàng) |
|
|
| 重要 | ???1)?對(duì)于復(fù)合索引,SQL語句必須使用主索引列。 |
|
|
| 重要 | ???2)?索引中,盡量避免使用NULL。 |
|
|
| 重要 | ???3)?對(duì)于索引的比較,盡量避免使用NOT=(!=)。 |
|
|
| 重要 | ???4)?查詢列和排序列與索引列次序保持一致。 |
|
|
|
| 4?其他經(jīng)驗(yàn)性規(guī)則 |
|
|
| 重要 | ???1)?任何對(duì)列的操作都將導(dǎo)致表掃描,它包括數(shù)據(jù)庫函數(shù)、計(jì)算表達(dá)式等等,查詢時(shí)要盡可能將操作移至等號(hào)右邊。 |
|
總結(jié)
以上是生活随笔為你收集整理的JAVA代码走查审查规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Breadth-first Searc
- 下一篇: MyBatis之八:需要说明的几个jav