技術(shù)-開發(fā)checkstyle4.3中文手冊(cè)_第1頁(yè)
技術(shù)-開發(fā)checkstyle4.3中文手冊(cè)_第2頁(yè)
技術(shù)-開發(fā)checkstyle4.3中文手冊(cè)_第3頁(yè)
技術(shù)-開發(fā)checkstyle4.3中文手冊(cè)_第4頁(yè)
技術(shù)-開發(fā)checkstyle4.3中文手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Checkstyle4.3中文加入OpenDoc前 預(yù)覽版思?2008申思維本文根據(jù)Checkstyle4.3英文文檔而來。我打算發(fā)布成OpenDoc,歡迎大家給我來信,多提意前介概特N用的最多的20%功在Ant中使用Ncheckstyle任務(wù)的參可以嵌套的ant元在Eclipse中使用6.1.和安使JavaDoc注類和接口的方法的方法的變量的注文件import中避免星號(hào)沒用的空方法名與左邊圓括號(hào)之類型轉(zhuǎn)換中圓括號(hào)附近的空對(duì)"Tab"的檢關(guān)鍵對(duì)區(qū)域(emptyblock)的檢對(duì)左側(cè)括號(hào){的檢查(略對(duì)右側(cè)括號(hào)}的檢查(略避免內(nèi)聯(lián)(inline)override的equals方空語(yǔ)句equals和hashCode方應(yīng)該成final的局部變不合適的魔法丟了default分支的被更改的循環(huán)控制變多余的未被簡(jiǎn)化的條件表達(dá)未被簡(jiǎn)化的布爾返回字符串(String)嵌套的if調(diào)用父類的父類的不合理的不合理的packageswitch語(yǔ)句的defaultswitch中錯(cuò)誤分支多個(gè)內(nèi)容相同的字符串變同一行多個(gè)變不使用Class的設(shè)FinalInterfacels隱藏工具類的構(gòu)造方方便繼承(extention)throws的數(shù) Npath雜7.14.1.使用的表達(dá)Todo注沒有被注釋掉的Main函大寫的final縮與代碼的注參考書插圖測(cè)試如何使用checkstyle的項(xiàng)開啟代碼窗口中的錯(cuò)誤提Problems增加了class使用自定義的Checkstyle配置文修正后的定制配置的檢查結(jié)在Ant環(huán)境下Checkstyle的所須文Ant下Checkstyle檢查正確的結(jié)Ant下Checkstyle檢查錯(cuò)誤的結(jié)成功安裝Checkclipse后的Preferences窗配置單個(gè)項(xiàng)目的設(shè)置單個(gè)項(xiàng)目的Checkclipse的文件過濾器 Problems的過濾器中配置Checkclipse表格checkstyle任務(wù)屬性formatter命名約定檢查模塊一覽WhitespaceAfter屬性列重復(fù)代碼插件的特性GenericIllegalRegexp的屬性列NewlineAtEndOfFile的屬性列Indentation的屬性列前Checkstle是非常優(yōu)秀的代碼規(guī)范檢查軟件,可以大幅的提高代碼質(zhì)量,當(dāng)項(xiàng)目的開發(fā)人員比較多時(shí),用它來統(tǒng)一代碼風(fēng)格是很有必要的。本文的寫作,是由于公司的質(zhì)量管理部門對(duì)代碼格式進(jìn)行了要求。在網(wǎng)上也沒有發(fā)現(xiàn)有比較詳細(xì)全面的中文文檔。所以參考Checkstle4.3的文檔寫就。有個(gè)比較神奇的20%-80%規(guī)律是這樣說的:一本書,用的最多的只是20%的內(nèi)容,它的出現(xiàn)幾率是80%;而剩下的80%內(nèi)容,被使用的不到20%。這個(gè)規(guī)律也同樣適用在其他東東上。只是數(shù)據(jù)上稍有差異。所以我特意安排了第4章用的最多的20%功能,作為典型的使用方法。對(duì)于趕時(shí)間的朋友,也可以直接看第2章N分鐘入門,可以讓你在最快的時(shí)間內(nèi)入門。對(duì)于時(shí)間充沛的朋友,建議多看看文檔。因?yàn)樽髡咭辉俚膹?qiáng)調(diào)“itisworthreadingthe 第5章在Ant中使用Checkstyle說明了在ant下的用法。第6章在Eclipse中使用Checkstyle說明對(duì)于初次接觸代碼規(guī)范的朋友,我安排了第3章常用的檢查,里面是個(gè)人以為滿足大多數(shù)公司要求第7章各種檢查是各種檢查的詳細(xì)用法,讀起來比較枯燥,建議象查字典那樣有需要時(shí)翻閱,所以歡迎意見為了加入OpenDoc,歡迎各位朋友文檔中的任何錯(cuò)誤和不足,也可以給我任何意見。請(qǐng)給我:shensiwei(at)希望本文對(duì)您有用概特概Checksyle是一款代碼格式檢查工具。它可以根據(jù)設(shè)置好的編碼規(guī)則來檢查代碼。比如符合規(guī)范的變量命名,良好的程序風(fēng)格等等。如果你的項(xiàng)目經(jīng)理開會(huì)時(shí)說,“我希望我們寫出來的代碼就象一個(gè)人寫的!”時(shí),用Checkstle絕對(duì)是正確選擇。:)本文檔就是在4.3的基礎(chǔ)上完成。截止到2008-02-22,的版本是4.4需要強(qiáng)調(diào)的是,Checkstyle只能做檢查,而不能做修改代碼提醒想修改代碼格式,請(qǐng)使用 它和Checkstyle配合使用非常合適特Checkstyle自帶的規(guī)則,也可以自己增加檢查規(guī)則。(這點(diǎn)跟Ant自定義target比較象) liJ,NetBeans,JBuilder等11種的發(fā)布版本4.4使用了SVN,關(guān)閉了CVS。SVN 這各種插件,見Checkstyle主頁(yè)中的列表2Nextreme在幾分鐘之內(nèi)了解Checkstyle的大致用法。適合趕時(shí)間的朋友。假設(shè)您已經(jīng)安裝好了測(cè)試生成文件夾eclipse_build.如圖2.1“測(cè)試如何使用checkstyle的項(xiàng)目”所示。圖2.1.測(cè)試如何使用checkstyle的項(xiàng)Checkstyle"前面打上勾。如圖2.2“開啟Checkstyle”所示。2.2開啟建立一個(gè)測(cè)試用的 比如SomeClassToBeChecked,內(nèi)容如下*Copyright(c)2001-2008BeijingBidLinkInfo-Tech.All Createdon2008-2-$Id:learn_in_5_min.xml,v1.32008/03/0303:43:44AdministratorExppackagepublicclassSomeClassToBeChecked}只有一個(gè)頭部注釋,沒有方法,啥啥用Checkstyle檢查它:右鍵點(diǎn)項(xiàng)目名,選擇"BuildProject",會(huì)把src文件夾進(jìn)行編譯,把中的代碼第10行處,有一個(gè)嘆號(hào),把鼠標(biāo)移上去就會(huì)出現(xiàn)提示"MissingaJavadoc圖2.3.代碼窗口中的錯(cuò)誤同時(shí),在Problems窗口中也有提示,如 “Problems窗口中的錯(cuò)誤提示”所示圖2.4.Problems窗口中的錯(cuò)誤提圖2.5.增加了class的注釋后的效果然后重新編譯,可以看出,Warning沒有了。檢查通注意非常,隨便一個(gè)項(xiàng)目都可以弄出幾千個(gè)Warning。所以,想用它,長(zhǎng)度方面:文件長(zhǎng)度不超過1500行,每行不超過120個(gè)字,方法不超過60行編碼方面:不能用魔法數(shù)(MagicNumber),if最多嵌套3層。那么,我們的檢查配置文件(如命名成my_check.xml)應(yīng)該是這樣的:<!DOCTYPEmodule"-//PuppyCrawl//DTDCheckConfiguration1.2//EN" <module<module<module<module<propertyname="max"<module<propertyname="max"方法不超過60<module<propertyname="tokens"<propertyname="max"類名(class或interface<module<module<module<module if最多嵌套3<module<propertyname="max"ConfigurationFile"一欄中選定我們的配置文件,然后確定。如圖2.6“使用自定義的圖2.6.使用自定義的Checkstyle配置文幾項(xiàng)。并且它們是以"Error"級(jí)別進(jìn)行提示,而不是默認(rèn)檢查時(shí)出現(xiàn)的"Warning"級(jí)別。比如,我們把一個(gè)方法中,增加4層嵌套(共5個(gè)if),2.7定制配置的檢查結(jié)果2.7.定制配置的檢查結(jié)果可以看到,出現(xiàn)了兩個(gè)Error方法名的"Namexxmustmatchpattern和if嵌套的"Nestedif-elsedepthis4..."。把它們都改過來,程序就好了。代碼的修正:依照上面的例子,把方法名小寫,if循環(huán)嵌套3層,然后重新編譯,OK。如2.8“修正后的定制配置的檢查結(jié)果圖2.8.修正后的定制配置的檢查結(jié)到這里就結(jié)束了??疵靼琢藛幔繗g迎給我意見,以及看到這里所用的時(shí)間。:)想在N分鐘內(nèi)了解ant下checkstle的使用方法,請(qǐng)看第5.1節(jié)“N分鐘極速入門”3.1.Checkstyle自帶了兩個(gè)配置文件:checkstylechecks.xmlsun_checks.xml。前者是checstyle作者定義的,后者是嚴(yán)格符合unann來。不注重的內(nèi)容,建議個(gè)人使用。如果是公司使用,建議把它再精簡(jiǎn)些。因?yàn)閷?duì)公司來說,這個(gè)配置文件還是比較苛刻的。3.1.了它的作用。本文的PDF文檔無法正常顯示其中的漢字,建議本節(jié)使用HTML版查看。:)<!DOCTYPE<!DOCTYPEmodule"-//PuppyCrawl//DTDCheckConfiguration1.2//EN" <module重復(fù)代碼的檢查,超過8行就認(rèn)為重復(fù),UTF-8格式--<module<propertyname="min"<modulejavadoc<module<!--檢查所有方法的javadoc,可以不RuntimeException--<module檢查某個(gè)變量的javadoc<module類名(class或interface的檢查<module<module<module<modulename="ParameterName<module文件長(zhǎng)度不超過1500<module<propertyname="max"<module<propertyname="max"方法不超過30<module<propertyname="tokens"<propertyname="max"方法的參數(shù)個(gè)數(shù)不超過3<module<propertyname="max"<module<module<module<module<propertyname="allowInSwitchCase"<module<module不許使用switch<module<propertyname="tokens"<module<!--絕對(duì)魔法數(shù)--<module <module多余的throw<module<module<moduleString的比較不能用<moduleif最多嵌套3<module<propertyname="max"try最多被嵌套1<module<module<module不能catchjava.lang.Exception<module<!--JUnitTestCase的方法存在。--<module<module<propertyname="max"<module<module<!--同一行不能有多個(gè)--<module<module <module <module <module <module 雜項(xiàng)<module<property<propertyname="format"<property ments" 的注釋--<module --<module4用的最多的20%功Core命名符合類,方法,成員變量等等名,一般要遵循Sun編碼規(guī)范。編碼中的長(zhǎng)度問題 如果兩個(gè)代碼段出現(xiàn)了一定行數(shù)的嚴(yán)格重復(fù),就判定它們已經(jīng)重復(fù)。5Ant中使用Ncheckstyle任務(wù)的參可以嵌套的ant元如果您趕時(shí)間,請(qǐng)看第5.1節(jié)“N分鐘極速入門”。N分鐘極速入(請(qǐng)打開一個(gè)秒表記時(shí),謝謝需要"checkstyle-all-4.3.jar",該jar文件包含了checkstyle所用的幾乎所有 最后,設(shè)置Ant的輸出文件夾為 如圖 “在Ant環(huán)境下Checkstyle的所須文件”所示圖5.1.在Ant環(huán)境下Checkstyle的所須文ant的配置文件中需要指定一個(gè)taskdef來定義checkstyle任務(wù)然后在checkstyle任務(wù)中指定配置文件(config屬性),和需要被檢查的文件夾(fileset)。本例使用的ant文件是這樣的:<?xml<?xmlversion="1.0"<taskdefresource="perties"<target<checkstyle<filesetdir="src"圖5.2.Ant下Checkstyle檢查正確的結(jié)法的長(zhǎng)度超過60,方法名大寫,就會(huì)看到出錯(cuò)信息,并且"BUILDFAILED"如圖5.3“Ant下圖5.3.Ant下Checkstyle檢查錯(cuò)誤的結(jié)本節(jié)結(jié)束,把看明白本節(jié)所用的時(shí)間通過 告訴我。因?yàn)橹罉?biāo)題中的"N"是多少。:)謝謝。5.1“N分鐘極速入門”中,就是擁有checkstyle-all-4.3.jar這個(gè)文件,并且在ant的配置文件中進(jìn)行task,如:<taskdefresource="perties"<taskdefresource="perties"然后通過<checkstyle/>任務(wù)來運(yùn)行。典型例本節(jié)假定使用checkstyle任務(wù)的前提條件都已滿使用my_check.xml文件,對(duì) 下的所有java文件進(jìn)行檢查<checkstyle<checkstyle<filesetdir="src" 下的checkstyle_errors.txt和checkstyle_errors.xml中:<checkstyle<checkstyle<filesetdir="src"<formattertype="plain"<formattertype="xml"使用定義了package的文件:<checkstyleconfig="config/my_check.xml"<checkstyleconfig="config/my_check.xml"checkstyle任務(wù)的參“5.1checkstyle任務(wù)名描是否必被檢查的一個(gè)file或者Checkstyle的配置文件。配置文件的使用方法見:第節(jié)“如何配置檢查指定了Checkstyle配置文件的URL定義了ant使用到的屬性的文否定義了Checkstyle配置文件中檢查的packagename的文否有violation時(shí)是否繼續(xù)檢查,默認(rèn)是否Thenameofapropertytosetintheeventofa否停止build前允許出現(xiàn)的"Error"的最大數(shù)目。默認(rèn)是否停止build前允許出現(xiàn)的"Warning"的最大數(shù)目。 ",也就是否類路徑,默認(rèn)是當(dāng)前使用的classpath否類路徑的否可以嵌套的ant元checkstyle任務(wù)中可以前臺(tái)以下元素:<filese>,<classpath>,<formatter>以及“5.2formatter名描是否plain:使用了DefaultLoggerxml:使用了XMLLogger默認(rèn)是否輸出到的文件。默認(rèn)是標(biāo)準(zhǔn)輸出(控制臺(tái)否是否把結(jié)果輸出到文件中。true或false.默認(rèn)是否6Eclipse中使用6.1.和安使6.1.和安的地址是:EclipseCS和Checkclipse本節(jié)講解的是后者,也就是CheckclipseCheckclipse安裝的方法同其他的Eclipse插件一樣。不清楚的朋友可以看這篇文章:Eclipse--使用links方式安裝Eclipse插件。links方式適用于Eclipse3.0,3.1,3.2和配置方圖6.1.成功安裝Checkclipse后的Preferences窗Checkclipse有兩個(gè)可以進(jìn)行配置,一個(gè)是全局的,一個(gè)是單個(gè)項(xiàng)目(Projec)的。全局的可以在整個(gè)Eclipse的orkbench中生效,而單個(gè)項(xiàng)目的配置可以在指定的項(xiàng)目中生效,它優(yōu)先于全局的配置。"Configuration"中,"EnableCheckstyle"一行前面打勾,然后在"CheckstyleConfigurationFile:"一行中選擇你的Checkstyle配置文件就可以了。如圖6.2“配置單個(gè)項(xiàng)目的Checkclipse”圖6.2.配置單個(gè)項(xiàng)目的對(duì)于全局的設(shè)置:"window->preferences"就可以看到。設(shè)置方法跟單個(gè)項(xiàng)目的設(shè)置是Filter"中修改被包含的文件??梢允褂?Add","Remove","Change"等按鈕進(jìn)行編輯。IncludedResources中顯示了被檢查的文件。如圖6.3“設(shè)置單個(gè)項(xiàng)目的Checkclipse的文件過濾器(filefilter)”圖6.3.設(shè)置單個(gè)項(xiàng)目的Checkclipse的文件過濾器(file注意除非很有必要,否則不要改FileFilter。使用默認(rèn)的就滿足95%幫助可以在Eclipse的"HelpHelpeContents"中的"CheckclipseCheckstylePlugin中找使Checkclipse的使用非常簡(jiǎn)單,它的每次檢查是跟隨Eclipse的"BuildProjec"一起進(jìn)行的。如果有錯(cuò)誤,會(huì)顯示在"Problems"子窗口中。另外,對(duì)于默認(rèn)的檢查,錯(cuò)誤是Warning級(jí)的,對(duì)于設(shè)置了配置文件后的檢查,錯(cuò)誤都是Error級(jí)的。看一下第2章N分鐘入門就肯定明白了:)符串的變量"hehe",檢查時(shí)就會(huì)出現(xiàn)“重復(fù)的字符串串”報(bào)錯(cuò),顯示"...[MultipleStringLiteralsCheck]",如:圖6.4“出錯(cuò)信息中的檢查名”所示。圖6.4.可能是"Problems"窗口的過濾器被修改了。請(qǐng)進(jìn)入到配置"Problems"過濾器窗口,在右側(cè)的"Showitemsoftype"列表中的"CheckclipseProblemMarker"6.5Problems的過圖6.5.Problems的過濾器中配置CheckclipseAs"那一組中,就有Checkstyle的選項(xiàng),如圖6.6“右鍵菜單中的checkstyle選項(xiàng)”所示。6.6右鍵菜單中的checkstyle可以看出,"Checkstyle"選項(xiàng)有三:CheckOpenFiles:檢查當(dāng)前Eclipse中打開的文件RemoveMarkers:當(dāng)前文件如果存在Checkstyle檢查出的錯(cuò)誤,就清除這些錯(cuò)常見問請(qǐng)告訴我。JavaDoc注類和接口的方法的方法的變量的注文件import中避免星號(hào)沒用的空方法名與左邊圓括號(hào)之類型轉(zhuǎn)換中圓括號(hào)附近的空對(duì)"Tab"的檢關(guān)鍵對(duì)區(qū)域(emptyblock)的檢對(duì)左側(cè)括號(hào){的檢查(略對(duì)右側(cè)括號(hào)}的檢查(略避免內(nèi)聯(lián)(inline)override的equals方空語(yǔ)句equals和hashCode方應(yīng)該成final的局部變不合適的魔法丟了default分支的被更改的循環(huán)控制變多余的未被簡(jiǎn)化的條件表達(dá)未被簡(jiǎn)化的布爾返回字符串(String)嵌套的if調(diào)用父類的父類的不合理的不合理的packageswitch語(yǔ)句的defaultswitch中錯(cuò)誤分支多個(gè)內(nèi)容相同的字符串變同一行多個(gè)變不使用Class的設(shè)FinalInterfacels隱藏工具類的構(gòu)造方方便繼承(extention)throws的數(shù) Npath雜7.14.1.使用的表達(dá)Todo注沒有被注釋掉的Main函大寫的final縮與代碼的注本節(jié)看起來比較煩冗,建議使用哪些東東,就看哪個(gè)小節(jié)。就象字典那樣 注意除非特別說明,否則檢查代碼的位置都要放在 這個(gè)結(jié)點(diǎn)下面如何配置檢度,就需要在<modulename="TreeWalker">節(jié)點(diǎn)下增加:<module<module<propertyname="tokens"<propertyname="max"如果沒有特殊說明,一般是增加在 name="TreeWalker">結(jié)點(diǎn)下如果一個(gè)module節(jié)點(diǎn)的屬性可以有多個(gè)值備選,那么這些值之間一般用","連接。比如"tokensLITERAL_STRING,LITERAL_INT"是否需要我按照表示的形式來說明這些屬性?也就是按照文檔的格式JavaDoc注類和接口的方法的方法的變量的類和接口的檢查所有的類和接<module<module也可以只檢查protected和public的類<module<module<propertyname="scope"<propertyname="tokens"protectedpublic""protected"那么就只檢查"protected,public"兩種,如果賦值"tokens"屬性指定了是檢查類還是接口還是都檢查。默認(rèn)是都檢查??蛇x的值是(檢查類)和"INTERFACE_DEF"。(檢查接口方法的方法的檢查所有方法的<module<module只檢查public方法的<module<module<propertyname="scope"protectedpublic""protected"那么就只檢查"protected,public"兩種,如果賦值注意如果被檢查的方法是某個(gè)interface方法的實(shí)現(xiàn),那么該方法的javadoc*publicvoid}javadoc中的參數(shù)等必須有說明比如,這樣的參數(shù)說明會(huì)被檢查認(rèn)為*@parampublicvoidsomeMethod(String因?yàn)樗鼪]有對(duì)該參數(shù)的說明,應(yīng)該加*@paramsomeParaThisisthepublicvoidsomeMethod(String變量的檢查類或接口的變量的 這樣<module<module命名約Naming注這里可以對(duì)java中的各種命名進(jìn)行檢查,比如方法名,變量名,常量名等等。模塊一由于相互之間很類似,所以放在一個(gè)表中說明。這些檢查使用的<module>的"name"屬性見下碼規(guī)范相同的。如表7.1“命名約定檢查模塊一覽表”所示。表7.1.模塊的"name"屬檢"format"屬性的默認(rèn)值 常量(staticfinal字段^[A-Z][A-Z0-9]*(_[A-Z0-^[a-z][a-zA-Z0-^[a-z][a-zA-Z0-非static型變^[a-z][a-zA-Z0-^[a-z][a-zA-Z0-package^[a-z]+(\.[a-zA-Z_][a-zA-Z0-方法中的^[a-z][a-zA-Z0-^[a-z][a-zA-Z0-模塊的"name"屬檢查"format"屬性的默認(rèn)類型(Class或Interface)^[A-Z][a-zA-Z0-注PackageName檢查的format默認(rèn)值是允許大寫的包名的,建議設(shè)置成只能小<module<module<propertyvalue="^[a-z]+(\.[a-z][a-z0-<module<module<property其中,tokens屬性的值是:CLASS_DEF和文件檢查文件頭區(qū)域是否包含指定的內(nèi)容??梢栽趆eaderFile屬性中指定一個(gè)外部文件的位置,該文件保存了文件頭信息。也可以使用另外一種方法:將文件頭信息直接寫在header屬性中。這樣就可以不用外部文件。*Copyright(c)2001-2008SomeCompany.All *Createdon2007-10-$Id:checks.xml,v1.82008/03/0303:37:19AdministratorExp其中第2,6noreLes屬性把這兩<module<module<propertyname="ignoreLines"value="2,<module<module<propertyname="headerFile"<propertyname="ignoreLines"value="2,import中避免星號(hào)沒用的import中避免星號(hào)如果不希望有任何importa.b.*;這樣的語(yǔ)句,請(qǐng)?jiān)谂渲梦募?,增?lt;module<module"excluds"屬性定義了被忽略的import。默認(rèn)是空。比<module<module<propertyname="excludes"這樣就會(huì)允許"importa.b.c.*importc.d.*沒用的重復(fù)importjava.lang<module <module長(zhǎng)度限文件長(zhǎng)檢查一個(gè)文件的行數(shù)不超過1500,如下:<module<module<propertyname="max"每行長(zhǎng)想規(guī)定一行的長(zhǎng)度不朝過120個(gè)字母<module<module<propertyname="max"方法長(zhǎng)認(rèn)是"true","tokens"可以指定檢查的是一般方法還是構(gòu)造方法,默認(rèn)都檢查,可用的值是"METHOD_DEF,CTOR_DEF"。想規(guī)定一個(gè)方法的行數(shù)不超過30行,如<module<module<propertyname="tokens"<propertyname="max"方法的參數(shù)個(gè)法,默認(rèn)都檢查??捎玫闹凳?METHOD_DEF,CTOR_DEF"。想規(guī)定一個(gè)方法的參數(shù)不超過5個(gè),并查構(gòu)造函數(shù),請(qǐng)?jiān)黾?lt;module<module<propertyname="max"<propertyname="tokens"空方法名與左邊圓括號(hào)之類型轉(zhuǎn)換中圓括號(hào)附近的空對(duì)"Tab"的檢個(gè)人以為不太重方法名與左邊圓括號(hào)之本檢查約定方法名與左邊圓括號(hào)之間不許出現(xiàn)空格。例如,下列的代碼格式是錯(cuò)誤的,在方法名"wrongStyleMethod"后面緊跟的是個(gè)空格,而不是publicvoidwrongStyleMethod方法名與圓括號(hào)不是一行默認(rèn)也是不允許的,如:publicvoid(Stringpara1,String本檢查只允許方法名后緊跟左邊圓括號(hào)"("<module<module圓括號(hào)附近的空不允許左圓括號(hào)右邊有空格,也不允許與右圓括號(hào)左邊有空格。例如下面的代碼會(huì)報(bào)錯(cuò),publicvoidwrongStyleMethod(Stringpara1,Stringpara2把對(duì)應(yīng)的空格去掉才是正確的:publicvoidcorrectStyleMethod(Stringpara1,String這樣檢<module<module默認(rèn)檢查范圍:構(gòu)造函數(shù)的調(diào)用,方法的調(diào)用,左,右圓括號(hào),父類構(gòu)造函數(shù)的調(diào)用。類型轉(zhuǎn)換中圓括號(hào)附近的ObjectObjectmyObject=(Object正確的應(yīng)ObjectObjectmyObject=使用本檢<module<module對(duì)"Tab"的檢使用本檢<module<module強(qiáng)烈建議使用本檢查前一定要先用代碼格式化工具把"tab"轉(zhuǎn)換成空格。否則"Error"會(huì)嚇人一跳。特定符號(hào)后的空名說類默認(rèn)名說類默認(rèn),例如,規(guī)定逗號(hào)","后必須有空<module<module<propertyname="tokens"關(guān)鍵key關(guān)鍵字的出現(xiàn)順每個(gè)關(guān)鍵字都有正確的出現(xiàn)順序。比如publicstaticfinalXXX是對(duì)一個(gè)常量的。如果使<module<module多余的關(guān)鍵ANNOTATION_FIELD_DEF"。默認(rèn)都檢查<module<module如果只想對(duì)一般方法做檢查<module<module<propertyname="tokens"對(duì)區(qū)域 block)的檢對(duì)左側(cè)括號(hào){的檢查(略對(duì)右側(cè)括號(hào)}的檢查(略也就是大括號(hào)包含起來的區(qū)域空白區(qū)只要是包含起來的,都是區(qū)域。比如ifelsecatch后面緊跟的,都是區(qū)域??梢詫?duì)它們進(jìn)行檢<module<module對(duì)左側(cè)括號(hào){的檢查(略個(gè)人認(rèn)為此檢查無意義……歡迎聽到你的需要括號(hào)的區(qū)比如,只有一條語(yǔ)句的 ,對(duì)于大括號(hào)是可用可不用的。也就是說a=0}a={它們是都可以通過編譯的 但是良好的代碼規(guī)范,都推薦使用后者的風(fēng)格。所以,想對(duì)此進(jìn)行查,請(qǐng)?jiān)谂渲梦募校?lt;module<module<propertyname="tokens"value="LITERAL_IF,其中"tokens"屬性指定了被檢查的區(qū)域,它的值可以是:"LITERAL_DO,LITERAL_ELSE,LITERAL_IFLITERAL_FORLITERAL_WHILE"<module<module對(duì)右側(cè)括號(hào)}的檢查(略需要的話請(qǐng)我。我把它加上不必要的括比如,這樣的代碼是可以通過編譯,但是風(fēng)格publicpublicvoid{intwhichIsWich={intwhichIsWhich=}System.out.println("value="+}因?yàn)樗黾恿艘粚?duì)很不必要的括號(hào)。對(duì)它進(jìn)行檢查可以這樣:<module<module<propertyname="allowInSwitchCase"<module<module避免內(nèi)聯(lián)(inline)override的equals方空語(yǔ)句equals和hashCode方應(yīng)該成final的局部變不合適的魔法丟了default分支的被更改的循環(huán)控制變多余的未被簡(jiǎn)化的條件表達(dá)未被簡(jiǎn)化的布爾返回字符串(String)嵌套的if調(diào)用父類的父類的不合理的不合理的packageswitch語(yǔ)句的defaultswitch中錯(cuò)誤分支多個(gè)內(nèi)容相同的字符串變同一行多個(gè)變不使用編碼的習(xí)數(shù)組尾巴的逗如果一個(gè)數(shù)組定義的右括 與最后一個(gè)元素不在同一行,就需要有一個(gè)逗號(hào)。比如int[]int[]a=new{我對(duì)這種編程風(fēng)格貌似沒見過。如果希望檢查數(shù)組的最后一個(gè)元素后面是有逗號(hào)的<module<module 據(jù)說每個(gè)元素后面都帶個(gè)逗號(hào),有利于重新安排元素的各個(gè)順序。仁者見仁,智者見智了避免內(nèi)聯(lián)(inline)條件也就是三目運(yùn)算符"?:"。有的內(nèi)聯(lián)條件讓代碼難以理解StringStringb=(a==null||a.length<1)?null:想避免它出現(xiàn),可以進(jìn)行檢查:<module<module注意使用了本檢查,也就是徹底了"?:"的使用。就連最簡(jiǎn)單的也不行,比如returnreturntrue?true:只能使用if-else來代override的equals方想檢查一個(gè)類覆寫(override)了euqals()方法,這樣<module<module空語(yǔ)句intinta0;// intb0;//想對(duì)它進(jìn)行檢查,請(qǐng)?jiān)谂渲梦募性黾樱?lt;module<moduleequals和hashCode方可以檢查一個(gè)類是否覆寫(override)了equals和hashCode方法<module<module應(yīng)該成final的局部變?nèi)绻硞€(gè)變量一直都沒變,那么它就應(yīng)該是final型的。想檢查它<module<module不合適的初始過new來構(gòu)造一個(gè)java.lang.Boolean,對(duì)應(yīng)的檢查應(yīng)該是:<module<module<propertyname="classes"不合適的<module<module<module<module<propertyname="tokens"想檢查,請(qǐng)參考com.puppycrawl.tools.checkstyle.api.TokenTypes中定義的常量?jī)?nèi)部賦值語(yǔ)如果有人這樣寫:StringsInteger.toString(i2<module<module魔法也 umber,非常讓程序不可讀。比如sexsex=publicpublicstaticfinalintMALE=0;sex=MALE;這樣我們就知道,原來是把sex變量的值設(shè)成“”。想檢查它,請(qǐng)?jiān)黾?lt;module<module 如果只想對(duì)int型和double型的數(shù)做檢查,而且忽略數(shù)字"0"和"0.05",可以這樣:<module<module<propertyname="tokens"value="NUM_DOUBLE,<propertyname="ignoreNumbers"value="0,該檢查有兩個(gè)屬性:"tokens"屬性可以指定檢查的范圍,可用的值是NUM_FLOATNUM_INTNUM_LONG""ignoreNumbers"屬性指定了可以忽略的數(shù)字,默認(rèn)是"-1,0,1,2"。魔法數(shù)的檢查很有必要,可以讓你的程序的可讀性大大增加。強(qiáng)烈建議使用。丟了default分支的<module<module被更改的循環(huán)控制變比如,一個(gè)for循環(huán)的循環(huán)數(shù)是只應(yīng)該在最后的i++中更改的,如果出現(xiàn)以下代碼:forfor(inti=0;i<1;i++) //這里是極可能是程序員大意寫}<module<module多余的為異常中的多余的Excpetion(比如duplicate,unchecked異常,或者它們的子類)做檢查。<module<module如果允許uncheckedexception?請(qǐng)?jiān)黾?lt;module<module未被簡(jiǎn)化的條件表達(dá)(btrueb||truefalse<module<module未被簡(jiǎn)化的布爾返回檢查未被簡(jiǎn)化的boolean返回語(yǔ)句,比如,ififreturnreturn就可以寫returnreturnCheckstyle作者自我調(diào)侃說:這個(gè)想法是從PMD的類似規(guī)則中剽竊過來的。哈哈。這<module<module字符串(String)的比檢查字符串的比較時(shí)沒有使用==或!=Java新手通常使用這樣的代ifif(x==而他實(shí)際的意思應(yīng)ifif想檢查<module<module嵌套的if層}}比如,允許的嵌套深度是3<module<module<propertyname="max"其中"max"屬性定義了最多的嵌套次數(shù)。默認(rèn)是嵌套的try層try-catch的嵌套的層次。<module<module<propertyname="max"其中"max"指定了最大的嵌套數(shù),默認(rèn)是1調(diào)用父類的檢查并確認(rèn)一個(gè)類的clone()方法調(diào)用了父類的clone() 這樣<module<module父類的檢查并確認(rèn)一個(gè)類的finalize()調(diào)用了父類的 這樣<module<module不合理的捕獲java.lang.Exception,java.lang.Error,java.lang.RuntimeError是不合理新手經(jīng)常把本應(yīng)捕獲多種異常的格式,簡(jiǎn)化寫成 這一種。(汗,我有時(shí)也是-<module<module想檢查java.lang.Exception和your.package.Exception是不合理的,可<module<module其中"illegalClassNames"屬性指定了不合理的異常名稱,多個(gè)名稱之間用","不合理的確保某些類型(老外叫type,我們叫class,interface==)不被throw.比如說,拋 就是不可以的。默<module<module想檢查java.lang.Exception和your.package.Exception是不合理的,可<module<module其中"illegalClassNames"屬性指定了不合理的異常名稱,多個(gè)名稱之間用","package確保一個(gè)類有package。如果一個(gè)class沒有package,那么它就無法被,作者說很<module<module確保setUp(),tearDown()方法被正確 名,沒有參數(shù),void返回類型,而且是public或者protected的。確保suite()被正確 名,沒有參數(shù),返回junit,framework.Test,而且是publicstatic型。注意:上面這幾點(diǎn)經(jīng)常被搞錯(cuò)的是寫錯(cuò)的方法編譯肯定通過,但是不會(huì)被junit執(zhí)<module<modulereturn語(yǔ)句的數(shù)限制一個(gè)方法中return語(yǔ)句的數(shù)量。默認(rèn)是2。忽略特定的方法(默認(rèn)是equals())如果return語(yǔ)句太多,說明某個(gè)方法需要實(shí)現(xiàn)的功能太多,而且很難閱讀。(這個(gè)時(shí)候就需要重構(gòu),建議看看《重構(gòu)》的ExtractMethodSimplifyingConditionalExpressions.)想確保每個(gè)方法最多有3個(gè)return語(yǔ)句,忽略equals(),這樣做:<module<module<propertyname="max"想確保每個(gè)方法最多有3個(gè)return語(yǔ)句,檢查所有方法,這<module<module<propertyname="max"<propertyname="format"的順根據(jù)Sun編碼規(guī)范,class或interface中的順序如class。首先是public,然后是protected,然后是packagelevel(不包括accessmodifier)最后是private.(多個(gè)class放在一個(gè)java文件中的情況)變量。首先是public,然后是protected然后是packagelevel(不包括access)最后是private.(多個(gè)class放在一個(gè)java文件中的情況構(gòu)造<module<module參數(shù)被賦對(duì)參某個(gè)方法傳遞進(jìn)來的參數(shù),是不允許在該方法中改變值的publicpublicsomeMethod(String這個(gè)方法中,就不para1para1=“new這樣的語(yǔ)文檔:對(duì)方法的參數(shù)賦值一般說來,是不好的編程技巧。而強(qiáng)制開發(fā)人員一個(gè)final參數(shù)想進(jìn)行檢查,這<module<module詳盡的變量初始確保某個(gè)class在被使用時(shí)都已經(jīng)被初始化成默認(rèn)值(對(duì)象是null數(shù)字和字符是0booleanfalse.)了。這樣檢查:<module<moduleswitch語(yǔ)句的default位置排在最p.s.如果不寫default就會(huì)產(chǎn)生邏輯錯(cuò)誤,卻沒有提示。非常不建議使用switch,請(qǐng)使用if…else代替。當(dāng)然了,如果沒使用default,貌似本檢查也能檢查的出來。這樣使用:<module<module 丟失的構(gòu)造函確保某個(gè)類定義了一個(gè)默認(rèn)之外的構(gòu)造函數(shù)。這樣:<module<moduleswitch中錯(cuò)誤分支檢查每個(gè)switch只執(zhí)行一個(gè)分支。也就是說,檢查某個(gè)case中是否有break,return,throwcontinue<module<module《重構(gòu)》中建議,不使用switch。(貌似 簡(jiǎn)化條件表達(dá)式一章。多個(gè)內(nèi)容相同的字符串變替多個(gè)相同字符串。默認(rèn)只出現(xiàn)一次的檢查:<module<module最多重復(fù)兩次的檢<module<module忽略逗號(hào)和空格<module<module上面例子中可以看出,"allowedDuplicates"屬性指定了可以重復(fù)的最大數(shù),默認(rèn)1"ignoreStringsRegexp"屬性指定了被忽略的字符的正則表達(dá)式格式,默認(rèn)是忽略空的字符串$)同一行多個(gè)變確保每行只一個(gè)變量。Sun編碼規(guī)范 節(jié)就是這樣約定的。這樣<module<module不使用確保代碼不使用this.關(guān)鍵字。默認(rèn)配置 (檢查方法和變量<module<module只檢查變量,查方法<module<module不必要的圓括檢查不必要的圓括號(hào)”(,)”。比如, 這樣。是不是很個(gè)性?這樣<module<module不過很多時(shí)候圓括號(hào)的正確使用會(huì)提高代碼的清晰度。比如:returnreturn(SomeClassName.CONSTANT1==variable)?result1:是否使用請(qǐng)酌情選Class的設(shè)ClassFinalInterfacels隱藏工具類的構(gòu)造方方便繼承(extention)throws的數(shù)可見的修改方檢查類成員的可見性。只有staticfinal成員是public的,其他的類成員都是private的,除非在本檢<module<module允許包可見成員的<module<module不允許公共成員的<module<moduleFinal確保只有 構(gòu)造函數(shù)的class成<module<moduleInterfacels本檢查就是實(shí)現(xiàn)只在定義type的時(shí)候使用--Bloch,EffectiveJava,Item根據(jù)Bloch的說法,一個(gè)interface用來描述一個(gè)type所以,在interface中不定義方法卻只定義常<module<module隱藏工具類的構(gòu)造方確保只有static方法的工具類沒有public的構(gòu)造////notfinaltoallowsubclassingpublicclassStringUtils{protectedStringUtils()//preventscallsfromthrownew}publicstaticintcount(charc,Strings)//}}這樣檢<module<module方便繼承(extention)而進(jìn)行的設(shè)規(guī)則是:在子類中overrided的非 ,非static方法,需要符合下列情況之一有空語(yǔ)原理(借用文檔):這個(gè)API低,子類無法父類的代碼被執(zhí)行。同時(shí)子類卻也不會(huì)由于忘記調(diào)用父類的方法而破壞父類的這樣檢<module<modulethrows的數(shù)異常是methodsinterface的一部分。一個(gè)方法如果拋出太多不同的異常,會(huì)導(dǎo)致異常處(catch),本檢查強(qiáng)制規(guī)定一個(gè)方法的throws的次數(shù)。<module<module<propertyname="max"其中"max"屬性指定了允許的最大數(shù)。默認(rèn)是1重復(fù)的代Duplicated 本檢查應(yīng)該放在<modulename="Checker">結(jié)點(diǎn)下價(jià),因?yàn)樾枰惆岩粋€(gè)BUG修改很多次,測(cè)試次。Checkstyle在實(shí)現(xiàn)該方面的檢查過程快?多內(nèi)存占用避免無效的,錯(cuò)誤,支持模糊匹配(注釋,空格,換行,變量重命名等checkstle提供的是StrictDuplicateCode,它速度很快,消耗的內(nèi)存很少,不會(huì)出現(xiàn)錯(cuò)誤的警告。當(dāng)檢查支持多種語(yǔ)言時(shí),不支持模糊匹配(這也是它被稱為srict(嚴(yán)格)檢查的原因)。也就是說,如果一段重復(fù)代碼,既在JSP中出現(xiàn),又在JAVA中出現(xiàn),就無法支持模糊查詢。費(fèi)),因而被checkstyle用作一個(gè)插件我們推薦所有checkstyle的用戶試用Simian表7.3“重復(fù)代碼插件的特性:”是checkstyle中的重復(fù)代碼檢查的插件的特性:表7.3.重復(fù)代碼插件的特性:

--文名速錯(cuò)的警支持的語(yǔ)模糊匹用快肯定任何語(yǔ)無低7.12.1.StrictDuplicateCode嚴(yán)格的重復(fù)代碼檢當(dāng)代碼只是在縮進(jìn)上有所不同時(shí),就把它們逐行的進(jìn)行比較,并報(bào)告是否重復(fù)。忽略import其他的內(nèi)容,包括javadoc,方法間隔的空白行,等都會(huì)被包含進(jìn)來,進(jìn)行比較。使用默認(rèn)<module<module相同代碼行超過15行,并且文件編碼是UTF-8<module<module<propertyname="min"說明的空白行時(shí),也會(huì)報(bào)錯(cuò)。例如,"min"=89個(gè)連續(xù)的空白注意本檢查一定要放在"TreeWalker"節(jié)點(diǎn)前面,否則在Checkclipse中無法(Eclipse3.2,Europa都是)。但是在Ant各種量Npath布爾表達(dá)式的復(fù)雜限制一個(gè)布爾表達(dá)式中的 ||和^的個(gè)數(shù)。可以讓代碼看起來更清晰,容易排錯(cuò)和。默認(rèn)查<module<module 最多允許7個(gè)操作<module<module<propertyname="max"其中的"max"指定了允許的操作符的最大數(shù),默認(rèn)是3類數(shù)據(jù)的抽象耦 檢查一個(gè)類中建立的其他類的實(shí)例的個(gè)數(shù)。這種類型的耦合不是由繼承或面向?qū)ο蟮木酆隙鸬摹R话愣?,任何一個(gè)抽象數(shù)據(jù)類型,如果將其他抽象數(shù)據(jù)類型作為自己的成員,那么它都會(huì)產(chǎn)生數(shù)據(jù)抽象耦合(DAC);換句話說,如果一個(gè)類使用了其他類的實(shí)例作為自己的成員變量,那么就會(huì)產(chǎn)生數(shù)據(jù)抽象耦合。耦合度越高,這個(gè)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)就越復(fù)雜。原文:Thismetricmeasuresthenumberofinstantiationsofotherclasseswithinthegivenclass.Thistypeofcouplingisnotcausedbyinheritanceortheobjectorientedparadigm.Generallyspeaking,any datatypewithother datatypesasmembershasdataioncoupling;therefore,ifaclasshasalocalvariablethatisaninstantiation(object)ofanotherclass,thereisdata ioncoupling.ThehighertheDAC,themorecomplexthedatastructure(classes)ofthesystem.耦合度最多是5<module<module<propertyname="max"其中"max"屬性指定了最大數(shù),默認(rèn)是7類的分散復(fù)雜原文:ThenumberofotherclassesagivenclassreliesonAlsothesquareofthishasshowntoindicatetheamountofmaintenencerequiredinfunctionalprograms(onafilebasis)at分散復(fù)雜度最多是<module<module<propertyname="max"其中"max"屬性指定了最大數(shù),默認(rèn)是20函數(shù)的分支復(fù)雜確保函數(shù)的分支復(fù)雜度沒有超出限制。該復(fù)雜度是通過大部分函數(shù)(構(gòu)造函數(shù),一般方法,靜態(tài)初始函數(shù),實(shí)例初始化函數(shù))if,while,do,forcatch,switch,case&&||測(cè)試數(shù)目。一般而言1-4是優(yōu)秀,5-7是合格。8-10看情況重構(gòu)。11個(gè)以上一定要馬上重構(gòu)!分支復(fù)雜度最多是7的檢<module<module<propertyname="max"其中"max"屬性指定了最大數(shù),默認(rèn)是10Npath復(fù)雜布爾表達(dá)式(比如,A&&B,C||D,等等)。原文:TheNPATHmetriccomputesthenumberofpossibleexecutionpathsthroughafunction.Ittakesintoaccountthenestingofconditionalstatementsandmulti-partbooleanexpressions(e.g.,A&&B,C||D,etc.).Rationale:NejmehsaysthathisgrouphadaninformalNPATHlimitof200onindividualroutines;functionsthatexceededthisvaluewerecandidatesforfurther position-oratleastacloserlook.復(fù)雜度不超過<module<module<propertyname="max"其中"max"屬性指定了最大數(shù),默認(rèn)是200雜Todo注沒有被注釋掉的Main函大寫的final縮與代碼的注很難歸類7.14.1.使用的表達(dá)為代碼問題而做的檢查 用戶可以通過本檢查來控制某些代碼的使用。比如,在代碼中使"System.out.println"的檢<module<module<propertyname="format"其中"format"屬性指定了的字符的正則表達(dá)式的格式。("."用"\."表示),完整的屬性表 7.4“GenericIllegalRegexp的屬性列表”表7.4.GenericIllegalRegexp的屬性列表名說類默認(rèn)使用正則表達(dá)^$(空是否忽略是否忽略檢查到錯(cuò)誤時(shí)顯示""(空文件結(jié)尾的回檢查文件末尾是否有一個(gè)回車。比如CVS的時(shí)候。如果沒有以新行作為文件結(jié)尾,CVS甚至?xí)@示警告。(本檢查應(yīng)該放在<modulenameChecker">結(jié)點(diǎn)下。<module<module檢查使用LINUX風(fēng)格的換行符:<module<module<module<module<propertyname="fileExtensions"value="java,xml,該詳細(xì)屬性如表7.5“NewlineAtEndOfFile的屬性列表”所示7.5NewlineAtEndOfFile名說類默認(rèn)行分隔)String所Todo注<module<module<propertyname="format"其中"format"屬性指定了被檢查的字符串的內(nèi)容,默認(rèn)是"TODO:",格式是正則表達(dá)翻譯屬性文本檢查應(yīng)該放在<modulename="Checker">結(jié)點(diǎn)下。 使用本檢查就會(huì)找出錯(cuò)誤:默認(rèn)文件perties中,缺少 ok兩個(gè)鍵,而在德文件messages_perties中,缺少了 cancel鍵。所以下面就是提示messages_perties:messages_perties:Keyo'messages_perties:Key'cancel'missing.perties:Key' 'missing.perties:Key'ok'missing.這樣就可<module<module如果你的翻譯文件擴(kuò)展名是 和".jp",就這樣<module<module,其中"fileExtensions"指定了被檢查文件的擴(kuò)展名。默認(rèn)是"properties"沒有被注釋掉的Main函檢查沒有被注釋掉的main默認(rèn)檢<module<module <module<module大寫的量,都要以”L”結(jié)尾。這與S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論