2018nc6開發(fā)參考經(jīng)驗(yàn)積累代碼質(zhì)量_第1頁
2018nc6開發(fā)參考經(jīng)驗(yàn)積累代碼質(zhì)量_第2頁
2018nc6開發(fā)參考經(jīng)驗(yàn)積累代碼質(zhì)量_第3頁
2018nc6開發(fā)參考經(jīng)驗(yàn)積累代碼質(zhì)量_第4頁
2018nc6開發(fā)參考經(jīng)驗(yàn)積累代碼質(zhì)量_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

代碼質(zhì)量用友金融信息技術(shù)有限公司姜冬金2013年3月6日代碼質(zhì)量代碼質(zhì)量代碼規(guī)范編程規(guī)范SQL編寫規(guī)范代碼性能JAVA代碼調(diào)優(yōu)數(shù)據(jù)庫調(diào)優(yōu)代碼規(guī)范代碼規(guī)范—代碼書寫規(guī)范編程規(guī)范必須給程序加注釋。注釋能夠極大提高代碼的質(zhì)量。代碼的書寫必須清晰、易讀。適當(dāng)?shù)膶⒋a分段可以使代碼更加清楚。可以使用‘{’‘}’將函數(shù)分成若干個(gè)小的單元;適當(dāng)?shù)募尤肟招锌梢允勾a更加清晰。例如在函數(shù)的定義后面加入兩個(gè)空行,在兩個(gè)邏輯小代碼單元間加入一個(gè)空行;建議遵循三十秒原則。如果另一個(gè)程序員無法在三十秒之內(nèi)了解你的函數(shù)做了什么,如何做以及為什么要這樣做,那就說明你的代碼是難于維護(hù)的,必須得到提高;在一個(gè)函數(shù)內(nèi)代碼的長度不允許超過150行。建議如果一個(gè)函數(shù)的代碼長度超過一個(gè)屏幕,那么或許這個(gè)函數(shù)太長了。一行代碼盡量簡短,并且保證一行代碼只做一件事。那種看似技巧性的冗長代碼只會(huì)增加代碼維護(hù)的難度。保證不必左右拉動(dòng)滾動(dòng)條來閱讀一整行代碼,將會(huì)使你的代碼更加可讀,這一點(diǎn)包括注釋;代碼規(guī)范—代碼書寫規(guī)范使用統(tǒng)一的格式化代碼。將‘{’放在所有者的后面,并且在下一行代碼前加入TAB鍵4格縮進(jìn);(TAB鍵比用若干個(gè)空格更容易控制使用統(tǒng)一的縮進(jìn)距離)if(XXX){while(XXX){xxxxxx}}變量名、方法名、類名命名要有意義,禁止使用類似于a,b,c這種命名,禁止使用漢語拼音命名。嚴(yán)格遵守異常處理規(guī)范,嚴(yán)禁直接打印異常。接口實(shí)現(xiàn)類中的全局變量要慎重使用,因?yàn)楫?dāng)調(diào)用時(shí)是全局共享的,會(huì)導(dǎo)致不可預(yù)見的問題發(fā)生。面向接口編程,禁止在方法中使用ArrayList等聲明變量,必須用其接口List,Map等聲明,除非必須使用這些實(shí)現(xiàn)類中的方法。

代碼規(guī)范—代碼書寫規(guī)范方法只做一件事,同時(shí)在做幾件事的代碼很難理解,一個(gè)方法可能包含初始化對(duì)象、清除數(shù)據(jù)、解析輸入等,如果我們要對(duì)其中某一件事進(jìn)行修改那必須確保我們把所有代碼讀完后才能放心的修改,降低了程序的可能讀和維護(hù)效率。變量的作用域盡可能小,同時(shí)避免一個(gè)變量多次賦值。減少不必要的臨時(shí)變量。

代碼規(guī)范—SQL編寫規(guī)范SQL編寫規(guī)范SQL語句全部使用小寫。引用字符時(shí)用單引號(hào)。如:updatetestablesetidcol=’abcd’。連接符或運(yùn)算符or、in、and、=、<=、>=,+,-等前后加上一個(gè)空格。嚴(yán)禁使用select*…….形式的語句,必須指出select的具體字段,即selectcol1,col2,…fromtableawhere….嚴(yán)禁使用insertintotablevalues(?,?,?),必須指出具體要賦值的字段,即insertintotablea(col1,col2,…)values(?,?,…)SQL語句包含多表連接時(shí),建議對(duì)每個(gè)表命名別名,對(duì)每個(gè)字段的使用都要帶上表別名,即selecta.col1,a.col2,b.col3fromtableaa,tablebbwherea.col4=b.col5代碼規(guī)范—SQL編寫規(guī)范在子查詢中前后必須加上括號(hào),selectcol1,col2fromtableawherecol3in(selectcol4fromtablebwherecol4>0)代碼性能代碼性能—JAVA調(diào)優(yōu)JAVA調(diào)優(yōu)盡量在合適的場合使用單例

