java編程規(guī)范
發(fā)表時(shí)間:2024-02-01 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1. 應(yīng)用范圍 本規(guī)范應(yīng)用于采用J2EE規(guī)范的項(xiàng)目中,所有項(xiàng)目中的JAVA代碼(含JSP,SERVLET,JAVABEAN,EJB)均應(yīng)遵守這個(gè)規(guī)范。同時(shí),也可作為其它項(xiàng)目的參考。 2. 設(shè)計(jì)類和方法 2.1 創(chuàng)建具有很強(qiáng)內(nèi)聚力的類 方法的重要性往往比類的重要性更容易理解,方法是指執(zhí)行一個(gè)...
1. 應(yīng)用范圍
本規(guī)范應(yīng)用于采用J2EE規(guī)范的項(xiàng)目中,所有項(xiàng)目中的JAVA代碼(含JSP,SERVLET,JAVABEAN,EJB)均應(yīng)遵守這個(gè)規(guī)范。同時(shí),也可作為其它項(xiàng)目的參考。
2. 設(shè)計(jì)類和方法
2.1 創(chuàng)建具有很強(qiáng)內(nèi)聚力的類
方法的重要性往往比類的重要性更容易理解,方法是指執(zhí)行一個(gè)統(tǒng)一函數(shù)的一段代碼。類常被錯(cuò)誤的視為是一個(gè)僅僅用于存放方法的容器。有些開發(fā)人員甚至把這種思路作了進(jìn)一步的發(fā)揮,將他們的所有方法放入單個(gè)類之中。
之所以不能正確的認(rèn)識(shí)類的功能,原因之一是類的實(shí)現(xiàn)實(shí)際上并不影響程序的執(zhí)行。當(dāng)一個(gè)工程被編譯時(shí),如果所有方法都放在單個(gè)類中或者放在幾十個(gè)類中,這沒有任何關(guān)系。雖然類的數(shù)量對(duì)代碼的執(zhí)行并無太大的影響,但是當(dāng)創(chuàng)建便于調(diào)試和維護(hù)的代碼時(shí),類的數(shù)量有時(shí)會(huì)帶來很大的影響。
類應(yīng)該用來將相關(guān)的方法組織在一起。
當(dāng)類包含一組緊密關(guān)聯(lián)的方法時(shí),該類可以說具有強(qiáng)大的內(nèi)聚力。當(dāng)類包含許多互不相關(guān)的方法時(shí),該類便具有較弱的內(nèi)聚力。應(yīng)該努力創(chuàng)建內(nèi)聚力比較強(qiáng)的類。
大多數(shù)工程都包含許多并不十分適合與其他方法組合在一起的方法。在這種情況下,可以為這些不合群的方法創(chuàng)建一個(gè)綜合性收容類。
創(chuàng)建類時(shí),應(yīng)知道“模塊化”這個(gè)術(shù)語的含義是什么。類的基本目的是創(chuàng)建相當(dāng)獨(dú)立的程序單元。
2.2 創(chuàng)建松散連接和高度專用的方法
1. 使所有方法都執(zhí)行專門的任務(wù)
每個(gè)方法都應(yīng)執(zhí)行一項(xiàng)特定的任務(wù),它應(yīng)出色的完成這項(xiàng)任務(wù)。應(yīng)避免創(chuàng)建執(zhí)行許多不同任務(wù)的方法。
創(chuàng)建專用方法有許多好處。首先調(diào)試將變得更加容易。
2. 盡量使方法成為自成一體的獨(dú)立方法
當(dāng)一個(gè)方法依賴于其他方法的調(diào)用時(shí),稱為與其他方法緊密連接的方法。緊密連接的方法會(huì)使調(diào)試和修改變得比較困難,因?yàn)樗鼱可娴礁嗟囊蛩。松散連接的方法優(yōu)于緊密連接的方法,但你不可能使每個(gè)方法都成為獨(dú)立的方法。
若要使方法具備較強(qiáng)的獨(dú)立性,方法之一是盡量減少類變量。
創(chuàng)建方法時(shí),設(shè)法將每個(gè)方法視為一個(gè)黑箱,其他例程不應(yīng)要求了解該方法的內(nèi)部工作情況,該方法也不應(yīng)要求了解它外面的工程情況。這就是為什么你的方法應(yīng)依靠參數(shù)而不應(yīng)依靠全局變量的原因。
創(chuàng)建專用方法時(shí),請(qǐng)考慮下列指導(dǎo)原則:
1) 將復(fù)雜進(jìn)程放入專用方法。如果應(yīng)用程序使用復(fù)雜的數(shù)學(xué)公式,請(qǐng)考慮將每個(gè)公式放入它自己的方法中。這樣使用這些公式的其他方法就不包含用于該公式的實(shí)際代碼。這樣也可以更容易發(fā)現(xiàn)與公式相關(guān)的問題。
2) 將數(shù)據(jù)輸入/輸出(I/O)放入專用方法。
3) 將專用方法中可能要修改的代碼隔離。如果你知道某個(gè)進(jìn)程經(jīng)常變更,請(qǐng)將這個(gè)多變的代碼放入專用方法,以便以后可以更容易的進(jìn)行修改,并減少無意中給其他進(jìn)程帶來問題的可能性。
4) 將業(yè)務(wù)規(guī)則封裝在專用方法中。業(yè)務(wù)規(guī)則常屬于要修改的代碼類別,應(yīng)與應(yīng)用程序的其余部分隔開。其他方法不應(yīng)知道業(yè)務(wù)規(guī)則,只有要調(diào)用的方法才使用這些規(guī)則。
3. 設(shè)計(jì)類和方法時(shí),要達(dá)到下列目的:
1) 創(chuàng)建更加容易調(diào)試和維護(hù)的方法
2) 創(chuàng)建具有強(qiáng)大內(nèi)聚力的類
3) 創(chuàng)建高度專用的方法
4) 創(chuàng)建松散連接的方法
5) 盡量使方法具有獨(dú)立性
6) 提高方法的扇入性
7) 降低方法的扇出性
2.3 編程原則
1. 為方法和類賦予表義性強(qiáng)的名字
為了使代碼更加容易理解,最容易的方法之一是為你的方法賦予表義性強(qiáng)的名字。函數(shù)名DoIt、GetIt的可讀性很難與CalculateSalesTax、 RetrieveUserID相比。
由縮寫方法名組成的代碼很難理解和維護(hù),沒有理由再這樣做了。
給方法正確的命名,可使程序工程的調(diào)試和維護(hù)工作大大的改觀。請(qǐng)認(rèn)真對(duì)待方法命名的工作,不要為了減少鍵入操作量而降低方法的可理解度。
實(shí)際應(yīng)用舉例:
1) 給方法命名時(shí)應(yīng)大小寫字母混合使用。如果句子全使用大寫字母,那么閱讀起來就非常困難,而大小寫字母混合使用的句子,閱讀起來就很容易。
2) 定義方法名時(shí)不要使用縮寫。如果你認(rèn)為應(yīng)用程序中的某些工程應(yīng)使用縮寫,那么請(qǐng)將這些情況加上注釋,并確保每個(gè)人在所有時(shí)間內(nèi)都使用這些縮寫。決不要在某些方法中對(duì)某些單詞進(jìn)行縮寫,而在別的方法中卻不使用縮寫。
2. 為每個(gè)方法賦予單個(gè)退出點(diǎn)
3. 創(chuàng)建方法時(shí),始終都應(yīng)顯式地定義它的作用域。
1) 如果你真的想創(chuàng)建一個(gè)公用方法,請(qǐng)向代碼閱讀者說明這一點(diǎn)。
2) 通過為每個(gè)方法賦予一個(gè)明確定義的作用域,可以減少代碼閱讀者需要投入的工作量。應(yīng)確保你為方法賦予最有意義的作用域。如果一個(gè)方法只被同一類中的另一個(gè)方法調(diào)用,那么請(qǐng)將它創(chuàng)建成私有方法。如果該方法是從多個(gè)類中的多個(gè)方法中調(diào)用,請(qǐng)將該說明為公用方法。
4. 用參數(shù)在方法之間傳遞數(shù)據(jù)
應(yīng)盡量避免使用類變量。一般來說,變量的作用域越小越好。為了減少類變量,方法之一是將數(shù)據(jù)作為參數(shù)在不同方法之間傳遞,而不是讓方法共享類變量。
1) 為每個(gè)參數(shù)指定數(shù)據(jù)類型。
2) 始終要對(duì)數(shù)進(jìn)行檢驗(yàn),決不要假設(shè)你得數(shù)據(jù)沒有問題。程序員常犯的一個(gè)錯(cuò)誤是在編寫方法時(shí)假設(shè)數(shù)據(jù)沒有問題。在初始編程階段,當(dāng)編寫調(diào)用方法時(shí),這樣的假設(shè)并無大礙。這時(shí)你完全能夠知道什么是參數(shù)的許可值,并按要求提供這些值。但如果你不對(duì)參數(shù)的數(shù)據(jù)進(jìn)行檢驗(yàn),那么下列情況就會(huì)給你帶來很大麻煩:另外某個(gè)人創(chuàng)建了一個(gè)調(diào)用方法,但此人不知道允許的值;你在晚些時(shí)候添加了新的調(diào)用方法,并錯(cuò)誤的傳遞了壞數(shù)據(jù)。
3. 命名約定
所有變量的定義應(yīng)該遵循匈牙利命名法,它使用3字符前綴來表示數(shù)據(jù)類型,3個(gè)字符的前綴必須小寫,前綴后面是由表意性強(qiáng)的一個(gè)單詞或多個(gè)單詞組成的名字,而且每個(gè)單詞的首寫字母大寫,其它字母小寫,這樣保證了對(duì)變量名能夠進(jìn)行正確的斷句。
這樣,在一個(gè)變量名就可以反映出變量類型和變量所存儲(chǔ)的值的意義兩方面內(nèi)容,這使得代碼語句可讀性強(qiáng)、更加容易理解。
3.1 包、類及方法命名
標(biāo)示符類型
命名約定
例子
包
l 全部小寫。
l 標(biāo)識(shí)符用點(diǎn)號(hào)分隔開來。為了使包的名字更易讀,Sun 公司建議包名中的標(biāo)識(shí)符用點(diǎn)號(hào)來分隔。
l Sun 公司的標(biāo)準(zhǔn) java 分配包用標(biāo)識(shí)符 .java 開頭。
l 全局包的名字用你的機(jī)構(gòu)的 Internet 保留域名開頭 。
局部包:
interface.screens
全局包:
com.rational.www. interface.screens
類,接口
l 類的名字應(yīng)該使用名詞。
l 每個(gè)單詞第一個(gè)字母應(yīng)該大寫。
l 避免使用單詞的縮寫,除非它的縮寫已經(jīng)廣為人知,如HTTP。
Class Hello ;
Class HelloWorld ;
Interface Apple ;
方法
l 第一個(gè)單詞一般是動(dòng)詞。
l 第一個(gè)字母是小些,但是中間單詞的第一個(gè)字母是大寫。
l 如果方法返回一個(gè)成員變量的值,方法名一般為get+成員變量名,如若返回的值是bool變量,一般以is作為前綴。
l 如果方法修改一個(gè)成員變量的值,方法名一般為:set + 成員變量名。
getName();
setName();
isFirst();
變量
l 第一個(gè)字母小寫,中間單詞的第一個(gè)字母大寫。
l 不要用_或&作為第一個(gè)字母。
l 盡量使用短而且具有意義的單詞。
l 單字符的變量名一般只用于生命期非常短暫的變量。i,j,k,m,n一般用于integers;c,d,e一般用于characters。
l 如果變量是集合,則變量名應(yīng)用復(fù)數(shù)。
l 命名組件采用匈牙利命名法,所有前綴均應(yīng)遵循同一個(gè)組件名稱縮寫列表。
String myName;
int[] students;
int i;
int n;
char c;
btNew;
(bt是Button的縮寫)
常量
l 所有常量名均全部大寫,單詞間以‘_’隔開。
int MAX_NUM;
3.2 其它
開發(fā)人員如果遇到上述表格中未列舉的類型,請(qǐng)書面通知相關(guān)管理人員,由管理人員集中更新列表內(nèi)容,不得擅自啟用未經(jīng)確定的新變量前綴。
4. 使用常量
4.1 使用常量
1. 常數(shù)很容易在數(shù)據(jù)輸入時(shí)出錯(cuò)
常數(shù)存在的主要問題之一是你很容易在鍵入數(shù)字時(shí)出錯(cuò),從而顛倒了數(shù)字的位置。例如,當(dāng)你鍵入數(shù)字10876時(shí),很容易的鍵入10867或18076。與處理變量和保留字的方法不同,編譯器并不在乎顛倒了位置和不正確的數(shù)字,有時(shí)簡(jiǎn)單的錯(cuò)誤造成的問題不會(huì)立即表現(xiàn)出來,而當(dāng)問題表現(xiàn)出來時(shí),它們會(huì)以隨機(jī)的計(jì)算錯(cuò)誤的形式出現(xiàn),這些錯(cuò)誤很難準(zhǔn)確定位。用常量來取代常數(shù)時(shí),編譯器將在編譯時(shí)檢查常量的有效性。如果常量不存在,編譯器便將這一情況通知你,并拒絕進(jìn)行編譯,這可以消除錯(cuò)誤鍵入的數(shù)字帶來的問題,只要常量擁有正確的值,使用該常量的所有代碼也有使用該正確值。
2. 常數(shù)很難不斷更新
3. 常量使代碼更容易閱讀
使用常量后,得到的一個(gè)額外好處是可使創(chuàng)建的代碼更容易閱讀。常數(shù)很不直觀。也許你對(duì)常數(shù)非常了解,但其他人則根本看不明白。通過合理的給常量命名,使用這些常量的代碼就變得比較直觀了,更容易閱讀。
為常量賦予較寬的作用域,這與使用變量時(shí)的情況不同。在一個(gè)應(yīng)用程序中你決不應(yīng)該兩次創(chuàng)建相同的常量。如果你發(fā)現(xiàn)自己復(fù)制了一個(gè)常量,請(qǐng)將原始的常量說明轉(zhuǎn)至較寬的作用域,直到該常量可供引用它的所有方法為止。
5. 變量
5.1 定義有焦點(diǎn)的變量
用于多個(gè)目的的變量稱為無焦點(diǎn)(多焦點(diǎn))的變量。無焦點(diǎn)變量所代表的意義與程序的執(zhí)行流程有關(guān),當(dāng)程序處于不同位置時(shí),它所表示的意義是不固定的,這樣就給程序的可讀性和可維護(hù)性帶來了麻煩。
5.2 只對(duì)常用變量名和長(zhǎng)變量名進(jìn)行縮寫
如果需要對(duì)變量名進(jìn)行縮寫時(shí),一定要注意整個(gè)代碼中縮寫規(guī)則的一致性。例如,如果在代碼的某些區(qū)域中使用Cnt,而在另一些區(qū)域中又使用Count,就會(huì)給代碼增加不必要的復(fù)雜性。
變量名中盡量不要出現(xiàn)縮寫。
[page_break]5.3 使用統(tǒng)一的量詞
通過在結(jié)尾處放置一個(gè)量詞,就可創(chuàng)建更加統(tǒng)一的變量,它們更容易理解,也更容易搜索。例如,請(qǐng)使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
量詞列表:
量詞后綴
說明
First
一組變量中的第一個(gè)
Last
一組變量中的最后一個(gè)
Next
一組變量中的下一個(gè)變量
Prev
一組變量中的上一個(gè)
Cur
一組變量中的當(dāng)前變量
5.4 使用肯定形式的布爾變量
給布爾變量命名時(shí),始終都要使用變量的肯定形式,以減少其它開發(fā)人員在理解布爾變量所代表的意義時(shí)的難度。
5.5 為每個(gè)變量選擇最佳的數(shù)據(jù)類型
這樣即能減少對(duì)內(nèi)存的需求量,加快代碼的執(zhí)行速度,又會(huì)降低出錯(cuò)的可能性。用于變量的數(shù)據(jù)類型可能會(huì)影響該變量進(jìn)行計(jì)算所產(chǎn)生的結(jié)果。在這種情況下,編譯器不會(huì)產(chǎn)生運(yùn)行期錯(cuò)誤,它只是迫使該值符合數(shù)據(jù)類型的要求。這類問題極難查找。
5.6 盡量縮小變量的作用域
如果變量的作用域大于它應(yīng)有的范圍,變量可繼續(xù)存在,并且在不再需要該變量后的很長(zhǎng)時(shí)間內(nèi)仍然占用資源。
它們的主要問題是,任何類中的任何方法都能對(duì)它們進(jìn)行修改,并且很難跟蹤究竟是何處進(jìn)行修改的。
占用資源是作用域涉及的一個(gè)重要問題。對(duì)變量來說,盡量縮小作用域?qū)?huì)對(duì)應(yīng)用程序的可靠性產(chǎn)生巨大的影響。
6. 代碼的格式化
6.1 對(duì)代碼進(jìn)行格式化時(shí),要達(dá)到的目的
1. 通過代碼分割成功能塊和便于理解的代碼段,使代碼更容易閱讀和理解;
2. 使用空行和注釋行,將程序中邏輯上不相關(guān)的代碼塊分開。比如:變量聲明部分和代碼語句間的分隔;較長(zhǎng)的方法中,完成不同功能的代碼塊間的分隔。要避免出現(xiàn)邏輯上混亂的分隔,如:某一邏輯功能代碼塊中間用空行進(jìn)行了分隔,但是在相鄰功能代碼塊之間卻沒有分隔,這樣會(huì)給程序閱讀者造成錯(cuò)覺。
3. 減少為理解代碼結(jié)構(gòu)而需要做的工作;
4. 使代碼的閱讀者不必進(jìn)行假設(shè);
5. 使代碼結(jié)構(gòu)盡可能做到格式清楚明了。
6.2 編程原則
1. 要將多個(gè)語句放在同一行上
不論是變量聲明,還是語句都不要在一行上書寫多個(gè)。
2. 縮進(jìn)后續(xù)行
當(dāng)你將變量設(shè)置為某個(gè)值時(shí),所有后續(xù)行的縮進(jìn)位置應(yīng)與第一行的變量值相同;
當(dāng)你調(diào)用一個(gè)方法時(shí),后續(xù)行縮進(jìn)到第一個(gè)參數(shù)的開始處;
當(dāng)你將變量或?qū)傩栽O(shè)置為等于表達(dá)式的計(jì)算結(jié)果時(shí),請(qǐng)從后面分割該語句,以確保該表達(dá)式盡可能放在同一行上。
3. 在if語句后縮進(jìn);
在else語句后縮進(jìn)
在switch語句后縮進(jìn)
在case語句后縮進(jìn)
在do句后縮進(jìn)
已經(jīng)用行接續(xù)符分割的語句的各個(gè)行要縮進(jìn)
對(duì)從屬于行標(biāo)注的代碼進(jìn)行縮進(jìn)。
4. 在執(zhí)行統(tǒng)一任務(wù)的各個(gè)語句組之間插入一個(gè)空行。好的代碼應(yīng)由按邏輯順序排列的進(jìn)程或相關(guān)語句組構(gòu)成。
7. 代碼的注釋
7.1 使用代碼注釋的目的
1. 文字說明代碼的作用(即為什么要用編寫該代碼,而不是如何編寫);
2. 確指出該代碼的編寫思路和邏輯方法;
3. 人們注意到代碼中的重要轉(zhuǎn)折點(diǎn);
4. 使代碼的閱讀者不必在他們的頭腦中仿真運(yùn)行代碼的執(zhí)行方法.
7.2 編程原則
1. 用文字說明代碼的作用:
簡(jiǎn)單的重復(fù)代碼做寫什么,這樣的注釋幾乎不能給注釋增加什么信息.如果你使用好的命名方法來創(chuàng)建直觀明了的代碼那么這些類型的注釋絕對(duì)增加不了什么信息.
2. 如果你想違背好的編程原則,請(qǐng)說明為什么
有的時(shí)候你可能需要違背好的編程原則,或者使用了某些不正規(guī)的方法,.遇到這種情況時(shí),請(qǐng)用內(nèi)部注釋來說明你在做什么和為什么要這樣做。
技巧性特別高的代碼段,一定要加詳細(xì)的注釋,不要讓其他開發(fā)人員花很長(zhǎng)時(shí)間來研究一個(gè)高技巧但不易理解的程序段。
3. 用注釋來說明何時(shí)可能出錯(cuò)和為什么出錯(cuò)
4. 在編寫代碼前進(jìn)行注釋
給代碼加注釋的方法之一是在編寫一個(gè)方法前首先寫上注釋.如果你愿意,可以編寫完整句子的注釋或偽代碼.一旦你用注釋對(duì)代碼進(jìn)行了概述,就可以在注釋之間編寫代碼.
5. 在要注釋的代碼前書寫注釋
注釋一定出現(xiàn)在要注釋的程序段前,不要在某段程序后書寫對(duì)這段程序的注釋,先看到注釋對(duì)程序的理解會(huì)有一定幫助。
如果有可能,請(qǐng)?jiān)谧⑨屝信c上面代碼間加一空行。
6. 純色字符注釋行只用于主要注釋
注釋中要分隔時(shí),請(qǐng)使用一行空注釋行來完成,不要使用純色字符,以保持版面的整潔、清晰。
7. 避免形成注釋框
用星號(hào)圍成的注釋框,右邊的星號(hào)看起來很好,但它們給注釋增加了任何信息嗎?實(shí)際上這會(huì)給編寫或編輯注釋的人增加許多工作。
8. 增強(qiáng)注釋的可讀性
注釋是供人閱讀的,而不是讓計(jì)算機(jī)閱讀的。
1) 使用完整的語句。雖然不必將注釋分成段落(最好也不要分成段落),但你應(yīng)盡量將注釋寫成完整的句子。
2) 避免使用縮寫?s寫常使注釋更難閱讀,人們常用不同的方法對(duì)相同的單詞進(jìn)行縮寫,這會(huì)造成許多混亂,如果必須對(duì)詞匯縮寫,必須做到統(tǒng)一。
3) 將整個(gè)單詞大寫,以突出它們的重要性。若要使人們注意注釋中的一個(gè)或多個(gè)單詞,請(qǐng)全部使用大寫字母。
9. 對(duì)注釋進(jìn)行縮進(jìn),使之與后隨的語句對(duì)齊。
注釋通常位于它們要說明的代碼的前面。為了從視覺上突出注釋與它的代碼之間的關(guān)系,請(qǐng)將注釋縮進(jìn),使之與代碼處于同一個(gè)層次上。
10. 為每個(gè)方法賦予一個(gè)注釋標(biāo)頭
每個(gè)方法都應(yīng)有一個(gè)注釋標(biāo)頭。方法的注釋標(biāo)頭可包含多個(gè)文字項(xiàng),比如輸入?yún)?shù)、返回值、原始作者、最后編輯該方法的程序員、上次修改日期、版權(quán)信息。
11. 當(dāng)行尾注釋用在上面這種代碼段結(jié)構(gòu)中時(shí),它們會(huì)使代碼更難閱讀。
使用多個(gè)行尾注釋時(shí)(比如用于方法頂部的多個(gè)變量說明),應(yīng)使它們互相對(duì)齊。這可使它們稍容易閱讀一些。
12. 何時(shí)書寫注釋
1) 請(qǐng)?jiān)诿總(gè)if語句的前面加上注釋。
2) 在每個(gè)switch語句的前面加上注釋。與if語句一樣,switch語句用于評(píng)估對(duì)程序執(zhí)行產(chǎn)生影響的表達(dá)式。
3) 在每個(gè)循環(huán)的前面加上注釋。每個(gè)循環(huán)都有它的作用,許多情況下這個(gè)作用不清楚直觀。
7.3 注釋那些部分
項(xiàng)目
注釋哪些部分
實(shí)參/
參數(shù)
參數(shù)類型
參數(shù)用來做什么
任何約束或前提條件
示例
字段/
字段/屬性
字段描述
注釋所有使用的不變量
示例
并行事件
可見性決策
類
類的目的
已知的問題
類的開發(fā)/維護(hù)歷史
注釋出采用的不變量
并行策略
編譯單元
每一個(gè)類/類內(nèi)定義的接口,含簡(jiǎn)單的說明
文件名和/或標(biāo)識(shí)信息
版權(quán)信息
接口
目的
它應(yīng)如何被使用以及如何不被使用
局部變量
用處/目的
成員函數(shù)注釋
成員函數(shù)做什么以及它為什么做這個(gè)
哪些參數(shù)必須傳遞給一個(gè)成員函數(shù)
成員函數(shù)返回什么
已知的問題
任何由某個(gè)成員函數(shù)拋出的異常
可見性決策
成員函數(shù)是如何改變對(duì)象的
包含任何修改代碼的歷史
如何在適當(dāng)情況下調(diào)用成員函數(shù)的例子適用的前提條件和后置條件
成員函數(shù)內(nèi)部注釋
控制結(jié)構(gòu)
代碼做了些什么以及為什么這樣做
局部變量
難或復(fù)雜的代碼
處理順序
[page_break]7.4 示例
7.4.1 塊注釋:
主要用來描述文件,類,方法,算法等。一般用在文檔和方法的前面,也可以放在文檔的任何地方。以‘/*’開頭,‘*/’結(jié)尾。例:
……
/*
* 注釋
*/
……
7.4.2 行注釋:
主要用在方法內(nèi)部,對(duì)代碼,變量,流程等進(jìn)行說明。與塊注釋格式相似,但是整個(gè)注釋占據(jù)一行。例:
……
/* 注釋 */
……
7.4.3 尾隨注釋:
與行注釋功能相似,放在代碼的同行,但是要與代碼之間有足夠的空間,便于分清。例:
int m=4 ; /* 注釋 */
如果一個(gè)程序塊內(nèi)有多個(gè)尾隨注釋,每個(gè)注釋的縮進(jìn)應(yīng)該保持一致。
7.4.4 行尾注釋:
與行注釋功能相似,放在每行的最后,或者占據(jù)一行。以‘//’開頭。
7.4.5 文檔注釋:
與塊注釋相似,但是可以被javadoc處理,生成HTML文件。以‘/**’開頭,‘*/’結(jié)尾。文檔注釋不能放在方法或程序塊內(nèi)。例:
/**
注釋
*/
8. 表達(dá)式和語句
8.1 每行應(yīng)該只有一條語句。
8.2 if-else,if-elseif語句,任何情況下,都應(yīng)該有“{”,“}”,格式如下:
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
8.3 for語句格式如下:
for (initialization; condition; update) {
statements;
}
如果語句為空:
for (initialization; condition; update) ;
8.4 while語句格式如下:
while (condition) {
statements;
}
如果語句為空:
while (condition);
8.5 do-while語句格式如下:
do {
statements;
} while (condition);
8.6 switch語句,每個(gè)switch里都應(yīng)包含default子語句,格式如下:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
8.7 try-catch語句格式如下:
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
9. 錯(cuò)誤處理和異常事件
通常的思想是只對(duì)錯(cuò)誤采用異常處理:邏輯和編程錯(cuò)誤,設(shè)置錯(cuò)誤,被破壞的數(shù)據(jù),資源耗盡,等等。
通常的法則是系統(tǒng)在正常狀態(tài)下以及無重載和硬件失效狀態(tài)下,不應(yīng)產(chǎn)生任何異常。異常處理時(shí)可以采用適當(dāng)?shù)娜罩緳C(jī)制來報(bào)告異常,包括異常發(fā)生的時(shí)刻。不要使用異常實(shí)現(xiàn)來控制程序流程結(jié)構(gòu)。
10. 封裝、事務(wù)
1. 非商務(wù)公用組件單獨(dú)封裝
2. 每一個(gè)業(yè)務(wù)流程單獨(dú)封裝
3. 一次方法(組件)的調(diào)用應(yīng)能完成某一項(xiàng)功能或流程,即符合完整性
4. 一次方法(組件)的調(diào)用符合ACID事務(wù)性
5. 多次方法(組件)的調(diào)用應(yīng)包含在一個(gè)事務(wù)中
11. 可移植性
1. 盡量不要使用已經(jīng)被標(biāo)為不贊成使用的類或方法。
2. 如果需要換行的話,盡量用 println 來代替在字符串中使用"\n"。
3. 用separator()方法代替路徑中的”/”或”\” 。
4. 用pathSeptarator()方法代替路徑中的 ” : ” 或 ” ;”