CheckStyle 統(tǒng)一編碼規(guī)范

CheckStyle是什么:CheckStyle是SourceForge下的一個項(xiàng)目,提供了一個幫助JAVA開發(fā)人員遵守某些編碼規(guī)范的工具惨险。它能夠自動化代碼規(guī)范檢查過程羹幸,從而使得開發(fā)人員從這項(xiàng)重要但枯燥的任務(wù)中解脫出來。

本文從測試人員角度辫愉,對N個項(xiàng)目的進(jìn)行了代碼規(guī)范的檢查栅受,匯總問題,并對各個規(guī)則設(shè)置處理方式,以及Eclipse中格式設(shè)置自動修復(fù)

1.

配置自己的checkstyle.xml

可以參考官方提供了sun屏镊、google的檢查規(guī)則依疼,兩者檢查都比較細(xì),定義自己的檢查規(guī)則而芥,可以先把所有規(guī)則羅列出來律罢,初步分出 必須檢查、可忽略棍丐、不確認(rèn) 三個分類误辑,然后和BOSS有個溝通,將檢查規(guī)則明確下來歌逢。

當(dāng)前官網(wǎng)提供154種規(guī)則巾钉,自己定義的規(guī)則只檢查83種。

ArrayTypeStyle檢查數(shù)組類型定義的樣式秘案。

AvoidNestedBlocks檢查不需要的嵌套’{}’

EmptyBlock檢查空的代碼塊砰苍。

LeftCurly檢查’{’和代碼是否同行

NeedBraces檢查是否需要大括號。主要是在if踏烙,else時的情況拌夏。

RightCurly檢查’}’和代碼是否同行

ArrayTrailingComma檢查數(shù)組初始化是否以逗號結(jié)束

AvoidInlineConditionals檢查inline的條件操作著洼。(避免內(nèi)聯(lián)條件語句)

DeclarationOrder檢查類和接口中的聲明順序。

DefaultComesLast檢查default的clause是否在switch代碼段的最后。

EmptyStatement檢查空的代碼段毡惜。

EqualsAvoidNull檢查空字符串進(jìn)行equals()比較

ExplicitInitialization檢查類和對象成員是否初始化為默認(rèn)值。

FinalLocalVariable檢查未改變過的局部變量是否聲明為final潘明。

FallThrough檢查switch代碼的case中是否缺少break蛋欣,return,throw和continue处面。

IllegalCatch檢查是否catch了不能接受的錯誤厂置。

IllegalThrows檢查是否拋出了未聲明的異常。

IllegalType檢查未使用過的類魂角。

MagicNumber檢查是否有“magicnumbers”硬寫到代碼里的整數(shù)常量

InnerAssignment檢查是否存在內(nèi)部賦值(不允許)(已查)

MissingSwitchDefault檢查switch語句是否有default的clause昵济。

ModifiedControlVariable檢查循環(huán)控制的變量是否在代碼塊中被修改。

MultipleStringLiterals檢查一個字符串變量在不改變變量值的情況下或者字符串出現(xiàn)的次數(shù)

MultipleVariableDeclarations檢查一次聲明多個變量時野揪,變量是否在同一行或者在同一個語句中

NestedIfDepth檢查嵌套的層次深度访忿。最多5層

NestedForDepth檢查嵌套的層次深度。最多3層

NestedTryDepth檢查try-catch異常處理斯稳,最多3層

PackageDeclaration檢查類中是否有聲明package海铆。

ParameterAssignment檢查是否存在不允許的參數(shù)賦值。

RequireThis檢查代碼中是否有“this.”挣惰。

ReturnCount限制return個數(shù)卧斟。默認(rèn)為3(限制邏輯)

SimplifyBooleanExpression檢查是否有過度復(fù)雜的布爾表達(dá)式殴边。

SimplifyBooleanReturn檢查是否有過于復(fù)雜的布爾返回代碼段。

StringLiteralEquality檢查字符串是否有用==或!=進(jìn)行操作珍语。

UnnecessaryParentheses檢查是否使用了多余的小括號

MutableException確保異常是不可變的

ThrowsCount限制拋出異常的數(shù)量锤岸。(默認(rèn)設(shè)置為3)

VisibilityModifier檢查類成員的可見度。(類的屬性為私有廊酣,靜態(tài)才能有public能耻,屬性需帶有修飾符)

FinalParameters檢查方法名、構(gòu)造函數(shù)亡驰、catch塊的參數(shù)是否是final的晓猛。(資源是否要釋放)

AvoidStarImport檢查是否有使用*進(jìn)行import。

