




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 HYPERLINK / 代碼審查參考文檔代碼審查(code review)是保證軟件質(zhì)量的一個(gè)重要環(huán)節(jié),通過審查代碼能夠發(fā)覺代碼中可能存在的問題并給予糾正,這些問題可能包括設(shè)計(jì)上的、實(shí)現(xiàn)上的或者編程風(fēng)格等多方面。本文檔通過列舉代碼編寫過程中的一些常見的細(xì)節(jié)問題,為代碼審查環(huán)節(jié)提供參考。Java代碼對(duì)象和變量存在未被使用的變量Eclipse會(huì)自動(dòng)用下劃線標(biāo)出對(duì)象的重復(fù)創(chuàng)建這是系統(tǒng)中普遍存在的問題,比如:public class PrtGrpEndorsementBL private GlobalInput mGlobalInput = new GlobalInput();private boo
2、lean getInputData(VData cInputData) mGlobalInput = (GlobalInput) cInputData.getObjectByObjectName( GlobalInput, 0);return true;那個(gè)地點(diǎn)mGlobalInput對(duì)象屬于重復(fù)創(chuàng)建,因?yàn)樵趃etInputData方法里會(huì)對(duì)它進(jìn)行賦值,mGlobalInput使用的應(yīng)該是從jsp頁面?zhèn)魅氲膶?duì)象,因此改為private GlobalInput mGlobalInput = null;又如:String msg = ;if (.) msg = A;else msg = B;那個(gè)地
3、點(diǎn)msg同樣屬于重復(fù)創(chuàng)建,改為String msg = null;變量的作用域Java的局部變量能夠定義在函數(shù)的任何位置,有部分由c轉(zhuǎn)學(xué)java的程序員適應(yīng)將變量都定義在函數(shù)的頂部,因?yàn)樵赾里只能那樣定義。但實(shí)際上變量的作用域越短程序的內(nèi)聚性就越高,耦合性也更低,程序更容易理解,因此在java里應(yīng)該在使用前才定義變量。局部變量的危害定義過多的不必要的局部變量是造成系統(tǒng)難以維護(hù)的緣故之一,因?yàn)槊吭黾右粋€(gè)局部變量我們就要先化時(shí)刻去理解那個(gè)局部變量的意思,因此我們要減少局部變量的使用。用函數(shù)的返回值來替代局部變量是一種有效的方法,這就需要我們用重構(gòu)的方式從大的函數(shù)中提出小的函數(shù),用小函數(shù)的返回值來替
4、代原有的局部變量。把大函數(shù)分解本身也能夠降低程序的耦合度。常量硬編碼,將代碼寫死比較嚴(yán)峻的情況是將險(xiǎn)種代碼寫死在程序中,比如:if (21301.equals(tLCGrpPolSchema.getRiskCode() . 那個(gè)地點(diǎn)將“21301”寫死會(huì)為系統(tǒng)的維護(hù)和升級(jí)帶來專門大困難,最好是以險(xiǎn)種定義的形式去動(dòng)態(tài)獵取險(xiǎn)種代碼。假如實(shí)在描述有困難,能夠考慮建立一個(gè)Constants常量類,將其以常量的形式定義,如此以后維護(hù)只需改動(dòng)一處即可。業(yè)務(wù)系統(tǒng)中存在許多的狀態(tài)標(biāo)志,比如AppFlag的狀態(tài)”0”為未簽單,”1”為已簽單,”2”為保全增人。盡管這些狀態(tài)的意義日后已沒有改動(dòng)的可能,但直接將”0
5、”、”1”、”2” 寫在程序里會(huì)導(dǎo)致程序可讀性差,因此我們同樣能夠?qū)⑵涠x在常量類中,并加上注釋,如此我們不必每次都去翻看文檔或pdm,看常量類里的注釋就行了。禁用常量接口Java的常量有一種不行的用法,確實(shí)是將常量定義在Inferface中,這種方使定義的常量在使用時(shí)能夠省去類名前綴,但會(huì)為以后的維護(hù)帶來苦惱。因此不要試圖用繼承的方式去使用常量。數(shù)組數(shù)組的定義數(shù)組的定義采納String str = null; 的形式,而不是String str = null;數(shù)組越界數(shù)組越界是比較常見的錯(cuò)誤,比如:private void dealCont() LCContDB tLCContDB = ne
6、w LCContDB();tLCContDB.setGrpContNo(mGrpContNo);tLCContSet = tLCContDB.query();for (int i = 0; i tLCContSet.size(); i+) LCContSchema tLCContSchema = tLCContSet.get(i);LCPolDB tLCPolDB = new LCPolDB();tLCPolDB.setContNo(tLCContSchema.getContNo();LCPolSet tLCPolSet = tLCPolDB.query();for (int j = 0; j
7、 tLCPolSet.size(); j+) LCPolSchema tLCPolSchema = tLCPolSchema.get(i);.上面的程序就會(huì)產(chǎn)生數(shù)組越界,應(yīng)該把tLCPolSchema.get(i);中的i改為j數(shù)組越界的錯(cuò)誤在編譯時(shí)可不能報(bào)錯(cuò),直到程序運(yùn)行時(shí)才會(huì)被發(fā)覺。有一種方法能夠幸免此bug的產(chǎn)生,程序改為:private void dealCont() LCContDB tLCContDB = new LCContDB();tLCContDB.setGrpContNo(mGrpContNo);tLCContSet = tLCContDB.query();for (int
8、 i = 0; i tLCContSet.size(); i+) dealPol(tLCContSet.get(i);private void dealPol(LCContSchema tLCContSchema) LCPolDB tLCPolDB = new LCPolDB();tLCPolDB.setContNo(tLCContSchema.getContNo();LCPolSet tLCPolSet = tLCPolDB.query();for (int i = 0; i 0) for (int i = 1; i 0)推斷多余,將其除去合并重復(fù)的代碼比如:if (getMoney 0)
9、strArr0 = 本次申請(qǐng)應(yīng)補(bǔ)交保費(fèi) + setPrecision(Math.abs(getMoney), 2) + 元。;tlistTable.add(strArr);else strArr0 = 本次申請(qǐng)應(yīng)退還保費(fèi) + setPrecision(Math.abs(getMoney), 2) + 元。;tlistTable.add(strArr);那個(gè)地點(diǎn)tlistTable.add(strArr);重復(fù),將其提到if不處合并。條件邏輯操縱去除操縱標(biāo)志受結(jié)構(gòu)化程序設(shè)計(jì)的阻礙,有人喜愛用boolean型的標(biāo)志來操縱程序的流程,比如:private boolean checkMoney() b
10、oolean flag = true;if (money 0)flag = true;else flag = false;return flag;但邏輯標(biāo)志的使用會(huì)降低程序的可讀性,當(dāng)邏輯復(fù)雜時(shí)修改維護(hù)會(huì)比較困難,因此改為:private boolean checkMoney() if (money 0)return true;else return flase;或者:private boolean checkMonay() if (money 0)return true;return flase;位運(yùn)算符&和|差不多上位運(yùn)算符,但它們也可在if語句中進(jìn)行條件推斷,但現(xiàn)在仍是執(zhí)行的位運(yùn)算。因?yàn)?/p>
11、使用&和|容易引起不必要的錯(cuò)誤,因此禁止在條件推斷中使用位運(yùn)算符。異常處理trycatch語句的濫用java的異常處理機(jī)制能夠把錯(cuò)誤處理程序和正常程序分開,使我們能夠更容易進(jìn)行復(fù)雜的錯(cuò)誤處理。但異常處理機(jī)制容易被濫用,因?yàn)榇蠖鄶?shù)的java書只是描述了異常機(jī)制的語法,而并沒有講明什么情況下使用異常。異常之因此是異常是因?yàn)槠洳豢深A(yù)料性,比如我們通過io讀取配置文件而文件并不存在,又比如通過jdbc讀取數(shù)據(jù)庫服務(wù)器卻當(dāng)?shù)袅耍@些差不多上需要我們通過異常機(jī)制來處理的情況。而下面的代碼對(duì)異常的處理是錯(cuò)誤的:private boolean getInputData(VData cInputData) tr
12、y LCGrpContSchema tLCGrpContSchema = (LCGrpContSchema) cInputData.getObjectByObjectName( LCGrpContSchema, 0);catch (Exception e) CError.buildErr(this, 接收數(shù)據(jù)失敗);return false;return true;因?yàn)槲覀冎灰匆幌耮etObjectByObjectName的代碼就明白那個(gè)函數(shù)假如處理錯(cuò)誤會(huì)返回一個(gè)null而不是拋出異常,那個(gè)地點(diǎn)的trycatch是沒有任何意義的,而且會(huì)降低程序的性能,因?yàn)閷?duì)異常的捕獲會(huì)花去額外的開銷。空指針
13、異常NullPointerException是比較常見的錯(cuò)誤,因此我們?cè)谑褂靡粋€(gè)對(duì)象前一定要確保那個(gè)對(duì)象差不多被創(chuàng)建過了。數(shù)據(jù)格式化異常使用Integer.parseInt(String s)進(jìn)行數(shù)據(jù)格式轉(zhuǎn)化時(shí)假如數(shù)據(jù)格式錯(cuò)誤會(huì)拋出NumberFormatException異常,那個(gè)異常繼承于RuntimeException,是一個(gè)非強(qiáng)制捕獲的異常。但從程序的健壯性考慮,如下代碼我們最好能進(jìn)行異常處理:將int bnfGrade = Integer.parseInt(tLPBnfSchema.getBnfGrade();改為:try int bnfGrade = Integer.parseIn
14、t(tLPBnfSchema.getBnfGrade(); catch (NumberFormatException e) .因?yàn)槟莻€(gè)地點(diǎn)我們并不能保證tLPBnfSchema.getBnfGrade()返回的一定是能夠被格式化為整數(shù)的字符串。假如我們有足夠的理由確保那個(gè)地點(diǎn)可不能產(chǎn)生異常,那么異常處理也可省略,正如前面所講的,異常處理的是不可預(yù)料的錯(cuò)誤。數(shù)組越界數(shù)組越界異常同樣容易被濫用,比如:try int i = 0;while(true) ai+.f(); catch (ArrayIndexOutOfBoundsException e) . 這種用法是錯(cuò)誤的,改為: int k = a
15、.length; for (int i = 0; i k; i+)ai.f(); 不要試圖用異常處理去取代條件推斷,我們要做的是把數(shù)組越界的條件排除掉而不是等它越界了再去處理異常。接口和抽象類抽象和繼承是面向?qū)ο蟮闹匾卣鳎褂媒涌诤统橄箢惸軌蚴沟贸绦虻膶?shí)現(xiàn)細(xì)節(jié)得到封裝,耦合度降低,更容易隨著需求的變化而擴(kuò)展。下面對(duì)一些需要注意的地點(diǎn)進(jìn)行講明:只從抽象類繼承使用繼承時(shí)要慎重,繼承代表“一般化/專門化”的關(guān)系,繼承會(huì)使子類依靠于父類,假如父類的實(shí)現(xiàn)發(fā)生改變那么子類的實(shí)現(xiàn)將不得不發(fā)生改變。因此,在使用繼承時(shí)一般不要從具體類繼承,只有抽象類才用來繼承,因?yàn)槌橄箢惸軌蛴贸橄蠓椒▉硖峁U(kuò)展,而抽象類里的
16、具體方法一定要確保是需求比較固定的部分,以后都可不能有任何的改動(dòng)。不覆寫父類的具體方法在子類中能夠?qū)Ω割惖姆椒ㄟM(jìn)行重載,也確實(shí)是父類里實(shí)現(xiàn)了一個(gè)方法,子類用同樣的函數(shù)名去重新實(shí)現(xiàn)那個(gè)方法。但這種做法是錯(cuò)誤的,子類只應(yīng)該去實(shí)現(xiàn)父類的抽象方法,而不是去實(shí)現(xiàn)父類已有的具體方法。假如需要如此做只能講明父類的方法不能作為具體方法而存在,將它改為抽象方法。不在接口中定義屬性這是保全中的一個(gè)bug。為了使保全算功能便于擴(kuò)展,定義了EdorAppConfirm接口:public interface EdorAppConfirm public CErrors mErrors = new CErrors(); p
17、ublic boolean submitData(VData cInputData, String cOperate); public VData getResult();然后再實(shí)現(xiàn)那個(gè)接口,比如:public class GrpEdorNIAppConfirmBL implements EdorAppConfirm public CErrors mErrors = new CErrors();public boolean submitData(VData cInputData, String cOperate) if (!dealData() return false; .最后再調(diào)用那個(gè)接口
18、:Class tClass = Class.forName(com.lis.bq.GrpEdor + tEdorType +AppConfirmBL); EdorAppConfirm tGrpEdorAppConfirm = (EdorAppConfirm) tClass.newInstance(); VData tVData = new VData(); tVData.add(iLPGrpEdorItemSchema); tVData.add(mLJSGetEndorseSchema); tVData.add(mGlobalInput); tVData.add(tLPGrpEdorMainS
19、et); if (!tGrpEdorAppConfirm.submitData(tVData, APPCONFIRM| + tEdorType) CError.buildErr(this, 保全項(xiàng)目 + tEdorType + 試算時(shí)失敗!失敗緣故: + tGrpEdorAppConfirm.mErrors. getFirstError(); return false; 那個(gè)地點(diǎn)本意是假如算費(fèi)出錯(cuò)return false并返回錯(cuò)誤緣故,但實(shí)際上不可能得到錯(cuò)誤緣故。因?yàn)镋dorAppConfirm和GrpEdorNIAppConfirmBL中都定義了mErrors,現(xiàn)在返回的是接口中的mErro
20、rs。假如把GrpEdorNIAppConfirmBL中的mErrors去掉能夠解決那個(gè)bug,然而在接口中定義public的屬性不是好的做法,因此可考慮把mErrors換成getErrors方法。接口和抽象類的組合使用當(dāng)我們預(yù)備使用抽象時(shí)會(huì)考慮是使用接口還使用抽象類,因?yàn)樗鼈兏饔袃?yōu)缺點(diǎn),接口和抽象類最大的區(qū)不是抽象類能夠有具體實(shí)現(xiàn)而接口是純抽象的。假如用抽象類那么寫在抽象類中的具體實(shí)現(xiàn)代碼的改動(dòng)會(huì)導(dǎo)致各級(jí)子類的改動(dòng),假如使用接口幸免了那個(gè)問題但又帶來了另一個(gè)問題,確實(shí)是各個(gè)實(shí)現(xiàn)接口的子類可能有重復(fù)的代碼,如維護(hù)也需要維護(hù)多處地點(diǎn)。因此比較好的方法是先定義一個(gè)接口,然后定義一個(gè)抽象類來實(shí)現(xiàn)那個(gè)
21、接口,然后各個(gè)具體實(shí)現(xiàn)類繼承那個(gè)抽象類,并把重復(fù)的實(shí)現(xiàn)代碼放到抽象類中。那個(gè)地點(diǎn)要注意的是放到抽象類中的代碼一定要是固定的,可不能隨需求改動(dòng)的部分。其它需注意地點(diǎn)clone()的使用java的clone機(jī)制使我們能夠?qū)iT方便的進(jìn)行使用對(duì)象的復(fù)制,只需實(shí)現(xiàn)Cloneable接口就行了。如: public class MyObject implements Cloneable public Object clone() try return super.clone(); catch (CloneNotSupportedException e) throw new InternalError(); 但要注意的是java分為深clone和淺clone,它們區(qū)不是對(duì)象內(nèi)部的成員屬性在clone時(shí)是否處理為引用。假如仍然保留為引用,則稱為淺clone,反之稱為深clone。而java默認(rèn)是淺clone,假如要實(shí)現(xiàn)深clone還需要對(duì)各個(gè)成員屬性分不進(jìn)行clone操作。Javascript腳本的執(zhí)行效率 IE執(zhí)行腳本取object的length效率是專門低的。不要在循環(huán)結(jié)構(gòu)中的操縱變量上直接使用“XX.length”,應(yīng)幸免如下程序段的寫法:var tFlag=; for(i = 0; i fm.QueryType.lengt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 佳木斯水源井施工方案
- 行為規(guī)范小學(xué)生
- 天津生物工程職業(yè)技術(shù)學(xué)院《醫(yī)患溝通關(guān)系學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 嘉興學(xué)院《安全項(xiàng)目管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 昆山登云科技職業(yè)學(xué)院《英語聽說(三)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安文理學(xué)院《小組工作與社會(huì)調(diào)查》2023-2024學(xué)年第二學(xué)期期末試卷
- 拆除項(xiàng)目安全方案范本
- 中國音樂學(xué)院《土木工程結(jié)構(gòu)試驗(yàn)技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 四川文化產(chǎn)業(yè)職業(yè)學(xué)院《咖啡文化與鑒賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年的服裝購銷合同范本
- 中職教育基礎(chǔ)模板課件《集合的概念 》
- 靜密封知識(shí)完整版本
- 2024年中考地理二輪復(fù)習(xí):地理實(shí)踐與跨學(xué)科主題學(xué)習(xí)(測(cè)試)(原卷版)
- 武漢鐵路局招聘2024高校畢業(yè)生137人歷年(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 2024年中國成人心肌炎臨床診斷與治療指南解讀課件
- DL∕T 496-2016 水輪機(jī)電液調(diào)節(jié)系統(tǒng)及裝置調(diào)整試驗(yàn)導(dǎo)則
- 高中化學(xué)校本課程
- 日本旅游合同范本
- 【矩陣正定的若干判定方法探究4000字(論文)】
- 中國腦卒中防治指導(dǎo)規(guī)范(2021 年版)
- 江蘇省常州市溧陽市2022-2023學(xué)年二年級(jí)下學(xué)期期中數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論