使用單例可以減輕加載的負(fù)擔(dān),縮短加載的時(shí)間,提高加載的效率,但并不是所有地方都適用于單例,簡單來說,單例

主要適用于以下三個(gè)方面:

控制資源的使用,通過線程同步來控制資源的并發(fā)訪問;

控制實(shí)例的產(chǎn)生,以達(dá)到節(jié)約資源的目的;

控制數(shù)據(jù)共享,在不建立直接關(guān)聯(lián)的條件下,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信。盡量避免隨意使用靜態(tài)變量

要知道,當(dāng)某個(gè)對(duì)象被定義為static的變量所引用,那么GC通常是不會(huì)回收這個(gè)對(duì)象所占有的內(nèi)存,如publicclassA{staticBb=newB();}此時(shí)靜態(tài)變量b的生命周期與A類同步,如果A類不會(huì)卸載,那么b對(duì)象會(huì)常駐內(nèi)存,直到程序終止。代碼性能—JAVA調(diào)優(yōu)盡量避免過多過常的創(chuàng)建Java對(duì)象

盡量避免在經(jīng)常調(diào)用的方法,循環(huán)中new對(duì)象,由于系統(tǒng)不僅要花費(fèi)時(shí)間來創(chuàng)建對(duì)象,而且還要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,在我們可以控制的范圍內(nèi),最大限度的重用對(duì)象,最好能用基本的數(shù)據(jù)類型或數(shù)組來替代對(duì)象。盡量使用局部變量

調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。盡量處理好包裝類型和基本類型兩者的使用場所

雖然包裝類型和基本類型在使用過程中是可以相互轉(zhuǎn)換,但它們兩者所產(chǎn)生的內(nèi)存區(qū)域是完全不同的,基本類型數(shù)據(jù)產(chǎn)生和處理都在棧中處理,包裝類型是對(duì)象,是在堆中產(chǎn)生實(shí)例。

在集合類對(duì)象中,有對(duì)象方面需要的處理適用包裝類型,其他的處理提倡使用基本類型。代碼性能—JAVA調(diào)優(yōu)慎用synchronized,盡量減小synchronize的方法

都知道,實(shí)現(xiàn)同步是要很大的系統(tǒng)開銷作為代價(jià)的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。synchronize方法被調(diào)用時(shí),直接會(huì)把當(dāng)前對(duì)象鎖了,在方法執(zhí)行完之前其他線程無法調(diào)用當(dāng)前對(duì)象的其他方法。所以synchronize的方法盡量小,并且應(yīng)盡量使用方法同步代替代碼塊同步。盡量使用StringBuilder和StringBuffer進(jìn)行字符串連接 String是不可變對(duì)象,每進(jìn)行一次字符串連接都會(huì)在String的運(yùn)行時(shí)常量池中創(chuàng)建一個(gè)新的String對(duì)象,而運(yùn)行時(shí)常量池是位于方法區(qū)內(nèi),不利于GC的回收,造成大量的內(nèi)存被占用。而StringBuilder和StringBuffer則是可變字符串對(duì)象,不會(huì)產(chǎn)生上述問題,同時(shí)StringBuilder是非線程安全的,在單線程編程中,應(yīng)該使用StringBuilder,其性能優(yōu)于StringBuffer。代碼性能—JAVA調(diào)優(yōu)盡量不要使用finalize方法

實(shí)際上,將資源清理放在finalize方法中完成是非常不好的選擇,由于GC的工作量很大,尤其是回收新生代內(nèi)存時(shí),大都會(huì)引起應(yīng)用程序暫停,所以再選擇使用finalize方法進(jìn)行資源清理,會(huì)導(dǎo)致GC負(fù)擔(dān)更大,程序運(yùn)行效率更差。容器的使用技巧

單線程編程多使用HashMap、ArrayList,因?yàn)镠ashTable、Vector等使用了同步機(jī)制,降低了性能。多線程編程的時(shí)候不能使用HashMap,這個(gè)可能產(chǎn)生死鎖,應(yīng)該使用ConcurrentHashMap,ConcurrentHashMap在并發(fā)性方面優(yōu)于HashTable。

對(duì)于HashMap、HashTable、ArrayList、Vector等底層基于數(shù)組結(jié)構(gòu)的容器,設(shè)置其初始化容量可以極大的避免自動(dòng)擴(kuò)增其空間,極大的提高性能。設(shè)置初始化空間的時(shí)候,要考慮容積率,一般容器默認(rèn)的容積率為0.75,初始化容量=預(yù)計(jì)容量/0.75。代碼性能—JAVA調(diào)優(yōu)

ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。對(duì)于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因?yàn)長inkedList要移動(dòng)指針。對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。盡量減少對(duì)變量的重復(fù)計(jì)算