ImportOrder檢查import的分組和順序凡辱。

RedundantImport檢查是否有重復(fù)的import

UnusedImports檢查是否有未使用的import戒职。

Indentation檢查代碼中正確的縮進(jìn)

JavadocMethod檢查方法是否有注釋,可以不聲明RuntimeException

JavadocStyle檢查javadoc的格式透乾。

JavadocType檢查類是否缺少注釋(允許未知標(biāo)簽)

JavadocVariable檢查變量是否缺少注釋(只檢查常量)

ModifierOrder檢查修飾符的順序是否遵照java語言規(guī)范洪燥。

RedundantModifier檢查接口和annotation中是否有重復(fù)的修飾符

AbstractClassName檢查抽象類的命名

ConstantName檢查常量名。

LocalFinalVariableName檢查局部的final類型的變量命名

LocalVariableName檢查局部的非final類型的變量名

MemberName檢查非靜態(tài)變量乳乌。

MethodName檢查方法的命名

PackageName檢查包的命名捧韵。

ParameterName檢查方法的參數(shù)的命名

StaticVariableName檢查靜態(tài)的,非final類型的變量名汉操。

TypeName檢查類和接口的命名

NewlineAtEndOfFile檢查文件是否以一個空行結(jié)束再来。

Regexp檢查程序是否有System.out.println(排除已注釋)

AnonInnerLength檢查匿名內(nèi)部類的長度。默認(rèn)為150磷瘤。

FileLength檢查java文件的長度芒篷。默認(rèn)為1500。

LineLength檢查代碼行的長度采缚。默認(rèn)為80针炉。

MethodLength檢查方法和構(gòu)造函數(shù)的長度。默認(rèn)為60扳抽。

ParameterNumber檢查方法和構(gòu)造函數(shù)的參數(shù)個數(shù)篡帕。默認(rèn)為5。

TodoCommentTODO檢查贸呢,是否出現(xiàn)未辦事項(xiàng)

TrailingComment確保代碼沒有尾行注釋

Translation檢查property文件中是否有相同的key赂苗。

UncommentedMain檢查是否有未注釋的main方法。

UpperEll檢查long型約束是否有大寫的“L”贮尉。

EmptyForInitializerPad檢查是否有未初始化的循環(huán)變量

EmptyForIteratorPad檢查是否有空的迭代

FileTabCharacter檢查是否有Tab字符

MethodParamPad允許方法名后緊跟左邊圓括號"("

NoWhitespaceAfter檢查分隔符后的空白。

NoWhitespaceBefore檢查分隔符前的空白朴沿。

OperatorWrap檢查操作符的空白規(guī)則

ParenPad檢查圓括號的空白規(guī)則

TypecastParenPad檢查強(qiáng)制轉(zhuǎn)型的圓括號的空白規(guī)則(String)object)

WhitespaceAfter檢查分隔符后是否有空白

WhitespaceAround檢查分隔符周圍是否有空白


2.

使用ant 調(diào)用checkstyle 獲取結(jié)果文件

ant 對應(yīng)的文件檢查文件:?check.xml?

執(zhí)行ant后 獲取的檢查結(jié)果:?checkstyle_sccms.xml


3.

解析checkStyle的結(jié)果文件(XML)猜谚,并存入數(shù)據(jù)庫

解析代碼在 ?CheckStyleErrorParse.java


4.

數(shù)據(jù)庫數(shù)據(jù)分析

CheckStyle Into Mysql

1) 查每個種類有多少個Error:

SELECT source,COUNT(source) as total,message FROM checkstyle_error_scepg GROUP BY source order by source asc;

2) 查每個文件有多少個Error

SELECT file_name,COUNT(file_name) as total FROM checkstyle_error_scepg GROUP BY file_name order by total desc;


5.

統(tǒng)計(jì)匯總?

目的:對當(dāng)前所有已檢查的項(xiàng)目 能一目了然地看到有多少個錯誤败砂,平均每個文件的錯誤數(shù),每個檢查項(xiàng)具體有多少問題等

CheckStyle 統(tǒng)計(jì)結(jié)果

6.

問題的處理方式

對檢查出的問題定義了四種處理方式:

1)代碼重構(gòu) (檢查項(xiàng)NestedIfDepth魏铅、NestedForDepth昌犹、NestedTryDepth、ReturnCount览芳、ThrowsCount斜姥、FileLength、MethodLength沧竟、ParameterNumber)

2)研發(fā)處理 (Naming Conventions铸敏、Javadoc、Design悟泵、部分Coding)

