JavaEE編程規(guī)范(中級)_第1頁
JavaEE編程規(guī)范(中級)_第2頁
JavaEE編程規(guī)范(中級)_第3頁
JavaEE編程規(guī)范(中級)_第4頁
JavaEE編程規(guī)范(中級)_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

/開發(fā)編程規(guī)范J2項目一般是大型項目,大型項目都需要團隊協(xié)作開發(fā)。團隊協(xié)作開發(fā)的成功需要一致的開發(fā)規(guī)范。對軟件進行后續(xù)的維護成本遠遠要大于它最初的開發(fā)成本,保證開發(fā)的系統(tǒng)是可持續(xù)工作易于維護就至關(guān)重要了。可靠的設(shè)計原理實踐及一個良好的編程規(guī)范在整個J2項目生命周期中變得十分重要。在團隊開發(fā)中,應(yīng)該保持所有的代碼上都乎合-1-一個相同的標(biāo)準(zhǔn),并且代碼在風(fēng)格上應(yīng)該保持一致。

編程標(biāo)準(zhǔn)為什么會顯得這么重要呢?我們經(jīng)常會發(fā)生這樣的情況:太注重于j2的某方面的技術(shù)細節(jié),而乎略了良好的程序設(shè)計和編程習(xí)慣。太多的J2項目的失敗就是因為在項目中含有太多草率的代碼,使得整個系統(tǒng)變得脆弱、不可維護,最終只得放棄整個項目。關(guān)于編程規(guī)范,它是一個巨大的領(lǐng)域。在這里不作詳細的闡述。這里只列出了在實際J2開發(fā)中十分重要的問題進行討論,同時對這些問題有不同的見解和解決方法。一切都應(yīng)該以實踐為主。不要去發(fā)明自己的標(biāo)準(zhǔn)幾乎每一門編程語言都有自己的一套編程標(biāo)準(zhǔn),但是千萬不要去發(fā)明自己的編程標(biāo)準(zhǔn)。

是一門簡單的語言,我們應(yīng)該以的編程標(biāo)準(zhǔn)作為準(zhǔn)則。在它的基礎(chǔ)上進行擴充。比如語言使用的匈牙利命名法,并不適合用于在。也千萬不要在一種開發(fā)語言中使用另外一種開發(fā)語言的編程標(biāo)準(zhǔn)。類中代碼的組織結(jié)構(gòu)

1.按照方法的功能,而不是按照方法的可訪問性來組織方法。

比如:不是把所有的方法放在方法的前面,而是把一個方法放成使用它的那些方法的附近。

2.類的組織約定

靜態(tài)變量和方法。

成員變量。

構(gòu)造函數(shù)。

接口的實現(xiàn)方法,連同支持它們的私用方法

該類獨有的公有方法(不包括已實現(xiàn)接口的公用方法)。

抽像保護方法

提供給子類使用的保護方法

及前面任何一組都無關(guān)的實現(xiàn)方法。按職責(zé)進行分類,做你該做的事情!

每一個類應(yīng)該具有一個明確的職責(zé),不要把它相干和不相干的代碼都填進來。那些不相干的代碼應(yīng)該重構(gòu)為另一個單獨的類或者是助手類。如果一個不同概念級別上的代碼對相同的對象重復(fù)調(diào)用,那么它可能需提升為一個父類。而其它對象通過繼承這個父類。

通過把相干的重復(fù)代碼提取到父類和把不相干的代碼重構(gòu)為一個助手類是解決代碼重復(fù)的常用方法。

這樣可以阻止一個類的爆炸式增長,變成一個臃腫的類。一個類,包括和內(nèi)部注釋,如果超過了500行代碼,它都是需要重構(gòu)的候選者。因為它可能已經(jīng)承擔(dān)了太多的職責(zé)。可以運用策略模式來用一個接口把原類及助手類分開,實現(xiàn)助手類在不同的情況可以有不同的實現(xiàn)。來提高系統(tǒng)的靈活性。

每一個方法都應(yīng)該具有一個單一而清晰明確的職責(zé)。否則這個方法應(yīng)該進行重構(gòu)。同時這也可以防止方法變得很長。 (){ ="00000000";讀取 =()() (,); ; =(); =""; =(); (()>2){ =(0,2); } = +(0,()-) +; ()設(shè)置主鍵 (,)插入柜面數(shù)據(jù) ; }

上面的方法是新增一個柜面信息,它有三個步聚:

