




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、XXXX遠(yuǎn)程管理平臺JAVA代碼編寫規(guī)范 XXXX公司XXXXXX有限公司XXXXXX管理平臺JAVA代碼編寫規(guī)范文件狀態(tài): 草稿 正式發(fā)布 正在修改文件標(biāo)識:當(dāng)前版本:1.1作 者:李光強(qiáng)完成日期:2016.1.30XXXXXX2016年1月修改歷史編號修訂后版本號修訂人修訂內(nèi)容簡述修訂日期11.0李光強(qiáng)起草2016.1.3021.1李光強(qiáng)修改包命名規(guī)則、增加持久層規(guī)范2016.1.30Java代碼規(guī)范本Java代碼規(guī)范以SUN的標(biāo)準(zhǔn)Java代碼規(guī)范為基礎(chǔ),為適應(yīng)我們公司的實(shí)際需要,可能會做一些修改。本文檔中沒有說明的地方,請參看SUN Java標(biāo)準(zhǔn)代碼規(guī)范。如果兩邊有沖突,以SUN Jav
2、a標(biāo)準(zhǔn)為準(zhǔn)。1. 標(biāo)識符命名規(guī)范1.1 概述標(biāo)識符的命名力求做到統(tǒng)一、達(dá)意和簡潔。1.1.1 統(tǒng)一統(tǒng)一是指對于同一個概念在程序中用同一種表示方法。比如設(shè)備,既可以用equipment,也可以用device,但是我們只能選定一個使用,至少在一個Java項(xiàng)目中保持統(tǒng)一。統(tǒng)一是作為重要的,如果對同一概念有不同的表示方法,會使代碼混亂難以理解。即使不能取得好的名稱,但是只要統(tǒng)一,閱讀起來也不會太困難,因?yàn)殚喿x者只要理解一次。1.1.2 達(dá)意達(dá)意是指標(biāo)識符能準(zhǔn)確的表達(dá)出它所代表的意義,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, se
3、rvice2,idtts等則不是好的命名方式。準(zhǔn)確有兩成含義,一是正確,二是豐富。如果給一個代表供應(yīng)商的變量起名是 order,顯然沒有正確表達(dá)。同樣的,supplier1, 遠(yuǎn)沒有targetSupplier意義豐富。1.1.3 簡潔簡潔是指在統(tǒng)一和達(dá)意的前提下,用盡量少的標(biāo)識符。如果不能達(dá)意,寧愿不要簡潔。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太長, transferedTargetSupplierOrderName則較好,但是transTgtSplOrdNm就不好了。省略元音的縮寫方式不要使用,我們的英語往往還沒有好到看得
4、懂奇怪的縮寫。1.1.4 駱駝法則Java中,除了包名,靜態(tài)常量等特殊情況,大部分情況下標(biāo)識符使用駱駝法則,即單詞之間不使用特殊符號分割,而是通過首字母大寫來分割。比如: supplierName, addNewContract,而不是 supplier_name, add_new_contract。1.1.5 英文 vs 拼音盡量使用通俗易懂的英文單詞,如果不會可以向隊(duì)友求助,實(shí)在不行則使用漢語拼音,避免拼音與英文混用。比如表示歸檔,用archive比較好, 用pigeonhole則不好,用guiDang尚可接受。1.2 包名包名盡可能使用能表達(dá)包單方的單一英文單詞,盡可能避免多個單詞,且使
5、用小寫字母,如 com.xxx.settlment,不要使用com.xxx.Settlement。如果使用多個單詞,則單詞間不要用字符隔開,比如com.xxx.settlment.jsfutil,而不要使用com.xxx.settlement.jsf_util。本項(xiàng)目包名統(tǒng)一使用com.hezo.crems.aaa.bbb前綴,其中aaa表示功能性分類,bbb表示子系統(tǒng)。“aaa”包括:控制層:controller活動層:action持久層:persistence核心層:core“bbb”包括: 后臺管理:admin 設(shè)備管理:equipment 1.3 類名1.3.1 首字母大寫類名要首字母
6、大寫,比如 SupplierService, PaymentOrderAction;不要使用supplierService, paymentOrderAction。類名要使用名詞單數(shù)。1.3.2 后綴類名往往用不同的后綴表達(dá)額外的意思,如下表:后綴名意義舉例Service表明這個類是個服務(wù)類,里面包含了給其他類提同業(yè)務(wù)服務(wù)的方法PaymentOrderServiceImpl這個類是一個實(shí)現(xiàn)類,而不是接口PaymentOrderServiceImplInter這個類是一個接口LifeCycleInterDao這個類封裝了數(shù)據(jù)訪問方法PaymentOrderDaoControllerspringM
7、VC控制器StoreControllerAction直接處理頁面請求,管理頁面邏輯類UpdateOrderListActionListener響應(yīng)某種事件的類PaymentSuccessListenerEvent這個類代表了某種事件PaymentSuccessEventServlet一個ServletPaymentCallbackServletFactory生成某種對象工廠的類PaymentOrderFactoryAdapter用來連接某種以前不被支持的對象的類DatabaseLogAdapterJob某種按時間運(yùn)行的任務(wù)PaymentOrderCancelJobWrapper這是一個包裝類,
8、為了給某個類提供沒有的能力SelectableOrderListWrapperBean這是一個POJO,常用于實(shí)體類。UserBean1.4 方法名首字母小寫,如 addOrder() 不要使用AddOrder();動詞在前,如 addOrder(),不要orderAdd();動詞前綴往往表達(dá)特定的含義,如下表:前綴名意義舉例create創(chuàng)建createOrder()delete刪除deleteOrder()add創(chuàng)建,暗示新創(chuàng)建的對象屬于某個集合addPaidOrder()remove刪除removeOrder()init或則initialize初始化,暗示會做些諸如獲取資源等特殊動作ini
9、tializeObjectPooldestroy銷毀,暗示會做些諸如釋放資源的特殊動作destroyObjectPoolopen打開openConnection()close關(guān)閉closeConnection()<read讀取readUserName()write寫入writeUserName()get獲得getName()set設(shè)置setName()prepare準(zhǔn)備prepareOrderList()copy復(fù)制copyCustomerList()modity修改modifyActualTotalAmount()calculate數(shù)值計(jì)算calculateCommission()do
10、執(zhí)行某個過程或流程doOrderCancelJob()dispatch判斷程序流程轉(zhuǎn)向dispatchUserRequest()start開始startOrderProcessing()stop結(jié)束stopOrderProcessing()send發(fā)送某個消息或事件sendOrderPaidMessage()receive接受消息或時間receiveOrderPaidMessgae()respond響應(yīng)用戶動作responseOrderListItemClicked()find查找對象findNewSupplier()save保存對象saveSupplier()update更新對象update
11、Commission()find方法在業(yè)務(wù)層盡量表達(dá)業(yè)務(wù)含義,比如 findUnsettledOrders(),查詢未結(jié)算訂單,而不要findOrdersByStatus()。 數(shù)據(jù)訪問層,find,update等方法可以表達(dá)要執(zhí)行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID, 345)。注意:實(shí)體類在創(chuàng)建時,盡量使用ORM工具一次生成,然后做一些修改,為每個類添加Bean后綴;實(shí)體類中的屬性或字段,使用IDE工具自動生成setter和getter,不要手動添加。1.5 域(field)名1.5.1 靜態(tài)常量全大寫用下劃線分割,
12、如public static find String ORDER_PAID_EVENT = “ORDER_PAID_EVENT”;1.5.2 枚舉全大寫,用下劃線分割,如public enum Events ORDER_PAID,ORDER_CREATED1.5.3 其他首字母小寫,駱駝法則,如:public String orderName;1.6 局部變量名參數(shù)和局部變量名首字母小寫,駱駝法則。盡量不要和域沖突,盡量表達(dá)這個變量在方法中的意義。例如:public class Floor /* ID */IdGeneratedValue(strategy = GenerationType.I
13、DENTITY)private int id;/* 樓層名 */private String floorName;/* 對應(yīng)的商家類型代碼 */private short storeCatalog;/* 顯示順序號 */private short sequence;/* 是否顯示,0-不顯示;1-顯示 */private byte isVisible;/* 樓層布局 */private String style;/* 第一欄標(biāo)題 */private String title;2. 代碼格式用空格字符縮進(jìn)源代碼,不要用tab,每個縮進(jìn)4個空格。也可以使用IDE自帶的格式化快捷操作,如在eclip
14、se里,可以使用ctrl+shift+f,格式化當(dāng)前代碼頁或選中的代碼。2.1 源文件編碼源文件使用utf-8編碼。2.2 行寬每行寬度不要超過80,即每行代碼字符數(shù)不超過80。Eclipse標(biāo)準(zhǔn)。當(dāng)函數(shù)中參數(shù)為多個時,將每個參數(shù)寫成一行,需要左對齊。例如:2.3 包的導(dǎo)入刪除不用的導(dǎo)入,盡量不要使用整個包的導(dǎo)入。在eclipse下經(jīng)常使用快捷鍵 ctrl+shift+o 修正導(dǎo)入。2.4 類格式2.5 域格式每行只能聲明一個域。域的聲明用空行隔開。2.5 方法格式2.6 代碼塊格式2.6.1 縮進(jìn)風(fēng)格大括號的開始在代碼塊開始的行尾,閉合在代碼塊同一縮進(jìn)的行首,例如:package com.t
15、est; public class TestStyle extends SomeClass implements AppleInter, BananaInter public static final String THIS_IS_CONST = "CONST VALUE" private static void main(String args) int localVariable = 0; public void compute(String arg) if (arg.length() > 0) System.out.print
16、ln(arg); for (int i = 0; i < 10; i+) System.out.println(arg); while (condition) do otherMethod(); while (condition); switch (i) case 0: callFunction(); break; case 1: callFunctionb(); break; default: break; 2.6.2 空格的使用 表示分割時用一個空格不能這樣:if ( a > b ) /do so
17、mething here; 二元三元運(yùn)算符兩邊用一個空格隔開如下:a + b = c;b - d = e;return a = b ? 1 : 0;不能如下:a+b=c;b-d=e;return a=b?1:0; 逗號語句后如不還行,緊跟一個空格如下:call(a, b, c);不能如下:call(a,b,c);2.6.3 空行的使用空行可以表達(dá)代碼在語義上的分割,注釋的作用范圍,等等。將類似操作,或一組操作放在一起不用空行隔開,而用空行隔開不同組的代碼, 如圖:order = orderDao.findOrderById(id); /update pro
18、pertiesorder.setUserName(userName);order.setPrice(456);order.setStatus(PAID); orderService.updateTotalAmount(order); session.saveOrUpdate(order);上例中的空行,使注釋的作用域很明顯.l 連續(xù)兩行的空行代表更大的語義分割。l 方法之間用空行分割l 域之間用空行分割l 超過十行的代碼如果還不用空行分割,就會增加閱讀困難3. 注釋規(guī)范一般情況下,源程序有效注釋量必須在30以上。說明:注釋的原則是有助于對程序的閱讀理解,在該加的
19、地方都加了,注釋不宜太多也不能太少,注釋語言必須準(zhǔn)確、易懂、簡潔??梢杂米⑨尳y(tǒng)計(jì)工具來統(tǒng)計(jì)。3.1 注釋 vs 代碼l 注釋宜少而精,不宜多而濫,更不能誤導(dǎo)l 命名達(dá)意,結(jié)構(gòu)清晰, 類和方法等責(zé)任明確,往往不需要,或者只需要很少注釋,就可以讓人讀懂;相反,代碼混亂,再多的注釋都不能彌補(bǔ)。所以,應(yīng)當(dāng)先在代碼本身下功夫。l 不能正確表達(dá)代碼意義的注釋,只會損害代碼的可讀性。l 過于詳細(xì)的注釋,對顯而易見的代碼添加的注釋,羅嗦的注釋,還不如不寫。l 注釋要和代碼同步,過多的注釋會成為開發(fā)的負(fù)擔(dān)l 注釋不是用來管理代碼版本的,如果有代碼不要了,直接刪除,svn會有記錄的,不要注釋掉,否則以后沒人知道那
20、段注釋掉的代碼該不該刪除。注釋示例:l 包的注釋注意以 /* 開始避免被 JavaDoc 收集。示例:/* * 注釋內(nèi)容 */package m;l 文件注釋內(nèi)容:版權(quán)說明、描述信息、生成日期、修改歷史。通常放在一個文件的最上面。說明:文件名可選。示例:/* * 文件:文件名 * 版權(quán):版權(quán) * 描述:描述 * 修改人:修改人 * 修改時間:YYYY-MM-DD * 修改單號:修改單號 * 修改內(nèi)容:修改內(nèi)容 */說明:每次修改后在文件頭部寫明修改信息,CheckIn的時候可以直接把藍(lán)色字體信息粘貼到VSS的注釋上。在代碼受控之前可以免去。示例:/* * 文件名:LogManager.java
21、 * 版權(quán):Copyright 2002-2007 Hezo Tech. Co. Ltd. All Rights Reserved. * 描述: MMSC V100R002 Relay 通用日志系統(tǒng) * 修改人: 張三 * 修改時間:2001-02-16 * 修改內(nèi)容:新增 * 修改人: 李四 * 修改時間:2001-02-26 * 修改單號:WSS368 * 修改內(nèi)容:。 * 修改人: 王五 * 修改時間:2001-03-25 * 修改單號:WSS498 * 修改內(nèi)容:。 */l 類和接口的注釋:該注釋放在 package 關(guān)鍵字之后,class 或者 interface 關(guān)鍵字之前。說明:
22、方便JavaDoc收集。示例:package m;/* * 注釋內(nèi)容 */public class CommManagerl 類和接口的注釋內(nèi)容:類的注釋主要是一句話功能簡述、功能詳細(xì)描述。說明:可根據(jù)需要列出:版本號、生成日期、作者、內(nèi)容、功能、與其它類的關(guān)系等。 如果一個類存在Bug,請如實(shí)說明這些Bug。格式:/* * 一句話功能簡述 * 功能詳細(xì)描述 * author 作者 * version 版本號, YYYY-MM-DD * see 相關(guān)類/方法 * since 產(chǎn)品/模塊版本 * deprecated */說明:描述部分說明該類或者接口的功能、作用、使用方法和注意事項(xiàng),每次修改后
23、增加作者和更新版本號和日期,since 表示從那個版本開始就有這個類或者接口,deprecated 表示不建議使用該類或者接口。示例:/* * LogManager 類集中控制對日志讀寫的操作。 * 全部為靜態(tài)變量和靜態(tài)方法,對外提供統(tǒng)一接口。分配對應(yīng)日志類型的讀寫器, * 讀取或?qū)懭敕蠗l件的日志紀(jì)錄。 * author 張三,李四,王五 * version 1.2, 2001-03-25 * see LogIteraotor * see BasicLog * since CommonLog1.0 */l 類屬性、公有和保護(hù)方法注釋:寫在類屬性、公有和保護(hù)方法上面。示例:/* * 注釋內(nèi)容
24、*/private String logType;/* * 注釋內(nèi)容 */public void write()l 成員變量注釋內(nèi)容:成員變量的意義、目的、功能,可能被用到的地方。l 公有和保護(hù)方法注釋內(nèi)容:列出方法的一句話功能簡述、功能詳細(xì)描述、輸入?yún)?shù)、輸出參數(shù)、返回值、違例等。格式:/* * 一句話功能簡述 * 功能詳細(xì)描述 * param 參數(shù)1 參數(shù)1說明 * param 參數(shù)2 參數(shù)2說明 * return 返回類型說明 * exception/throws 違例類型 違例說明 * see 類、類#方法、類#成員 * deprecated */說明:since 表示從那個版本開始就
25、有這個方法;exception或throws 列出可能仍出的異常;deprecated 表示不建議使用該方法。示例:/* * 根據(jù)日志類型和時間讀取日志。 * 分配對應(yīng)日志類型的LogReader, 指定類型、查詢時間段、條件和反復(fù)器緩沖數(shù), * 讀取日志記錄。查詢條件為null或0表示無限制,反復(fù)器緩沖數(shù)為0讀不到日志。 * 查詢時間為左包含原則,即 startTime, endTime) 。 * param logTypeName 日志類型名(在配置文件中定義的) * param startTime 查詢?nèi)罩镜拈_始時間 * param endTime 查詢?nèi)罩镜慕Y(jié)束時間 * param l
26、ogLevel 查詢?nèi)罩镜募墑e * param userName 查詢該用戶的日志 * param bufferNum 日志反復(fù)器緩沖記錄數(shù) * return 結(jié)果集,日志反復(fù)器 * since CommonLog1.0 */public static LogIterator read(String logType, Date startTime, Date endTime, int logLevel, String userName, int bufferNum)l 對于方法內(nèi)部用throw語句拋出的異常,必須在方法的注釋中標(biāo)明,對于所調(diào)用的其他方法所拋出的異常,選擇主要的在注釋中說明。 對
27、于非RuntimeException,即throws子句聲明會拋出的異常,必須在方法的注釋中標(biāo)明。說明:異常注釋用exception或throws表示,在JavaDoc中兩者等價,但推薦用exception標(biāo)注Runtime異常,throws標(biāo)注非Runtime異常。異常的注釋必須說明該異常的含義及什么條件下拋出該異常。l *注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。l *注釋與所描述內(nèi)容進(jìn)行同樣的縮排。說明:可使程序排版整齊,并方便注釋的閱讀與理解。示例:如下例子,排版不整齊,閱讀稍感不方便。p
28、ublic void example( )/ 注釋 CodeBlock One / 注釋 CodeBlock Two應(yīng)改為如下布局。public void example( ) / 注釋 CodeBlock One / 注釋 CodeBlock Twol *將注釋與其上面的代碼用空行隔開。示例:如下例子,顯得代碼過于緊湊。/注釋program code one/注釋program code two應(yīng)如下書寫:/注釋program code one/注釋program code twol *對變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫注釋。說明:這些語句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵
29、,對于維護(hù)人員來說,良好的注釋幫助更好的理解程序,有時甚至優(yōu)于看設(shè)計(jì)文檔。l *對于switch語句下的case語句,如果因?yàn)樘厥馇闆r需要處理完一個case后進(jìn)入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。l *邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。l *注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。說明:錯誤的注釋不但無益反而有害。l *避免在注釋中使用縮寫,特別是不常用縮寫。說明:在使用縮寫時或之前,應(yīng)對縮寫進(jìn)行必要的說明。注
30、意:l *避免在一行代碼或表達(dá)式的中間插入注釋。說明:除非必要,不應(yīng)在代碼或表達(dá)中間插入注釋,否則容易使代碼可理解性變差。l *通過對函數(shù)或過程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)構(gòu),使代碼成為自注釋的。說明:清晰準(zhǔn)確的函數(shù)、變量等的命名,可增加代碼可讀性,并減少不必要的注釋。l *在代碼的功能、意圖層次上進(jìn)行注釋,提供有用、額外的信息。說明:注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復(fù)注釋信息。示例:如下注釋意義不大。/ 如果 receiveFlag 為真if (receiveFlag)而如下的注釋則給出了額外有用的信息。 /
31、 如果從連結(jié)收到消息 if (receiveFlag)l *在程序塊的結(jié)束行右方加注釋標(biāo)記,以表明某程序塊的結(jié)束。說明:當(dāng)代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便于閱讀。示例:參見如下例子。if (.) program code1 while (index < MAX_INDEX) program code2 / end of while (index < MAX_INDEX) / 指明該條while語句結(jié)束 / end of if (.) / 指明是哪條if語句結(jié)束l *注釋應(yīng)考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常
32、流利準(zhǔn)確的英文表達(dá)。說明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于維護(hù)的考慮,建議使用中文。l 方法內(nèi)的單行注釋使用 /。說明:調(diào)試程序的時候可以方便的使用 /* 。*/ 注釋掉一長段程序。l 注釋盡量使用中文注釋和中文標(biāo)點(diǎn)。方法和類描述的第一句話盡量使用簡潔明了的話概括一下功能,然后加以句號。接下來的部分可以詳細(xì)描述。說明:JavaDoc工具收集簡介的時候使用選取第一句話。l 順序?qū)崿F(xiàn)流程的說明使用1、2、3、4在每個實(shí)現(xiàn)步驟部分的代碼前面進(jìn)行注釋。示例:如下是對設(shè)置屬性的流程注釋 /1、 判斷輸入?yún)?shù)是否有效。 。 / 2、設(shè)置本地變量。 。5.2.9.一些復(fù)雜的代碼需要說明。示例:
33、這里主要是對閏年算法的說明。 /1. 如果能被4整除,是閏年; /2. 如果能被100整除,不是閏年.; /3. 如果能被400整除,是閏年.。3.2 塊級別注釋3.3.1 塊級別注釋,單行時用 /, 多行時用 /* . */。3.3.2 較短的代碼塊用空行表示注釋作用域3.3.3 較長的代碼塊要用/*- start: -*/和/*- end: -*/包圍如:/*-start: 訂單處理 - */取得daoOrderDao dao = Factory.getDao("OrderDao");/* 查詢訂單 */Order order = dao.findById(456);/
34、更新訂單order.setUserName("uu");order.setPassword("pass");order.setPrice("ddd");orderDao.save(order);/*-end: 訂單處理 - */3.3.4 可以考慮使用大括號來表示注釋范圍使用大括號表示注釋作用范圍的例子:/*-訂單處理 - */ /取得dao OrderDao dao = Factory.getDao("OrderDao"); /* 查詢訂單 */ Order order = dao.findById(456);&
35、#160; /更新訂單 order.setUserName("uu"); order.setPassword("pass"); order.setPrice("ddd"); orderDao.save(order);4 最佳實(shí)踐和禁忌4.1 每次保存的時候,都讓你的代碼是最美的程序員都是懶惰的,不要想著等我完成了功能,再來優(yōu)化代碼的格式和結(jié)構(gòu),等真的把功能完成,很少有人會再愿意回頭調(diào)整代碼。4.2 使用log而不是System.out.println()log可以設(shè)定級別,可以控制輸出到哪里,容易區(qū)分是在代碼的什么地方打印
36、的,而System.out.print則不行。而且,System.out.print的速度很慢。所以,除非是有意的,否則,都要用log。至少在提交到svn之前把System.out.print換成log。4.3 每個if while for等語句,都不要省略大括號看下面的代碼:if (a > b) a+;如果在以后維護(hù)的時候,需要在a > b 時,把b+,一步小心就會寫成:if (a > b) a+; b+;這樣就錯了,因?yàn)闊o論a和b是什么關(guān)系,b+都會執(zhí)行。 如果一開始就這樣寫:if (a > b) a+;相信沒有哪個笨蛋會把b+添加錯的。而且,這個大括號使作用范圍更
37、明顯,尤其是后面那行很長要折行時。4.4 善用TODO:在代碼中加入 /TODO: ,大部分的ide都會幫你提示,讓你知道你還有什么事沒有做。比如:if (order.isPaid() /TODO: 更新訂單4.5 在需要留空的地方放一個空語句或注釋,告述讀者,你是故意的比如:if (!exists(order) ;或:if (!exists(order) /nothing to do4.6 不要再對boolean值做true false判斷比如:if (order.isPaid() = true) / Do something here不如寫成:if (order.isPaid() /Do
38、something here后者讀起來就很是 if order is paid, . 要比 if orders isPaid method returns true, 更容易理解4.7 減少代碼嵌套層次代碼嵌套層次達(dá)3層以上時,一般人理解起來都會困難。下面的代碼是一個簡單的例子:public void demo(int a, int b, int c) if (a > b) if (b > c) doJobA(); else if (b < c) doJobB() else if (b > c) if (a < c) doJobC(); 減少嵌套的方法有很多:l
39、合并條件l 利用 return 以省略后面的elsel 利用子方法比如上例,合并條件后成為:public void demo(int a, int b, int c) if (a > b && b > c) doJobA(); if (a > b && c > b) doJobB(); if (a <= b && c < b && a < c) doJobC(); 如果利用return 則成為:public void demo(int a, int b, int c) if (a >
40、 b) if (b > c) doJobA(); return; doJobB() return; if (b > c) if (a < c) doJobC(); 利用子方法,就是將嵌套的程序提取出來放到另外的方法里。4.8 程序職責(zé)單一關(guān)注點(diǎn)分離是軟件開發(fā)的真理。人類自所以能夠完成復(fù)雜的工作,就是因?yàn)槿祟惸軌驅(qū)⒐ぷ鞣纸獾捷^小級別的任務(wù)上,在做每個任務(wù)時關(guān)注更少的東西。讓程序單元的職責(zé)單一,可以使你在編寫這段程序時關(guān)注更少的東西,從而降低難度,減少出錯。4.9 變量的聲明,初始化和被使用盡量放到一起比方說如下代碼:int orderNum= getOrderNu
41、m();/do something withou orderNum herecall(orderNum);上例中的注釋處代表了一段和orderNum不相關(guān)的代碼。orderNum的聲明和初始化離被使用的地方相隔了很多行的代碼,這樣做不好,不如這樣:/do something withou orderNum hereint orderNum= getOrderNum();call(orderNum);4.10 縮小變量的作用域能用局部變量的,不要使用實(shí)例變量,能用實(shí)例變量的,不要使用類變量。變量的生存期越短,以為著它被誤用的機(jī)會越小,同一時刻程序員要關(guān)注的變量的狀態(tài)越少。實(shí)例變量和類變量默認(rèn)都不
42、是線程安全的,局部變量是線程安全的。比如如下代碼:public class OrderPayAction private Order order; public void doAction() order = orderDao.findOrder(); doJob1(); doJob2(); private void doJob1() doSomething(order); private void doJob2() doOtherThing(order); 上例中order只不過擔(dān)當(dāng)了在方法間傳遞參數(shù)之用,用下面的方法更好:public class O
43、rderPayAction public void doAction() order = orderDao.findOrder(); doJob1(order); doJob2(order); private void doJob1(Order order) doSomething(order); private void doJob2(Order order) doOtherThing(order); 4.11 盡量不要用參數(shù)來帶回方法運(yùn)算結(jié)果比如:public void calculate(Order order) int result = 0; /do lot
44、s of computing and store it in the result order.setResult(result); public void action() order = orderDao.findOrder(); calculate(order); / do lots of things about order例子中calculate方法通過傳入的order對象來存儲結(jié)果, 不如如下寫:public int calculate(Order order) int result = 0; /do lots of computing and store it in t
45、he result return result; public void action() order = orderDao.findOrder(); order.setResult(calculate(order); / do lots of things about order5.異常處理規(guī)范1) 數(shù)據(jù)庫操作、IO操作等需要使用結(jié)束close()的對象必須在try -catch-finally 的finally中close()。示例:try / . .catch(IOException ioe) /. .finally try out.close(); catch (IOExce
46、ption ioe) /. . 2) 異常捕獲后,如果不對該異常進(jìn)行處理,則應(yīng)該紀(jì)錄日志或者ex.printStackTrace() 。說明:若有特殊原因必須用注釋加以說明。示例:try /. .catch (IOException ioe) ioe.printStackTrace ();3) 自己拋出的異常必須要填寫詳細(xì)的描述信息。說明:便于問題定位。示例:throw new IOException("Writing data error! Data: " + data.toString();4) 運(yùn)行期異常使用RuntimeException的子類來表示,不用在可能拋出
47、異常的方法聲明上加throws子句。非運(yùn)行期異常是從Exception繼承而來,必須在方法聲明上加throws子句。說明:非運(yùn)行期異常是由外界運(yùn)行環(huán)境決定異常拋出條件的異常,例如文件操作,可能受權(quán)限、磁盤空間大小的影響而失敗,這種異常是程序本身無法避免的,需要調(diào)用者明確考慮該異常出現(xiàn)時該如何處理方法,因此非運(yùn)行期異常必須有throws子句標(biāo)出,不標(biāo)出或者調(diào)用者不捕獲該類型異常都會導(dǎo)致編譯失敗,從而防止程序員本身疏忽。運(yùn)行期異常是程序在運(yùn)行過程中本身考慮不周導(dǎo)致的異常,例如傳入錯誤的參數(shù)等。拋出運(yùn)行期異常的目的是防止異常擴(kuò)散,導(dǎo)致定位困難。因此在做異常體系設(shè)計(jì)時要根據(jù)錯誤的性質(zhì)合理選擇自定義異常
48、的繼承關(guān)系。還有一種異常是Error 繼承而來的,這種異常由虛擬機(jī)自己維護(hù),表示發(fā)生了致命錯誤,程序無法繼續(xù)運(yùn)行例如內(nèi)存不足。我們自己的程序不應(yīng)該捕獲這種異常,并且也不應(yīng)該創(chuàng)建該種類型的異常。5) 在程序中使用異常處理還是使用錯誤返回碼處理,根據(jù)是否有利于程序結(jié)構(gòu)來確定,并且異常和錯誤碼不應(yīng)該混合使用,推薦使用異常。說明:一個系統(tǒng)或者模塊應(yīng)該統(tǒng)一規(guī)劃異常類型和返回碼的含義。 但是不能用異常來做一般流程處理的方式,不要過多地使用異常,異常的處理效率比條件分支低,而且異常的跳轉(zhuǎn)流程難以預(yù)測。6) *注意運(yùn)算符的優(yōu)先級,并用括號明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級。說明:防止閱讀程序時產(chǎn)生誤解,
49、防止因默認(rèn)的優(yōu)先級與設(shè)計(jì)思想不符而導(dǎo)致程序出錯。示例:下列語句中的表達(dá)式word = (high << 8) | low (1)if (a | b) && (a & c) (2)if (a | b) < (c & d) (3)如果書寫為high << 8 | lowa | b && a & ca | b < c & d(1)(2)雖然不會出錯,但語句不易理解;(3)造成了判斷條件出錯。7) *避免使用不易理解的數(shù)字,用有意義的標(biāo)識來替代。涉及物理狀態(tài)或者含有物理意義的常量,不應(yīng)直接使用數(shù)字,必須
50、用有意義的靜態(tài)變量來代替。示例:如下的程序可讀性差。if (state = 0) state = 1; . / program code應(yīng)改為如下形式:private final static int TRUNK_IDLE = 0;private final static int TRUNK_BUSY = 1;private final static int TRUNK_UNKNOWN = -1;if (state = TRUNK_IDLE) state = TRUNK_BUSY; . / program code8) 數(shù)組聲明的時候使用 int index ,而不要使用 int index 。說明:使用int index 格式使程序的可讀性較差示例:如下程序可讀性差:public int getIndex() .如下程序可讀性好:public int getIndex() .9) 調(diào)試代碼的時候
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年學(xué)校餐桌行業(yè)市場調(diào)研及前景趨勢預(yù)測報(bào)告
- 2025-2030年中國溶劑低溫燙印機(jī)行業(yè)深度研究分析報(bào)告
- 2025-2030年中國超音波流量計(jì)項(xiàng)目投資可行性研究分析報(bào)告
- 壁掛型壓縮機(jī)項(xiàng)目投資可行性研究分析報(bào)告(2024-2030版)
- 2025-2030年中國家具用板行業(yè)深度研究分析報(bào)告
- 2023-2029年中國智能小便沖洗器行業(yè)發(fā)展監(jiān)測及市場發(fā)展?jié)摿︻A(yù)測報(bào)告
- 保溫聚苯板項(xiàng)目投資可行性研究分析報(bào)告(2024-2030版)
- 2025年中國高壓管子螺紋接頭行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- UV絲印陶瓷油墨行業(yè)深度研究分析報(bào)告(2024-2030版)
- 2025年間苯二酚項(xiàng)目可行性分析報(bào)告
- 2025年天津市中考?xì)v史試卷(含答案)
- 2025年中國汽車檢測行業(yè)市場調(diào)查研究及投資前景預(yù)測報(bào)告
- 關(guān)于社保培訓(xùn)課件
- 2025秋初升高銜接新高一物理模擬卷-分班模擬卷(五)
- 呆滯料獎懲管理制度
- 公司年終答謝宴策劃方案
- 2025年成人高考高升專語文全真模擬試卷(含作文范文)真題演練
- 舞臺租賃協(xié)議模板與舞臺設(shè)備租賃合同3篇
- T/CIES 035-2024生鮮食用農(nóng)產(chǎn)品照明光源顯色性規(guī)范
- 湖北中考英語真題單選題100道及答案
- 母嬰店轉(zhuǎn)讓協(xié)議書范本
評論
0/150
提交評論