3)格式設(shè)置 (4個空白格替代Tab鍵值杈笔、分隔符、操作符前后空格設(shè)置糕非,Imports 蒙具、RequireThis等從格式規(guī)避)

4)非強(qiáng)制性 (只檢查,可不做修改)


7.

Eclipse格式設(shè)置

Code Style 的Clean Up朽肥、Code Templates禁筏、Formatter ,三者都是圍繞checkstyle定義的檢查規(guī)則衡招,從格式上對需進(jìn)行規(guī)避篱昔。

Clean up 配置如下,文件在cleanup.xml蚁吝,Clean Up 可以幫忙找出不符合要求的旱爆,并自動刪除/補(bǔ)全。

Clean up

Formatter 主要對coding 的顯示樣式進(jìn)行規(guī)范化(操作符/分隔符/括號等前后空格窘茁、換行怀伦、是否同行等),設(shè)置好了之后山林,今后在項(xiàng)目上點(diǎn)擊右鍵-source-Format房待,就可以自動調(diào)整文件的格式啦,非常方便驼抹,可設(shè)置有Indentation桑孩、Braces、White Space 框冀、Blank Lines流椒、New Lines、Control Statements明也、Line Wrapping宣虾、Comments

formatter1

Code Templates 主要對Coding 整體設(shè)置 注釋模板惯裕、編碼模板

1)注釋模板:如對文件、類绣硝、方法蜻势、參數(shù)設(shè)置統(tǒng)一注釋

2)編碼模板:對文件、類鹉胖、方法 須有哪些內(nèi)容做統(tǒng)一

具體配置模板在 codeTemplates.xml

codeTemplates

8.

驗(yàn)證效果

第一步:在項(xiàng)目上右鍵-source-Format

第二步:在項(xiàng)目上右鍵-source-Clean up

這一步會檢查出很多不符合規(guī)范的握玛,點(diǎn)擊下一步,進(jìn)行清理 自動刪除/補(bǔ)全 即可

第三步:執(zhí)行ant的check.xml

第四步:查看新的檢查結(jié)果

以sccms為例

檢查結(jié)果對比
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甫菠,一起剝皮案震驚了整個濱河市挠铲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淑蔚,老刑警劉巖市殷,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刹衫,居然都是意外死亡醋寝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門带迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來音羞,“玉大人,你說我怎么就攤上這事仓犬⌒岽拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵搀继,是天一觀的道長窘面。 經(jīng)常有香客問我,道長叽躯,這世上最難降的妖魔是什么财边? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮点骑,結(jié)果婚禮上酣难,老公的妹妹穿的比我還像新娘。我一直安慰自己黑滴,他們只是感情好憨募,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袁辈,像睡著了一般菜谣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天葛菇,我揣著相機(jī)與錄音甘磨,去河邊找鬼。 笑死眯停,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卿泽。 我是一名探鬼主播莺债,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼签夭!你這毒婦竟也來了齐邦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤第租,失蹤者是張志新(化名)和其女友劉穎措拇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慎宾,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丐吓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趟据。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片券犁。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汹碱,靈堂內(nèi)的尸體忽然破棺而出粘衬,到底是詐尸還是另有隱情,我是刑警寧澤咳促,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布稚新,位于F島的核電站,受9級特大地震影響跪腹,放射性物質(zhì)發(fā)生泄漏褂删。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一尺迂、第九天 我趴在偏房一處隱蔽的房頂上張望笤妙。 院中可真熱鬧,春花似錦噪裕、人聲如沸蹲盘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽召衔。三九已至,卻和暖如春祭陷,著一層夾襖步出監(jiān)牢的瞬間苍凛,已是汗流浹背趣席。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醇蝴,地道東北人宣肚。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像悠栓,于是被迫代替她去往敵國和親霉涨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理惭适,服務(wù)發(fā)現(xiàn)笙瑟,斷路器,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • 本文主要介紹以下內(nèi)容:(1)CheckStyle詳細(xì)使用(2)如何定制專屬CheckStyle檢查規(guī)則(3)如何定...
    freddyyao閱讀 14,941評論 11 16
  • 水滸傳一 水泊梁山八百里癞志,稼穡漁獵富饒地往枷。 民不聊生北宋末,替天行道舉大旗凄杯。
    小蟲_6c80閱讀 268評論 0 2
  • 有這樣一個夢 去向沒有盡頭的遠(yuǎn)方 背著行囊 前路茫茫 總是獨(dú)自在白霧中彷徨 夢的遠(yuǎn)方 是一個人游蕩 帶著一路走來的...
    夢想上天的小姑娘閱讀 260評論 4 2