1.讀取指定的,獲得一個唯一柜面流水號

2.根據(jù)柜面的機構(gòu)代碼和流水號產(chǎn)生一個唯一8位的柜面號,柜面號由兩位的機構(gòu)代碼+6位的流水號組成。流水號不足6位,在前面以0補充。

3.設(shè)置柜面信息的柜面號為新產(chǎn)生的柜面號,并插入數(shù)據(jù)庫,成功則返回新的柜面號。

重構(gòu)后的代碼:讀取,獲得流水號 (){ ()()( ,); }根據(jù)機構(gòu)代碼來生成柜面號 () { ="00000000"; =(); ; =(); =""; (()>2){ =(0,2); } = +(0,()-) +; ; }新增柜面 (){ =; =(())產(chǎn)生主鍵 ()設(shè)置主鍵 (,)插入柜面數(shù)據(jù) ; }重構(gòu)后的代碼大大的便于閱讀和維護。使方法具有明確的責(zé)任。

注意在重構(gòu)的時候,通過我們把那些相對獨立的任務(wù)變成一個私有的方法。

關(guān)于一個方法應(yīng)該限制為多長,沒有明確的規(guī)定。它應(yīng)該以人的舒服度為主。一個方法包括注釋(不含)的實現(xiàn)代碼能夠在一屏中可以進行閱讀。否則它就應(yīng)該需要進行重構(gòu)。一般來說,一個方法的代碼控制在30-40行是最佳的。

四、避免重復(fù)的代碼

在一個類中,可能在各個方法中產(chǎn)生了相同的代碼塊。這就是重復(fù)的代碼。重復(fù)的代碼是難以維護和難以理解的。

有一個類其中有兩個方法如下:發(fā)送一個包裹 () { =() (); =()( ,"00");………… }根據(jù)包號得到包信息 () { =() (); =()( ,"00");……… }

這似乎沒有任何問題,但是這樣的代碼重復(fù)可能會導(dǎo)致嚴(yán)重的問題。

1.太多的代碼:如果重構(gòu)后只用兩行就可以了

2.令閱讀者迷惑不解,閱讀者可能會對開發(fā)人員產(chǎn)生懷疑,認為這兩處是兩個不相同的代碼,從而去進行比較,花費更多的時間和精力。

3.造成修改的不一致,經(jīng)??赡馨l(fā)現(xiàn)對一個方法進行了修改,而忘記也應(yīng)該對另一個方法也進行相同的修改。增加代碼的維護量。

修改后的代碼: (); (){ =() (); ; } (){ =().().( ,"00"); ; }發(fā)送一個包裹 () { =(); }根據(jù)包號得到包信息 () { =();……………….. }

五、最小的作用范圍和權(quán)利

成員變量和方法通常應(yīng)該擁有盡可能小的可見度(包括和缺省的變量和方法)。變量應(yīng)該盡可能局部地進行聲明。

1.絕不使用成員變量

2.成員變量首先考慮為。避免使用的成員變量,唯一的例外可能是聲明為的成員變量。

成員變量聲明為是可能需要提供給子類使用,但是這樣同樣也破壞了類的封裝性。更好一點的做法是把成員變量聲明為的。并提供一個的方法供子類調(diào)用,在這個方法中返回的成員變量。

3.一個類只應(yīng)該有它所實現(xiàn)接口的公有方法和必要的成員變量的和方法以及這個類提供給外部訪問的方法聲明為。其它的統(tǒng)統(tǒng)為或

4.一個類的方法需要提供給子類有不同的實現(xiàn)而進行重寫,或者需要把實現(xiàn)交給子類去完成應(yīng)該聲明為。其它的統(tǒng)統(tǒng)聲明為盡可能的把方法隱藏起來,,默認的方法;方法越少這個類就越簡潔。就更便于使用,測試和重構(gòu)。

雖然方法的調(diào)用不像對成員變量的直接訪問那樣危險。但是盡可能的降低方法的可見度在于:降低了類之間的耦合度。把一個類的外在需求及一個類的實現(xiàn)邏輯分開來是十分有必要的。這既可防止這個類的內(nèi)部狀態(tài)遭到意外的破壞,同時也簡化開發(fā)人員處理這個類的任務(wù)。通常只提供他們所需要的方法。

5.變量應(yīng)該盡可能的在使用它的地方聲明。