如 for(inti=0;i<list.size();i++)應(yīng)該改為 for(inti=0,len=list.size();i<len;i++)并且在循環(huán)中應(yīng)該避免使用復(fù)雜的表達(dá)式,在循環(huán)中,循環(huán)條件會(huì)被反復(fù)計(jì)算,如果不使用復(fù)雜表達(dá)式,而使循環(huán)條件值不變的話,程序?qū)?huì)運(yùn)行的更快。代碼性能—JAVA調(diào)優(yōu)盡量避免不必要的創(chuàng)建如Aa=newA();if(i==1){list.add(a);}應(yīng)該改為if(i==1){Aa=newA();list.add(a);}盡量在finally塊中釋放資源

程序中使用到的資源應(yīng)當(dāng)被釋放,以避免資源泄漏。這最好在finally塊中去做。不管程序執(zhí)行的結(jié)果如何,finally塊總是會(huì)執(zhí)行的,以確保資源的正確關(guān)閉。盡量使用移位來代替'a/b'的操作

“/”是一個(gè)代價(jià)很高的操作,使用移位的操作將會(huì)更快和更有效

如 intnum=a/4;intnum=a/8;應(yīng)該改為 intnum=a》2;intnum=a》3;但注意的是使用移位應(yīng)添加注釋,因?yàn)橐莆徊僮鞑恢庇^,比較難理解。代碼性能—JAVA調(diào)優(yōu)盡量使用移位來代替'a*b'的操作同樣的,對(duì)于'*'操作,使用移位的操作將會(huì)更快和更有效如intnum=a*4;intnum=a*8;應(yīng)該改為intnum=a《2;intnum=a《3;盡量避免使用二維數(shù)組

二維數(shù)據(jù)占用的內(nèi)存空間比一維數(shù)組多得多,大概10倍以上。盡量避免使用split

除非是必須的,否則應(yīng)該避免使用split,split由于支持正則表達(dá)式,所以效率比較低,如果是頻繁的幾十,幾百萬的調(diào)用將會(huì)耗費(fèi)大量資源,如果確實(shí)需要頻繁的調(diào)用split,可以考慮使用apache的StringUtils.split(string,char),頻繁split的可以緩存結(jié)果。代碼性能—JAVA調(diào)優(yōu)盡量使用System.arraycopy()代替通過來循環(huán)復(fù)制數(shù)組 System.arraycopy()要比通過循環(huán)來復(fù)制數(shù)組快的多。盡量緩存經(jīng)常使用的對(duì)象

盡可能將經(jīng)常使用的對(duì)象進(jìn)行緩存,可以使用數(shù)組,或HashMap的容器來進(jìn)行緩存,但這種方式可能導(dǎo)致系統(tǒng)占用過多的緩存,性能下降,推薦可以使用一些第三方的開源工具,如EhCache,Oscache進(jìn)行緩存,他們基本都實(shí)現(xiàn)了FIFO/FLU等緩存算法。代碼性能—JAVA調(diào)優(yōu)盡量早釋放無用對(duì)象的引用

大部分時(shí)間,方法局部引用變量所引用的對(duì)象會(huì)隨著方法結(jié)束而變成垃圾,因此,大部分時(shí)候程序無需將局部,引用變量顯式設(shè)為null.

例如: Publicvoidtest(){Objectobj=newObject();……Obj=null;}

上面這個(gè)就沒必要了,隨著方法test()的執(zhí)行完成,程序中obj引用變量的作用域就結(jié)束了。但是如果是改成下面: Publicvoidtest(){Objectobj=newObject();……Obj=null;//執(zhí)行耗時(shí),耗內(nèi)存操作;或調(diào)用耗時(shí),耗內(nèi)存的方法……}這時(shí)候就有必要將obj賦值為null,可以盡早的釋放對(duì)Object對(duì)象的引用。代碼性能—JAVA調(diào)優(yōu)慎用異常

當(dāng)創(chuàng)建一個(gè)異常時(shí),需要收集一個(gè)棧跟蹤(stacktrack),這個(gè)棧跟蹤用于描述異常是在何處創(chuàng)建的。構(gòu)建這些棧跟蹤時(shí)需要為運(yùn)行時(shí)棧做一份快照,正是這一部分開銷很大。當(dāng)需要?jiǎng)?chuàng)建一個(gè)Exception時(shí),JVM不得不說:先別動(dòng),我想就您現(xiàn)在的樣子存一份快照,所以暫時(shí)停止入棧和出棧操作。棧跟蹤不只包含運(yùn)行時(shí)棧中的一兩個(gè)元素,而是包含這個(gè)棧中的每一個(gè)元素。

