java代碼規范詳細版_第1頁
java代碼規范詳細版_第2頁
java代碼規范詳細版_第3頁
java代碼規范詳細版_第4頁
java代碼規范詳細版_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Java代碼規范本Java代碼規范以SUN的標準Java代碼規范為基礎,為適應我們公司的實際需要,可能會做一些修改。本文檔中沒有說明的地方,請參看SUNJava標準代碼規范。如果兩邊有沖突,以SUNJava標準為準。.標識符命名規范概述標識符的命名力求做到統一、達意和簡潔。盡量做到每個人按照規范來,多人開發如一人開發一樣。統一統一是指,對于同一個概念,在程序中用同一種表示方法,比如對于供應商,既可以用supplier,也可以用provider,但是我們只能選定一個使用,至少在一個Java項目中保持統一。統一是作為重要的,如果對同一概念有不同的表示方法,會使代碼混亂難以理解。即使不能取得好的名稱,但是只要統一,閱讀起來也不會太困難,因為閱讀者只要理解一次。達意達意是指,標識符能準確的表達出它所代表的意義,比如:newSupplier,OrderPaymentGatewayService等;而supplierl,service2,idtts等則不是好的命名方式。準確有兩成含義,一是正確,而是豐富。如果給一個代表供應商的變量起名是order,顯然沒有正確表達。同樣的,supplier1,遠沒有targetSupplier意義豐富。簡潔簡潔是指,在統一和達意的前提下,用盡量少的標識符。如果不能達意,寧愿不要簡潔。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered太長,transferedTargetSupplierOrderName則較好,但是transTgtSplOrdNm就不好了。省略元音的縮寫方式不要使用,我們的英語往往還沒有好到看得懂奇怪的縮寫。駱駝法則Java中,除了包名,靜態常量等特殊情況,大部分情況下標識符使用駱駝法則,即單詞之間不使用特殊符號分割,而是通過首字母大寫來分割。比如:supplierName,addNewContract,而不是supplier_name,add_new_contract。英文vs拼音盡量使用通俗易懂的英文單詞,如果不會可以向隊友求助,實在不行則使用漢語拼音,避免拼音與英文混用。比如表示歸檔,用archive比較好,用pigeonhole則不好,用guiDang尚可接受。包名使用小寫字母如com.amerisia.eb川s,不要com.amerisia.Ebills單詞間不要用字符隔開,比如com.amerisia.ebills,而不要com.amerisia.ebills_util類名首字母大寫類名要首字母大寫,比如LCIssueInfoManagerEJB,10后$口6慶刖。氏不要lcIssueInfoManagerEJB,lcIssueAction.后綴類名往往用不同的后綴表達額外的意思,如下表:后綴名意義—舉例EJB表示這個類為EJB類LCIssueInfoManagerEJBService表明這個類是個服務類,里面包含了給其他類提同業務服務的方法PaymentOrderServiceImpl這個類是一個實現類,而不是接口PaymentOrderServiceImplInter這個類是一個接口LifeCycleInterDao這個類封裝了數據訪問方法PaymentOrderDaoAction直接處理頁面請求,管理頁面邏輯了類UpdateOrderListActionListener響應某種事件的類PaymentSuccessListenerEvent這個類代表了某種事件PaymentSuccessEventServlet一個ServletPaymentCallbackServlet