作用范圍內(nèi)的變量越少,可閱讀性就越高,也更加便于調(diào)試。杜絕使用C語言或的變量聲明方式(變量在方法的開始處聲明)

六、關(guān)鍵字的使用

是一個中經(jīng)常使用的關(guān)鍵字,但是我們也經(jīng)常忘記使用而使得在訪問兩個變量時造成意外的錯誤。

下面的方法將會被編譯通過,而并沒有給成員變量賦值 ; (){ =; }還有另外的一種形式也會被編譯通過(在錄入方法參數(shù)時候可能輸錯某個字母) (){ =; }

在上面的兩種情況中,假如沒有什么方法對進行初始化,那么在運行的時候出現(xiàn)莫名其妙的空指針異常。

在第一個方法中把方法參數(shù)賦給方法參數(shù)自身,在第二方法中把成員變量賦給成員變量自身。除了沒有達到預(yù)期的效果外都還會造成空指針異常。并且這種錯誤在編譯時都能正常通過。

建議:采用下面良好的習(xí)慣來避免上面出現(xiàn)的錯誤:

1.訪問成員變量總是使用關(guān)鍵字。這樣使得我們總是給期望的成員變量進行訪問。而解決變量的多議性。 (){ =; }

2.給方法參數(shù)賦予一個有意義或有區(qū)別的名字(不要使用_下劃線來命名變量,只有常量才使用下劃線.正確的反映參數(shù)的用途或代表的意義,并且避免了我們剛才見過的問題 (){ =; }

3.局部變量名變該相對短而成員變量名應(yīng)該相對冗長。例如,I應(yīng)該是一個變部變量,

應(yīng)該是一個成員變量。

通常,成員變量名以一個小寫字母開頭的接口或類名,而局部變量名應(yīng)在當(dāng)前的上下文環(huán)境中代表它的含議。 ; (){ =(); }七、不要使用字面常量

除了一些大家都明白的如0值,空值,和空串””外,不要在代碼中使用字面常量

(){ (() ()()>100){ (,"物品數(shù)量超過了上限,請您將物品數(shù)量控制在100件以內(nèi)"); } }

看上面的例子。無耐的是,我們經(jīng)常在j2項目中大量出現(xiàn)這樣的代碼。

1.這樣的代碼沒有明確的意義。必須被迫閱讀代碼來猜測100的含義。

2.代碼容易出錯,我們必須被迫比較不同的字面值來確信它們是相同的,而且我們很容易錯誤的輸入。

3.修改100這個常數(shù)時,可能需要修改多處。

比較好的做法是使用一個常數(shù),在中意味作使用的變量. =100; (() ()()>){ (,"物品數(shù)量超過了上限,請您將物品數(shù)量控制在100件以內(nèi)"); }

一般情況下,這已經(jīng)了。但是在有些情況下它仍然不夠好,假如對于每次發(fā)送的物品數(shù)量限制并不是總是相同的,今天的常量,在明天可能就是一個經(jīng)常變化的變量。

可能下面的版本會更靈活一些: =100; (){ ; } (() ()()>()){ (,"物品數(shù)量超過了上限,請您將物品數(shù)量控制在”++”件以內(nèi)"); }

這樣我們可以把對物品數(shù)量的控制延遲到子類進行,子類可以通過重寫()方法來靈活控制。

如何設(shè)計一個常量,可以有下面的標(biāo)準(zhǔn)來進行參照:

1.如果字面常量應(yīng)該是代碼中的一部分,不應(yīng)該使用常量變量或方法。

比如:語句。語句本身就應(yīng)該是代碼的一部分,所以不應(yīng)該再它們聲明一個常量。

2.永遠都不會變化的常量或者變化的可能性相當(dāng)少的常量,聲明為的常量。

例如:在所有應(yīng)用服務(wù)器都相同的名。

3.在編譯時可能會發(fā)生改變的常量,聲明子類可以重寫的的方法。

例如:在應(yīng)用服務(wù)器中可能需要變化的名,如的名稱

4.在運行時可能會發(fā)生改變的常量,聲明一個方法.

例如:物品數(shù)量限制

5.受國際化影響的常量,聲明一個的方法。

例如:根據(jù)不同的信息,需要顯示不同的錯誤信息或語言

這個方法返回一個從中查找的值。

八、內(nèi)部類和接口

在中使用內(nèi)部類和接口可以避免命名空間污染,內(nèi)部類通常用來幫助外部類有一個一致的責(zé)任。除非進行編程,盡可能的少用匿名內(nèi)部類。而使用一個有類名的內(nèi)部類會帶來更多的好處。比如可以使用構(gòu)造函數(shù)。

使用內(nèi)部類不能夠?qū)崿F(xiàn)代碼重用。會導(dǎo)致重復(fù)代碼的產(chǎn)生。在使用的時候要進行權(quán)衡。