如果創(chuàng)建一個(gè)Exception,那么就得付出代價(jià)。好在捕獲異常開銷不大,因此可以使用try-catch將核心內(nèi)容包起來。從技術(shù)上講,甚至可以隨意地拋出異常,而不用花費(fèi)很大的代價(jià)。招致性能損失的并不是throw操作(盡管在沒有預(yù)先創(chuàng)建異常的情況下就拋出異常是有點(diǎn)不尋常)。真正要花代價(jià)的是創(chuàng)建異常。幸運(yùn)的是,好的編程習(xí)慣已教會(huì)我們,不應(yīng)該不管三七二十一就拋出異常。異常是為異常的情況而設(shè)計(jì)的,使用時(shí)也應(yīng)該牢記這一原則。代碼性能—JAVA調(diào)優(yōu)把try/catch移出循環(huán)

try/catch塊要?jiǎng)?chuàng)建異常對(duì)象,Throwable接口的構(gòu)造函數(shù)會(huì)檢查堆棧,收集調(diào)用跟蹤信息比較耗時(shí),應(yīng)放到循環(huán)體外,放到內(nèi)部會(huì)極大的影響性能。HashMap的遍歷,使用entrySet方法的遍歷方式效率較高

因?yàn)閑ntrySet是獲取HashMap內(nèi)部的entrySet屬性,這個(gè)屬性本來就有值,不需要遍歷獲得,而keySet每次都需要遍歷獲得且需要從hashmap通過get獲取值,所以entrySet這個(gè)方法比keySet方法少一次遍歷,效率高。開辟緩沖區(qū),緩解應(yīng)用程序上下層的性能差異

緩沖可以協(xié)調(diào)上層組件和下層組件的性能差。當(dāng)上層組件性能優(yōu)于下層組件時(shí),可以有效的減少上層組件對(duì)下層組件的等待時(shí)間。上層應(yīng)用組件不需要等待下層組件真實(shí)地接受全部數(shù)據(jù),即可返回操作,加快了上層組件的處理速度,從而提升了系統(tǒng)整體性能。如BufferedWriter為FileWriter增加了緩沖功能。代碼性能—JAVA調(diào)優(yōu)對(duì)象復(fù)用—池

對(duì)象池化,是目前非常常用的一種系統(tǒng)優(yōu)化技術(shù)。其中最為大家所熟悉的,就是線程池和數(shù)據(jù)庫連接池。除了線程池和數(shù)據(jù)庫連接池,對(duì)于普通的java對(duì)象,在必要的時(shí)候也可以進(jìn)行池化管理。Apache提供了JakartaCommonsPool對(duì)象池組件。并行替代串行

隨著多核時(shí)代的到來,CPU的并行能力有了很大的提升,傳統(tǒng)的串行技術(shù)無法發(fā)揮CPU的最大潛力,并行軟件開發(fā)技術(shù)在這方面將CPU性能發(fā)揮到極致。JAVA中提供了Thread對(duì)象和Runnable接口。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)數(shù)據(jù)庫調(diào)優(yōu)—SQL調(diào)優(yōu)提高查詢效率1、對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及orderby涉及的列上建立索引。2、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:selectidfromtwherenumisnull可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:selectidfromtwherenum=03、應(yīng)盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。4、下面的查詢也將導(dǎo)致全表掃描:selectidfromtwherenamelike'%abc%'若要提高效率,可以考慮全文檢索或者改成前綴檢索。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)5、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:selectidfromtwherenum/2=100應(yīng)改為:selectidfromtwherenum=100*26、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。7、在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,要考慮聯(lián)合索引的可選性和前綴性,去建立正確的索引。8、很多時(shí)候用exists代替in是一個(gè)好的選擇,具體還是根據(jù)執(zhí)行計(jì)劃去分析使用exists還是in。9、并不是所有索引對(duì)查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進(jìn)行查詢優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時(shí),SQL查詢可能不會(huì)去利用索引,如一表中有字段sex,男女幾乎各一半,那么即使在sex上建了索引也對(duì)查詢效率起不了作用。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)10、索引并不是越多越好,索引固然可以提高相應(yīng)的select的效率,但同時(shí)也降低了insert及update的效率,因?yàn)閕nsert或update時(shí)有可能會(huì)重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個(gè)表的索引數(shù)最好不要超過6個(gè),若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。11、避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。12、在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先createtable,然后insert。13、如果使用到了臨時(shí)表,在存儲(chǔ)過程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先truncatetable,然后droptable,這樣可以避免系統(tǒng)表的較長時(shí)間鎖定。代碼性能—數(shù)據(jù)庫調(diào)優(yōu)14、盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。15、盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論