Factory生成某種對象工廠的類PaymentOrderFactoryAdapter用來連接某種以前不被支持的對象的類DatabaseLogAdapterJob某種按時間運行的任務PaymentOrderCancelJobWrapper這是一個包裝類,為了給某個類提供沒有的能力SelectableOrderListWrapperBean這是一個POJOMenuStateBean方法名首字母小寫,如addOrder()不要AddOrder()動詞在前,如addOrder(),不要orderAdd()查詢方法要查詢的內容在前,條件在后。如getXxByXx()動詞前綴往往表達特定的含義,如下表:前綴名意義 舉例create創建createOrder()delete刪除deleteOrder()add創建,暗示新創建的對象屬于某個集合addPaidOrder()remove刪除removeOrder()init或貝|initialize初始化,暗示會做些諸如獲取資源等特殊動作initializeObjectPooldestroy銷毀,暗示會做些諸如釋放資源的特殊動作destroyObjectPoolopen打開openConnection()close關閉closeConnection()<read讀取readUserName()write寫入writeUserName()get獲得getName()set設置setName()prepare準備prepareOrderList()copy復制copyCustomerList()modity修改modifyActualTotalAmount()calculate數值計算calculateCommission()do執行某個過程或流程doOrderCancelJob()dispatch判斷程序流程轉向dispatchUserRequest()start開始startOrderProcessing()stop結束stopOrderProcessing()send發送某個消息或事件sendOrderPaidMessage()receive接受消息或時間receiveOrderPaidMessgae()respond響應用戶動作responseOrderListItemClicked()find查找對象findNewSupplier()update更新對象updateCommission()find方法在業務層盡量表達業務含義,比如findUnsettledOrders(),查詢未結算訂單,而不要findOrdersByStatus()。數據訪問層,find,update等方法可以表達要執行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID,345)域(field)名靜態常量全大寫用下劃線分割,如publicstaticfindStringORDER_PAID_EVENT="ORDER_PAID_EVENT”;枚舉全大寫,用下劃線分割,如publicenumEvents{ORDER_PAID,ORDER_CREATED}其他首字母小寫,駱駝法則,如:publicStringorderName;局部變量名參數和局部變量名首字母小寫,駱駝法則。盡量不要和域沖突,盡量表達這個變量在方法中的意義。.代碼格式使用tab縮進源代碼。使用alt+shift+f(eclipse)來格式化代碼,注:格式化代碼后還需手動來調下。源文件編碼源文件使用utf-8編碼,結尾用unixn分格。行寬行寬度不要超過80。Eclipse標準包的導入刪除不用的導入,盡量不要使用整個包的導入。在eclipse下經常使用快捷鍵ctrl+shift+o修正導入。類格式域格式每行只能聲明一個域。域的聲明用空行隔開。方法格式代碼塊格式縮進風格大括號的開始在代碼塊開始的行尾,閉合在和代碼塊同一縮進的行首,同一層次的代碼要保持整齊,例如:Transactiontran3action=null;if((taskFlag==null||(taskFlag!=null&&TT1TT.equals(taskFlagif(launchModeNo!=null&&(launchModeNo.equals(TT2TT)||1leissueFocm.setHandleFlag("Auto");}else(//手工發起leissueForm.setHandleFlag("Hand");}StringLCNo=TTTT;if(launchModeNo!=null&&(launchModeNo.equals(TT3TT)||laLCNo=request.getParameter("LCNo");}if(LCNo==null||LCNo.equals(TTTT))(LCNo=bizNo;}mapData=this.getlmportationManager().■—?r4-Ti''t?,~4,~41iTT.~..—J]1~'i■~>4--~>i'Tr'''7'.T~4—~-I-r~.■―^[',J[~■]sFlag()空格的使用表示分割時用一個空格不能這樣:if( a> b) {//dosomethinghere2622運算符兩邊用一個空格隔開例如:if(launchModeNo!=null&&(launchModeNo.equals(TT3TT)||lai-iLCNo=request.getParameter("LCNo");}if(LCNo==null||LCNo.equals(TTTT)){LCNo=bizNo;}不要寫成:LCCorpInfoIcCorpInfo=(LCCocpInfo)mapData.get("LCCocpInfoTT);if(l」CLcp工nf0!=null){|leissueForm.setLcCorpInfo(工.Corp工nfg);if(IcCorpInfo.getGoodsType)!=null)-shopType=this.getParameterManager().getShopType(lc(if(一hopTypeleissueForm.setGoodsType(shopType.getShopTypeName());}else{「「…一…一”逗號語句后如不換行,緊跟一個空格如下:call(a,b,c);不能如下:call(a,b,c);2.6.3空行的使用空行可以表達代碼在語義上的分割,注釋的作用范圍,等等。將類似操作,或一組操作放在一起不用空行隔開,而用空行隔開不同組的代碼,如圖:publicStringgetDate'l'ime(DatedaterStringtormat){SimpleDateFormatsdf=newSimpleDateFormat(format);returnsdf.format(date);,/*處理返回文件土上例中的空行,使注釋的作用域很明顯*處理返回文件土上例中的空行,使注釋的作用域很明顯.*/?連續兩行的空行代表更大的語義分割。方法之間用空行分割(盡量用一行空行)文件編號@return@throwsException/publicStringgetFileNO()throwsException{returnnewSerialNoManager().getSerialNo(cfgfTTfinance_timing_countTT);域之間用空行分割超過十行的代碼如果還不用空行分割,就會增加閱讀困難3.注釋規范注釋vs代碼注釋宜少二精,不宜多而濫,更不能誤導命名達意,結構清晰,類和方法等責任明確,往往不需要,或者只需要很少注釋,就可以讓人讀懂;相反,代碼混亂,再多的注釋都不能彌補。所以,應當先在代碼本身下功夫。不能正確表達代碼意義的注釋,只會損害代碼的可讀性。過于詳細的注釋,對顯而易見的代碼添加的注釋,羅嗦的注釋,還不如不寫。注釋要和代碼同步,過多的注釋會成為開發的負擔JavaDoc表明類、域和方法等的意義和用法等的注釋,要以javadoc的方式來寫。JavaDoc是個類的使用者來看的,主要介紹是什么,怎么用等信息。凡是類的使用者需要知道,都要用JavaDoc來寫。非JavaDoc的注釋,往往是個代碼的維護者看的,著重告述讀者為什么這樣寫,如何修改,注意什么問題等。如下:類士為XXX寫的測試類士2014-12-03士@authorchanqxiaoyonq士VpublicclassTest{塊級別注釋塊級別注釋,單行時用//,多行時用/*..*/。較短的代碼塊用空行表示注釋作用域較長的代碼塊要用/* start: */和/* end: */包圍行內注釋行內注釋用〃寫在行尾4最佳實踐和禁忌每次保存的時候,都讓你的代碼是最美的程序員都是懶惰的,不要想著等我完成了功能,再來優化代碼的格式和結構,等真的把功能完成,很少有人會再愿意回頭調整代碼。使用log而不是System.out.println()log可以設定級別,可以控制輸出到哪里,容易區分是在代碼的什么地方打印的,而System.out.print則不行。而且,System.out.print的速度很慢。所以,除非是有意的,否則,都要用log。至少在提交到svn之前把System.out.print換成log。每個ifwhilefor等語句,都不要省略大括號{}看下面的代碼:if(a>b)a++;如果在以后維護的時候,需要在a>b時,把b++,一步小心就會寫成:if(a>b)a++;b++;這樣就錯了,因為無論a和b是什么關系,b++都會執行。如果一開始就這樣寫:if(a>b){a++;}相信沒有哪個笨蛋會把b++添加錯的。而且,這個大括號使作用范圍更明顯,尤其是后面那行很長要折行時。善用TODO:在代碼中加入//TODO:,大部分的ide都會幫你提示,讓你知道你還有什么事沒有做。比如:if(order.isPaid()){//TODO:更新訂單}在需要留空的地方放一個空語句或注釋,告述讀者,你是故意的比如:if(!exists(order)){*

;}或if(!exists(order)){//nothingtodo}不要再對boolean值做truefalse判斷比如:if(order.isPaid()==true){//Dosomethinghere}不如寫成:if(order.isPaid()){//Dosomethinghere}后者讀起來就很是iforderispaid,….要比iforder'sisPaidmethodreturnstrue,…更容易理解減少代碼嵌套層次代碼嵌套層次達3層以上時,一般人理解起來都會困難。下面的代碼是一個簡單的例子:publicvoiddemo(inta,intb,intc){if(a>b){if(b>c){doJobA();}elseif(b<c){doJobB()}else{if(b>c){if(a<c){,}}一,減少嵌套的方法有很多:合并條件利用return以省略后面的else利用子方法比如上例,合并條件后成為:publicvoiddemo(inta,intb,intc){if(a>b&&b>c){doJobA();}if(a>b&&c>b){doJobB();}if(a<=b&&c<b&&a<c){doJobC();}}如果利用return則成為:publicvoiddemo(inta,intb,intc){if(a>b){if(b>c){doJobA();return;}doJobB()return;}if(b>c){if(a<c){doJobC();}}}利用子方法,就是將嵌套的程序提取出來放到另外的方法里。程序職責單一關注點分離是軟件開發的真理。人類自所以能夠完成復雜的工作,就是因為人類能夠將工作分解到較小級別的任務上,在做每個任務時關注更少的東西。讓程序單元的職責單一,可以使你在編寫這段程序時關注更少的東西,從而降低難度,減少出錯。變量的聲明,初始化和被使用盡量放到一起比方說如下代碼:intorderNum=getOrderNum();//dosomethingwithouorderNumherecall(orderNum);上例中的注釋處代表了一段和orderNum不相關的代碼。orderNum的聲明和初始化離被使用的地方相隔了很多行的代碼,這樣做不好,不如這樣://dosomethingwithouorderNumhereintorderNum=getOrderNum();call(orderNum);縮小變量的作用域能用局部變量的,不要使用實例變量,能用實例變量的,不要使用類變量。變量的生存期越短,以為著它被誤用的機會越小,同一時刻程序員要關注的變量的狀態越少。實例變量和類變量默認都不是線程安全的,局部變量是線程安全的。比如如下代碼:publicclassOrderPayAction{privateOrderorder;publicvoiddoAction(){order=orderDao.findOrder();doJobl();doJob2();}privatevoiddoJobl(){doSomething(order);}privatevoiddoJob2(){doOtherThing(order

溫馨提示

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

評論

0/150

提交評論