九、關(guān)鍵字

1.方法重寫及方法。

方法重寫可能違反“理氏代換原則”和“開閉原則”。使用方法有助于保證類的完整性。確保一些關(guān)鍵性的方法不讓子類去重寫。保證系統(tǒng)的安全性。

比如:需要調(diào)用一系列的()方法。而這些方法都是十分重要的。

任何重寫都可能會導(dǎo)致破壞系統(tǒng)的行為

通常的做法聲明一個()的空方法。沒有任何代碼。

在()方法的最后調(diào)用()這個空方法。

而子類可以去重寫()這個方法來擴展功能,而又不破壞父類

2.類

只有能夠保證永遠不變的對象才使用類。

3.成員變量

一個的成員變量只可以被初始化一次,只能在兩個地方進行初始化(聲明時,或構(gòu)造函數(shù)),此后就將不能改變。

只有常量才使用

十、實現(xiàn)有用的方法。

實現(xiàn)一個有用的方法對于我們調(diào)試是十分重要的。實現(xiàn)方法在中有專門的規(guī)范。在這不作討論,簡單一點說,是應(yīng)該能夠顯示一個類的成員變量等關(guān)鍵信息。可以考慮使用輔助類,來實現(xiàn)方法。

使用輔助類的方法,來實現(xiàn)方法

十一、使用而不是

當(dāng)需要進行多次字符串操作時優(yōu)先考慮使用。而不是使用

是一個類。

使用進行字符串操作,會帶來更大的性能提升。

十二、可惡的空指針異常

是一個常見的錯誤,由于是所以它總是隱式的出錯,無需要我們?nèi)藶榈娜ゲ东@。產(chǎn)生,它又沒有相關(guān)的有用的幫助信息,所以很難以跟蹤。我們只能通過一些編程標(biāo)準(zhǔn)來減少它在運行時出現(xiàn)的次數(shù)。

1.處理空值的原則:

a.沒有充分的依據(jù),永遠都不要假設(shè)對象在某一時刻不可能為空。

b.假如認為空值是一個錯誤的代碼調(diào)用,則應(yīng)該以文字說明。不要讓它簡單的拋出;而是要記錄為業(yè)務(wù)異常,并有直接的異常說明。

c.通常對方法參數(shù)進行空值檢查。

2.在頁面參數(shù)傳遞中正確的對待空值和空串

編程是無狀態(tài)編程,頁面只能傳遞字符串給后臺。通常后臺程序在獲取頁面參數(shù)的時候要進行特殊字符處理,去掉字符串兩端的空格,制表格等特殊字符。

從頁面獲取的參數(shù)如果是空串應(yīng)該認為它是空值。

典型的處理如下: s=()(); (s){ s=(); } (""(s)){ s=; }3.正確處理從頁面參數(shù)傳遞后把字符串轉(zhuǎn)換為非字符串類型

我們通常需要獲取頁面參數(shù)并轉(zhuǎn)換為非字符串類型。一般是數(shù)值或日期類型。

這需要有兩個步驟:

第一步是從頁面獲取字符串參數(shù),如果是空串則要變?yōu)榭罩?/p>

第二步是把字符串轉(zhuǎn)為相應(yīng)的類型。

例如:從頁面獲取一個年齡的參數(shù)。 =(“”); (){ =(); } (“”()){ =; } =.();在太多的項目中有這樣的代碼出現(xiàn),能夠正常編譯通過。

但如果頁面的參數(shù)是一個錄入域,可以由用戶隨便錄入。并且在頁面可能沒有做相應(yīng)完整的控制的時候,很容易

就輸入了一些不能進行轉(zhuǎn)換為整數(shù)的非法字符串。()就會拋出.

同樣的情況也會出現(xiàn)在日期轉(zhuǎn)換中。

=(“”);

.();

這也有可能拋出

和都是。都不需強迫用戶去處理。不知不覺就會讓系統(tǒng)報異常,使得系統(tǒng)十分脆弱。

像這種異常我們應(yīng)該手動去處理,處理方法有兩種:

1.把異常當(dāng)空值處理,凡是報這種異常我都把它處理為空值。 ; =(""); { =(); }(e){ =; }2.把異常當(dāng)輸入錯誤處理,應(yīng)該把相應(yīng)的提示信息返回輸入頁面,要求用戶重新輸入合法的數(shù)據(jù) ; =(""); =; { =(); }(e){ ="日期必須為格式"; } =; (){ =(""); ("",); }

3.編寫輔助類來處理頁面參數(shù){ =""; (, ){ s=()(); (s){ s=(); } (s""(s)){ ; } { s; } } (, ,){ s=()(); (s){ s=(); } (s""(s)){ ; } { s; } } (,) { =(,); =(); { (!""()){ (); }{ ; } }(e){ ("無效的日期輸入:格式錯誤:"+); } } (, ,){ =(,); =(); { (!""()){ (); }{ ; } }(e){ ("無效的日期輸入:格式錯誤:"+); } } () { =(); { (!""()){ (); }{ ; } }(e){ ("無效的日期輸入:格式錯誤:"+); } } (,) { =(); { (!""()){ (); }{ ; } }(e){ ("無效的日期輸入:格式錯誤:"+); } }}

十三、正確的進行對象比較

1.總是把不為空的對象放在比較的前面。 =(""); (("")){ }在j2項目中,這樣的代碼并不少見很容易是一個空值。那么在運行時就很容易拋出.

換成第二種形式 (""()){ }

這樣當(dāng)為空值時條件為,及我們期望相符。而第一種形式則是一種隱患。說不準(zhǔn)它什么時候就拋出了空指針異常。(""()){}

這樣的寫法也可以,但是沒有必要。第二種寫法更簡單也同樣安全

2.使用短路計算 (){ (()>10){ } }

在j2項目中,這樣的代碼也是頻繁出象,沒有做任何判斷就調(diào)用對象的方法。誰又能保證調(diào)用者一定不會傳一個空值對象進來呢? (){ (()(()>10)){ } }當(dāng)為空時,第二個測試條件不被執(zhí)行,這樣才是安全的代碼!在布爾表達式,當(dāng)前面的有一個條件為時,那么結(jié)果為假,后面的條件不再進行測試。

同樣在布爾表達式中,當(dāng)前面的有一個條件為時,結(jié)果為真,后面的條件不再進行測試 (()(()>10)){ }

當(dāng)為時,結(jié)果為真,那么后面的條件將不進行測試

十四、小心遍歷集合對象

在對集合進行遍歷時,經(jīng)常是下面的代碼 =(); (i=0;i<();){ =() (i); }當(dāng)為時,那么它后面的遍歷代碼就拋出.所以在遍歷集合時應(yīng)該總是小心一些。 (i=0; i<();){ =() (i); }

這樣的代碼是安全的。我們時刻要防止可惡的產(chǎn)生。

可能有些代碼是這樣的, (){ (i=0;i<();){ =()(i); } }

但我覺得上面的方法更簡潔一些,特別是沒有理由進行太多的語句嵌套。嵌套增加了代碼的復(fù)雜性,更難以閱讀和理解。十五、對象創(chuàng)建是要付出代價的

重復(fù)的使用一個對象,而不是在每次需要的時候都去創(chuàng)建一個等價的新對象。對象創(chuàng)建是要付出內(nèi)存消耗和時間代價。特別是當(dāng)一個對象創(chuàng)建需要初始化外部環(huán)境時,比如數(shù)據(jù)庫連接,查找等。

s=("")千萬別要這樣做比 s="";要付出更多的開銷。如果第一種形式頻繁的使用,那么會創(chuàng)建出成千上萬個變量.

而第二種形式則不會,s="";只使用一個實例。

1.應(yīng)當(dāng)重用一個已有的對象時,就不要試著去創(chuàng)建新的對象

看看下面的方法:

(){ =()() (,"00")讀中心數(shù)據(jù)庫 ; }

這是要根據(jù)不同的機構(gòu)代碼去訪問不同的數(shù)據(jù)庫,再獲得一個對象,每次都會創(chuàng)建一個新的對象

下面的方法會多次調(diào)用的方法 () { ()()刪除此柜面所有子柜面信息 =();本柜面的子柜面列表 (i=0;i<();){ =()(i); (()); ()(); } }特別是在()()這個語句,需要去更新每一個柜員的關(guān)系,那么這樣就會創(chuàng)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論