




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java編碼規(guī)范及實(shí)踐
目錄
Java編碼規(guī)范及實(shí)踐.........................................................................................1
1.2術(shù)語(yǔ)...................................................................................................2
1.3約束...................................................................................................3
I|!(conditions&&condition6)){.........................................................14
4.1一般命名規(guī)范..........................................................................................14
IQuery,IDataAccess,IReportBuilder......................................................15
MAX_TIMES,DEFAULT_NAME..................................................................15
4.2一特殊命名規(guī)范......二..................................................................................17
AbstractReportBuilder,AbstractBeanFactory..............................................18
AccessException,RuntimeException.......................................................19
5.2一般原則..............................................................................................20
1.代碼應(yīng)該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會(huì).....................................20
2.注釋盡量簡(jiǎn)潔,尺度沒(méi)有準(zhǔn)確的定義,大部分人能明白即可,可以將自.....................................20
ResultgetResult()throwsException{....................................................21
ObjectgetAction();......................................................................22
JavaDoc工具不要改變格式.................................................................................22
Getadefaultdate/timeformatterthatusestheSHORT..................................23
Thread,sleep(1000);......................................................................24
Derived,如果一個(gè)方法可以接受基類對(duì)象b的話:methodi(Baseb),...............................25
7.1工廠模式..............................................................................................26
7.1.1簡(jiǎn)單工廠..............................................................................................26
7.1.2工廠方法..............................................................................................26
7.2單例模式..............................................................................................27
Client:............................................................................................................................................................................................................27
7.3適配器模式...........................................................................................28
7.4組合模式..............................................................................................29
Client:............................................................................................................................................................................................................29
7.5外觀模式..............................................................................................30
Client:............................................................................................................................................................................................................30
7.6代理模式..............................................................................................31
7.7命令模式..............................................................................................32
Client:............................................................................................................................................................................................................33
7.8觀察者模式...........................................................................................33
7.9策略模式..............................................................................................35
Client:............................................................................................................................................................................................................35
IKeyPairGenerabledesGenerator=........................................................35
IKeyPairGenerablersaGenerator=........................................................36
IKeyPairGenerableideaGenerator=.......................................................36
KeyPairManagermanager=newKeyPairManager();..........................................36
7.10模版方法模式.........................................................................................36
7.11參觀者模式...........................................................................................38
總價(jià)格......................................................................................................40
Client:............................................................................................................................................................................................................40
第1章概述
1.1前言
代碼之于程序員,就像零件之于機(jī)械工,莊稼之于農(nóng)民,它是軟件的基
石,一行行代碼都是程序員的心血經(jīng)過(guò)日日夜夜凝結(jié)成的。做為一個(gè)程序員,
應(yīng)該像母親呵護(hù)孩子一樣呵護(hù)自己的代碼,它不僅僅是一行一行的文字,它
是一個(gè)程序員的尊嚴(yán)和價(jià)值所在;它是活的,你甚至能感受到它的心跳。編
碼規(guī)范只是大家達(dá)成一致的約定,這樣大家的代碼就可以互相看懂,維護(hù)起
來(lái)更加容易,思想更暢快的交流,經(jīng)驗(yàn)更快的得到傳播。代碼規(guī)范不是束縛
程序員的桎梏,應(yīng)該知道,不遵守規(guī)范的個(gè)性的代碼并不代表程序員的性格,
并不能張揚(yáng)個(gè)性。個(gè)性應(yīng)該體現(xiàn)在用更簡(jiǎn)單、更優(yōu)雅、更易讀、更易理解以
及算法實(shí)現(xiàn)效率更高等方面。
可讀性,可理解性是代碼的重要方面,本規(guī)范主要圍繞如何去產(chǎn)生規(guī)范
易讀的代碼。另外,它也保證了大家有共同的先驗(yàn)知識(shí)。
1.2術(shù)語(yǔ)
Pascalcase一所有單詞第一個(gè)字母大寫(xiě),其它字母小寫(xiě)。
例:Person,OrderDetail,OilTanko
Camelcase—除了第一個(gè)單詞,所有單詞第一個(gè)字母大寫(xiě),其他字
母小寫(xiě)。
例:oilLevelzcustomerName
在后面的描述中我們使用Pascal代表第一種表示方式,Camel代表第二
種表示方式。
1.3約束
沒(méi)有一個(gè)規(guī)范可以到處適用,也不可能無(wú)所不包。
1.本規(guī)范并非完全強(qiáng)制性規(guī)范,對(duì)于任何違背本規(guī)范但能提高代碼可
讀性的措施,都可以采用。
2.本規(guī)范第3,4,5章為強(qiáng)制性規(guī)范,其它章節(jié)為建議規(guī)范。如違背
本條,請(qǐng)參考第一條。
第2章一般規(guī)則
1)所有包,類,接口,方法,屬性,變量,參數(shù)均使用英文單詞進(jìn)行命名,具
體細(xì)節(jié)請(qǐng)參見(jiàn)命名規(guī)范一章。
2)命名包,類,接口,方法以及變量時(shí),盡量使用貼近問(wèn)題域的表意豐富的名
稱。
3)修改源代碼時(shí),應(yīng)盡量保持與所修改系統(tǒng)的編碼風(fēng)格保持一致。
4)所有包名使用必須使用com.[company]前綴,所有項(xiàng)目使用com.
[company].[projectname],company是公司簡(jiǎn)稱,projectname是項(xiàng)目的縮寫(xiě)。
第3章格式規(guī)范
5)包的導(dǎo)入應(yīng)該按照相關(guān)性進(jìn)行分組。
importjava.io.lOException;
importjava.net.URL;
importjava.rmi.RmiServer;
importjava.rmi.server.Server;
importjavax.swing.JPanel;
importjavax.swing.event.ActionEvent;
importorg.linux.apache.server.SoapServer;
6)只倒入明確需要的類,這樣只要看導(dǎo)入列表,就可以知道該類依賴于哪些類
和接口,保證可讀性。
importjava.util.List;//J@importjava.util,*
importjava.util.Arraylist;
importjava.util.HashSet;
7)類和接口中元素的布局順序。
1.類和接口的文檔描述
2.類和接口的聲明
3.類的靜態(tài)變量,按照public,protected,private的順序。
4.實(shí)例變量,按照public,protected,private的順序。
5.類的方法,無(wú)固定順序。
8)類的聲明,基類和實(shí)現(xiàn)的接口應(yīng)該獨(dú)立成行,保證可讀性。
classUserManagerlmpl
extendsAbstractManager
implementslUtjeiMdiiciyeL{
9)方法修飾關(guān)鍵字定義順序。
〈public,protected,private>staticabstractsynchronized
unuaualfinalnativemethodName
注意訪問(wèn)標(biāo)示符一定要在最前面。
publicstaticdoublesquare(doublea);
staticpublicdoublesquare(doublea);
10)變量聲明,采用Camel表示法不要在一行聲明多個(gè)變量。
//推薦
intlevel;
intsize;
//避免
intlevel,size;
11)保證明確的類型轉(zhuǎn)換,不要默認(rèn)進(jìn)行隱式類型轉(zhuǎn)換
intValue=(int)floadvalue;//避免intValue=floatvalue
12)數(shù)組指示符緊跟類型變量
int[]a=newint[20];//inta[]=newint[20]
一個(gè)變量要代表獨(dú)立的意思,不要在其生命周期賦予它不同的概念。
inttempValue;
tempValue=maxValje;
LeiupValue=miiiValje;
tempValue=anotherValue;
tempValue在生命周期內(nèi)表示了各種各樣的意圖,增加理解代碼的難度。
應(yīng)該為每個(gè)獨(dú)立概念定義單獨(dú)的變量:
inttempMaxValue;
inttempMinValue;
inttempAnotherValue;
13)僅僅循環(huán)控制變量才能出現(xiàn)在for()循環(huán)中
sum=0;
for(i=0;i<100;i++){
sum+=value[i];
)
播免:
for(i=0.sum=0;i<100:i++)(
sum+=value[i];
/
14)循環(huán)變量應(yīng)靠近循環(huán)體初始化
isDone=false
while(!isDone){
}
//避免
isDone=false;
while(!isDone){
15)避免長(zhǎng)的布爾表達(dá)式,應(yīng)換成多個(gè)更容易理解的表達(dá)式。
boolisFinished=(elementNo<0)||(elementNo>maxElement);
boolisRepeatedEntry=elementNo==lastElement;
if(isFinished||isRepeatedEntry){
//避免
if((elementNo<0)||(elementNo>maxElement)\\elementNo==
lastElement){
16)不要在條件語(yǔ)句中執(zhí)行方法,以提高可讀性
Inputstreamstream=File.open(fileName,nwn);
if(stream!=null){
)
播免
if(File.open(fileNamet/=null)){
/
17)代碼縮進(jìn),應(yīng)該使用4個(gè)空格為一個(gè)單位進(jìn)行縮進(jìn),
publicStringinvoke()throwsException{
....StringprofileKey="invoke:H;
try{
....UtilTimerStack.push(profileKey);
if(executed){
....test=true;
)
catch(
)
18)條件語(yǔ)句的主要形式,即使單條語(yǔ)句,也要使用括號(hào)括起來(lái)。
if(condition){
statements;
}
if(condition){
statements;
Felse{
statements;
)
if(condition){
statements;
)elseif(condition){
statements;
?else(
statements;
)
19)空循環(huán)體也要使用完整的塊
for(initialization;condition;update){
*
)
20)switch語(yǔ)句的使用格式
switch(condition){
caseABC:
statements;
//穿透,一定要做出注釋
caseDEF:
statements;
break;
caseXYZ:
statements;
break;
default:
statements;
break;
I
21)try-catch使用格式
try(
statements;
}
catch(Exceptionexception)
statements;
)
try(
statements;
}
catch(Exceptionexception)
statements;
}
finally(
statements;
22)空格的使用
1.運(yùn)算符兩邊應(yīng)該各有一個(gè)空格。
2.Java保留字后面應(yīng)跟隨一個(gè)空格。
3.逗號(hào)后面應(yīng)跟隨一個(gè)空格。
4.冒號(hào)兩個(gè)應(yīng)各有一個(gè)空格。
5.分號(hào)后面應(yīng)跟隨一個(gè)空格。
a=(b+c)*d;//NOT:a=(b+c)^d
while(true){//NOT:while(true)l...
doSomething(arb,c,d);//NOT:doSomethingfa,b,c,d);
case100://NOT:case100:
for(i=0;i<10;i++){//NOT:far(i=0;i<10;i+^){...
23)空行的使用
1.文件頭部注釋、package語(yǔ)句和import語(yǔ)句之間。
2.class之間
3.方法之間
4.方法中,變量的申明和具體代碼之間。
5.邏輯上相關(guān)的語(yǔ)句段之間
6,塊注釋和行注釋的前面
▽—代表空行
★
V
packageXXX.XXX;
V
importXXX.XXX.XXX.XXX;
V
publicclassUserFileAccess
V
//
privateintmyObjId;
V
/★★
*
*/
publicUserFileAccess()
/**
*
★/
publicvoidgetCtllnfo()
intcount;
Stringmsg;
V
count=100;
???
V
//實(shí)現(xiàn)代碼注釋前空行
msg="MESSAGE”;
V
count=dataCount;
if(count==0){
)
)
V
/**
*
*/
privateclassUserFileRead{
24)邏輯上緊密相關(guān)的代碼塊應(yīng)該用一個(gè)空行分開(kāi)。
//Createanewidentitymatrix
Matrix4x4matrix=newMatrix4x4();
//Precomputeanglesforefficiency
doublecosAngle=Math.cos(angle);
doublesinAngle=Math.sin(angle);
//Specifymatrixasarotationtransformation
matrix.setElement(lz1,cosAngle);
matrix.setElement(1,2,sinAngle);
matrix.setElement(2Z1,-sinAngle);
matrix.setElement(2Z2,cosAngle);
//Applyrotation
transformation.multiply(matrix);
25)為了保證可讀性,變量名應(yīng)該左對(duì)齊。
TextFilefile;
intnPoints;
doublex,y;
//避免
TextFilefile;
intnPoints;
doublex,y;
26)像前面一般規(guī)則里說(shuō)的那樣,任何提高代碼可讀性的排版都可以去嘗試,
下面是一些例子。
if(a==lowValue)compueSomething();
elseif(a==mediumvalue)computeSomethingElse();
elseif(a==highValue)computeSomethingElseYet();
value=(potential*oilDensity)/constantl+
(depth*waterDensity)/constant2+
(zCoordinaLeValue*gasDensity)/constants;
minPosition=computeDistance(min,x,y,z);
averagePosition=computeDistance(average,x,y,z);
switch(phase){
casePHASE_OIL:text="Oil";break;
casePHASE_WATER:text="Watern;break;
casePHASE_GAS:text="Gas";break;
27)當(dāng)對(duì)if語(yǔ)句中的條件進(jìn)行折行時(shí),應(yīng)該使折行的條件語(yǔ)句相對(duì)主功能
語(yǔ)句再行縮進(jìn)4個(gè)空格,以突出主要功能語(yǔ)句。
//使用這種縮進(jìn),突出主要功能語(yǔ)句。
if((conditionl&&condition?)
II(conditions&&condition4)
II!(conditions&&condition6)){
doSomethingAboutlt();
//避免使用這種縮進(jìn),主功能語(yǔ)句不突出。
if((conditionl&&condition?)
II(conditions&&conditiond)
I|!(conditions&&condition6)){
doSomethingAboutlt();
28)三元條件運(yùn)算符
可以使用如下三種表達(dá)方式,條件要用括號(hào)括起來(lái)。
alpha=(aLongBooleanExpression)?beta:gamma;
alpha-(aLongBooleanExpression)?beta
:gamma;
alpha=(aLongBooleanExpression)
?beta
:gamma
第4章命名規(guī)范
4.1一般命名規(guī)范
29)包名應(yīng)該用小寫(xiě)字母,不要出現(xiàn)下劃線等符號(hào),名詞用有意義的縮寫(xiě)或
者英文單詞。
示例:
//推薦
com.esse.business
java.lang.util
//避免
com.Esse-tech.business
30)所有類命名使用Pascal表示方式,使用名詞組合,
UserManager,ClassLoader,HttpHeaderResult
31)接口命名使用字母''工〃加上Pascal形式的表示方式。
工Query,IDataAccess,IReportBuilder
32)使用名詞組合或形容詞去命名一個(gè)接口,接口聲明了一個(gè)對(duì)象能提供的
服務(wù),也描述了一個(gè)對(duì)象的能力。一般以“able”和“ible”作為后綴,
代表了一種能力。
publicinterfaceRunnable<
publicvoidrun();
}
publicinterfaceAccessible(
publicContextgetContext();
)
33)變量名和參數(shù)名使用Camel表示方式。
userName,objectFactory,entrys,list
34)對(duì)于常量名,使用大寫(xiě)字母,并使用下劃線做間隔。
MAX_T工MES,DEFAULT_NAME
程序中應(yīng)該使用常量代替'、25〃,''100〃等實(shí)際的數(shù)字,如:
//推薦
if(times==MAX_TIMES){
//避免
if(times==25){
這樣做的好處是,當(dāng)因需要修改實(shí)際的數(shù)字時(shí),比如修改25為30,只需要
修改一處。
35)方法名應(yīng)該使用動(dòng)詞開(kāi)頭,使用Camel表示方式,一般由動(dòng)詞+名詞組
成。
getName,initialize,addParameterrdeleteUser
36)縮寫(xiě)字母也應(yīng)該保持首字母大寫(xiě)
cxportHtmlSource();〃避免;exportHTMLSourcc();
openDvdPlayer();//避免:
37)變量的名字應(yīng)該和類型名稱一致
voidsetTopic(Topictopic)//voidsetTopic(Topicvalue)
//避免:voidsetTopic(TopicaTopic)
//避免:voidsetTopic(Topict)
voidconnect(Databasedatabase)
//避免:voidconnect(Databasedb)
〃避免:voidconnect(DatabaseoracleDB)
當(dāng)同時(shí)定義多個(gè)屬于同一個(gè)類的變量時(shí),把類型作為實(shí)例的后綴,如:
PointstartPoint;
PointcenterPoint;
這樣做是為了從實(shí)例名就可以推斷它的類型名稱。
38)根據(jù)變量的作用范圍,作用范圍大的應(yīng)該使用長(zhǎng)名稱,作用范圍大,表
明變量的生命周期比較長(zhǎng),為了有助十理解,應(yīng)盡量用長(zhǎng)名稱以表達(dá)變量的
真實(shí)意圖。反之,對(duì)于作用范圍小,可以使用一些簡(jiǎn)化的名稱,比如i,j,
k等,提高編程效率。
for(inti=0;i<times;i++){
4.2特殊命名規(guī)范
39)使用get/set對(duì)類屬性進(jìn)行訪問(wèn),這是Java社區(qū)的核心編碼規(guī)范。
40)使用is前綴表示一個(gè)布爾變量和方法。
isUsedzisEmpty,isVisible,isFinished
有時(shí)也可以使用has,can,should:
booleanhasLicense();
booleancanEvaluate();
boolpanshou1dAbort.=fa1SA;
41)在查詢方法中應(yīng)使用find作為前綴
vertex.findNearestVertex();
matrix.findSmallestElement();
node.findShortestPath(NodedestinationNoce);
42)使用initialize做為對(duì)象初始化的方法前綴,也可以簡(jiǎn)寫(xiě)為init
initializer!les();
init();
initFontSet();
43)對(duì)于對(duì)象集合,變量名稱應(yīng)使用復(fù)數(shù)。
Collection<Point>points;
int[]values;
44)對(duì)于抽象類,應(yīng)該使用Abstract前綴。
AbstractReportBuilder,AbstractBeanFactory
45)對(duì)于表示編號(hào)的變量,應(yīng)加No后綴。
tableNo,userNo,employeeNo
46)常在一起使用的對(duì)稱詞匯,這些詞匯一起使用,方法的表達(dá)意圖自然可
以互相推測(cè)和演繹。
get/setzadd/remove,create/destroy,start/stop,
insert/delete,increment/decrementzbegin/end,first/lastz
up/down,min/max,next/previous,old/new,open/closez
show/hide,suspend/resume
47)避免使用否定布爾變量
boolisError;//避免:isNoError
boolisFound;//避免:isNoiFoimd
48)異常類應(yīng)該使用Exception做為后綴。
AccessExceptionfRuntimeException
49)缺省接口實(shí)現(xiàn)應(yīng)該使用Default前綴
classDefaultTableCellRenderer
implementsTableCellRenderer{
)
50)對(duì)于單例類(Singleton),應(yīng)該使用getlnstance方法得到單例。
classUnitManager{
privatefinalstaticUnitManagerinstance=newUnitManager();
privateUnitManager(){
publicstaticUnitManagergetlnstance(){
returninstance_;
)
)
51)對(duì)于工廠類,進(jìn)行創(chuàng)建對(duì)象的方法,應(yīng)該使用new前綴
classPointFactory{
publicPointnewPoint(???){
)
第5章注釋規(guī)范
5.1概述
代碼中為什么要包含注釋?
1.別人要調(diào)用你的程序中的公共接口,對(duì)這部分進(jìn)行文檔描述,使別人能
夠正確而有效的使用它。
2.除了自己,別人要閱讀和維護(hù)你的代碼。為了使代碼更容易維護(hù),首先
要使代碼更易于理解,才能在理解的基礎(chǔ)上進(jìn)行維護(hù)。對(duì)這些代碼進(jìn)行
文檔描述,將使這個(gè)過(guò)程變得更加容易。
對(duì)代碼進(jìn)行注釋,是在代碼可讀性的基礎(chǔ)上,使用自然語(yǔ)言對(duì)代碼所表
達(dá)的意思進(jìn)行闡述。并不是說(shuō)代碼可以寫(xiě)的很爛,注釋寫(xiě)的很詳細(xì),這不是
好的方式。如果代碼可讀性很好,命名表意豐富,清晰,一般不需要特別多
的注釋。對(duì)于類,主要著重要描述它的職責(zé),即它能干什么,對(duì)于復(fù)雜的算
法實(shí)現(xiàn),應(yīng)該使用內(nèi)部實(shí)現(xiàn)注釋,說(shuō)明算法的主要思路,對(duì)于長(zhǎng)方法,要讓
閱讀代碼的人比較容易的明白方法實(shí)現(xiàn)的主要流程。反之,對(duì)于一看就懂的
方法,則不需要進(jìn)行注釋,比如get/set方法。
5.2一般原則
1.代碼應(yīng)該和注釋保持同步,如果代碼和注釋不同步,則閱讀代碼的人會(huì)
想,、'到底是代碼準(zhǔn)確,還是注釋準(zhǔn)確啊〃,換誰(shuí)都會(huì)糊涂。
2.注釋盡量簡(jiǎn)潔,尺度沒(méi)有準(zhǔn)確的定義,大部分人能明白即可,可以將自
己的代碼給同事看看。太簡(jiǎn)單的方法就不要注釋了,比如上面提到的
get/set方法。
5.3注釋內(nèi)容
/*
*Copyright(c)2002-2006byOpenSymphony
*Allrightsreserved.
packagecom.opensymphony.xwork2;
importerceptor.PreResultListener;
importcom.opensymphony.xwork2.util.ValueStack;
importjava.io.Serializable;
*類職責(zé)簡(jiǎn)要描述
*^authorJasonCarreira
*@seecom.opensymphony.xwork2.ActionProxy
*/
publicclassActioninvocationimplementsSerializable{
*方法簡(jiǎn)要描述
★
*方法詳細(xì)描述
*JavaDoctags,比如
*^author
*@version
*@see。o
*@returnaResultinstance
ResultgetResult()throwsException{
//內(nèi)部實(shí)現(xiàn)注釋/
//多行內(nèi)部實(shí)現(xiàn)注釋I5
Stringname=this.ge^e();
GettheActionassociatedwiththisActionInvocation
ObjectgetAction();
*^returnwhetherthisActionInvocationhasexecutedbefore.
*executed.
*/
booleanisExecuted();
*InvokesthenextstepinprocessingthisActioninvocation.
*one.IfInterceptorschoosenotto
*theywillcallinvoke()toallowthenextInterceptortoexecute
*theActionisexecuted.IftheActionProxygetExecuteResult
*/
Stringinvoke()throwsException;
①代碼的版權(quán)信息。
②類描述信息,描述類的主要職責(zé)和用處。
(§)方法描述信息,描述方法是做什么的,如何調(diào)用,最好給出調(diào)用代碼示例。
④JavaDoctags,用來(lái)生成Html形式的API文檔
⑤內(nèi)部實(shí)現(xiàn)注釋,用于描述復(fù)雜的算法,長(zhǎng)方法,從為什么要這么做角度去
描述
52)盡可能在類描述中加入代碼調(diào)用示例,使用<pre></pre>標(biāo)記,提示
JavaDoc工具不要改變格式.
/**
*DateFormatisanabstractclassfordate/timeformatting
*formatsandparsesdatesortimeinalanguage-independentmanner.
<pre>
*myString=DateFormat.getDatelnstance().format(myDate);
*</pre>
<pre>
*DateFormatdf=DateFormat.getDatelnstance();I
包含代碼調(diào)彳示
*for(inti=0;i<myDate.length;++i){7^^^例
*output.printin(df.format(myDate[i])+";”);
*</pre>
@seeFormat
@seejava.util.TimeZone
Aversion1.5104/12/04
?authorMarkDavis,Chen-LiehHuang,AlanLiu
publicabstractclassEateFormatextendsFormat{
53)使用?deprecated廢棄方法,不要?jiǎng)h掉它。
*?deprecated
Getadefaultdate/timeformatterthatusestheSHORT
dateandthetime.
publicfinalstaticDateFormatgetlnstance(){
returngetDateTimelnstance(SHORT,SHORT);
54)使用行末注釋對(duì)深層嵌套代碼進(jìn)行注釋
for(i...){
for(j...){
while(...){
if(...){
switch(...){
i//endswitch
}//endif
)//endwhile
)//endfori
i//endforj
第6章編程實(shí)踐
55)對(duì)于靜態(tài)方法,應(yīng)該使用類名去使用,不應(yīng)該用實(shí)例去引用,主要是為
了體現(xiàn)更多的語(yǔ)義。
Thread.sleep(1000);
〃避免,無(wú)法體現(xiàn)sleep是靜態(tài)方法還是實(shí)例方法
thread.sleep(1000);
56)對(duì)一些基本數(shù)據(jù)類型和不太可能通過(guò)繼承進(jìn)行擴(kuò)展的類,應(yīng)聲明為
final,提高效率。
57)類和方法的粒度保持適中,保持類的規(guī)模盡量短小,職責(zé)單一。小類有
很多好處,易于設(shè)計(jì),易于測(cè)試,易于理解。同樣方法也要盡量的小,每個(gè)
方法盡量不要超出25行。
58)開(kāi)閉原則,軟件應(yīng)該對(duì)擴(kuò)展開(kāi)發(fā),對(duì)修改開(kāi)放。也就是說(shuō),應(yīng)該在不修
改以前源代碼的基礎(chǔ)上,改變程序的行為以適應(yīng)新的需求。
59)里氏代換原則:假設(shè)有兩個(gè)類,一個(gè)是基類Base,一個(gè)是派生類
Derived,如果一個(gè)方法可以接受基類對(duì)象b的話:methcdl(Baseb),
同樣,這個(gè)方法也應(yīng)該接受派生類Derived的對(duì)象d,而不影響方法的行
為。里氏代換原則是繼承復(fù)用的基石。
60)抽象依賴原則(穩(wěn)定依賴原則)。應(yīng)該依賴于抽象而不依賴與具體類,抽
象的類和接口是穩(wěn)定的,而具體類是易變的,如果依賴于具體類,代碼就會(huì)
非常脆弱,失去了靈活性。
61)接口隔離原則,一個(gè)類對(duì)另外一個(gè)類的依賴應(yīng)該建立在最小的接口之上
的。
62)單一職責(zé)原則,如果一個(gè)類有多于一種的職責(zé),當(dāng)需求變化時(shí),類的職
貢就要發(fā)生變化,而囚此就會(huì)引起引用該類的代碼發(fā)生改變,職貢越多,這
個(gè)類就容易跟更多的類產(chǎn)生耦合關(guān)系,而且改變一個(gè)職責(zé),可能會(huì)影響到另
外一個(gè)職責(zé)的履行。
63)編寫(xiě)代碼前,先編寫(xiě)注釋(可以認(rèn)為是偽代碼),先想后寫(xiě)。
/★★
*報(bào)表構(gòu)建器,主要職責(zé):
*1.創(chuàng)建拷貝報(bào)表模版
*2.填充報(bào)表數(shù)據(jù)
*3.構(gòu)建報(bào)表
*4.畫(huà)圖處理
★/
通過(guò)編寫(xiě)這些偽代碼,可以起到理清思路的作用,這時(shí)候再編寫(xiě)代碼,過(guò)程
就非常流暢了,不會(huì)編一會(huì)兒,想一會(huì)兒,刪掉代碼,再重新編。
第7章設(shè)計(jì)模式快速參考
本章描述常見(jiàn)的設(shè)計(jì)模式。描述主要由兩部分組成,一部分是模式代碼,一
部分時(shí)調(diào)用示例。
7.1工廠模式
7.1.1簡(jiǎn)單工廠
abstractclassFruit{
classAppleextendsFruit{
i
classOrangeextendsFruit{
classFruitFactory{
pulicstaticFruitgetFruit(StringfruitType){
if(''apple"==fruitType){
returnnewApple();
)elseif(''orange"==fruitType){
returnnewOrange();
Client:
Appleapple=FruitFactory.getFruit(''apple,/);
7.1.2工廠方法
interfaceIFruitFactory{
publicFruitgetFruit();
classAppleFactoryimplementsIFruitFactory{
publicFruitgetFruit(){
//生產(chǎn)蘋(píng)果
returnnewApple();
}
}
Client:
IFruitFactoryfactory=newAppleFactory();
Fruitfruit=newfactory.getFruit();
7.2單例模式
classSingleton{
privatestaticSingletonsingleton=null;
publicstaticSingletongetlnstance(){
if(null==singleton){
singleton=newSingleton();
)
returnsingleton;
)
publicStringotherOperation(){
//方法實(shí)現(xiàn)
Client:
Stringstr=Singleton.getlnstance().otherOperation();
多線程時(shí)使用double-check模式確保線程安全:
classSingleton{
privatestaticSingletonsingleton=null;
publicstaticSingletongetlnstance(){
if(null==singleton)
sychronized(Singleton.class){
if(null==singleton){
singleton=newSingleton();
}
j
returnsingleton;
7.3適配器模式
interfacePowerable{
llOvprovide();
I
classllOv{
}
class220v{
}
classHOvPowerimplementsPowerable{
publicllOvprovide(){
//提供llOv電壓
class220vPower{
public220vprovide(){
//提供220v電壓
class220vAdapterimplementsPowerable{
publicllOvprovide(){
llOvvoltage=null;
220vPowerpower=new220vPower();
〃轉(zhuǎn)換過(guò)程,@!@#$%人
returnvoltage;
Client:
Powerableprovider=new220vAdapter();
vide();
7.4組合模式
abstractclassHardware{
classMainboardextendsHardware{
classMemoryextendsHardware{
classDisplayextendsHardware(
classNetworkAdapterextendsHardware{
i
classComputerextendsHardware[
privateListparts=newArraylist();
publicListadd(Hardwarehardware){
parts.add(hardware);
returnparts;
Client:
Computercomputer=newComputer();
Mainboardmainboard=newMainboard();
NetworkAdapternetworkAdapter=newNetworkAdapter();
Displaydisplay=newDisplay();
Memorymemory=newMemory();
computer.add(mainboad)
.add(networkAdapter)
.add(display)
.add(memory);
7.5外觀模式
為一組類提供簡(jiǎn)單的外部接口,使外部調(diào)用者不需要和所有內(nèi)部干系人打交
道,就能讓調(diào)用者滿意。
classCallCenter{
publicvoidsolve(Customercustomer){
//接受客戶提出的問(wèn)題
operator.acceptProblem(customer.getProblem());
booleancanSolved=operator.solve();
if(!canSolved){
//如果不能解決,則請(qǐng)求其它人幫助。
operator.askHelp();
classCustomer{
publicvoidcall(CallCentercallCenter){
callCenter.solve(this);
)
classOperator{
i
Client:
CallCentercallCen二er=newCallCenter();
CustomaCustomer=newCustomer();
aCustomer.call(callCenter);
這里對(duì)客戶來(lái)講,與他接觸的只有一個(gè)接口,就是接線員,最后的結(jié)果
是解決他的問(wèn)題。接線員可以直接解決,如果他不能解決,它可以選擇請(qǐng)求
其它人的幫助去解決這個(gè)問(wèn)題??蛻羰遣魂P(guān)心接線員在內(nèi)部做了什么。
7.6代理模式
classFileDownloader(
publicdownload(Filefile);
}
classFile{
}
//一般代理類使用Proxy后綴
classFileDownloaderProxy{
FileDownloaderProxy(FileDownloaderdownloader){
this.downloader=downloader;
)
privateFileDownloaderdownloader;
publicdownload(Filefile){
//這里可以添加通知,通知用戶開(kāi)始下載文件
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鍍鋅層鈍化劑行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)鉛酸蓄電池行業(yè)市場(chǎng)現(xiàn)狀分析規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)針織服裝市場(chǎng)市場(chǎng)運(yùn)行動(dòng)態(tài)及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)酮洛芬腸溶膠囊行業(yè)十三五規(guī)劃與發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)艾灸養(yǎng)生儀產(chǎn)業(yè)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)美甲行業(yè)運(yùn)行現(xiàn)狀及發(fā)展前景分析報(bào)告
- 2025年四川省建筑安全員C證考試(專職安全員)題庫(kù)及答案
- 皖北衛(wèi)生職業(yè)學(xué)院《時(shí)間序列分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 中央財(cái)經(jīng)大學(xué)《商務(wù)智能》2023-2024學(xué)年第二學(xué)期期末試卷
- 天府新區(qū)航空旅游職業(yè)學(xué)院《廣播影視廣告設(shè)計(jì)與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 腫瘤患者特殊醫(yī)學(xué)用途配方食品使用指南
- 幼兒看圖填數(shù)
- 酒店項(xiàng)目精裝修工程施工組織設(shè)計(jì)
- 小學(xué)生研學(xué)旅行展示ppt模板
- 《思想道德與法治》第一章
- 新概念英語(yǔ)第2冊(cè)課文word版
- 大學(xué)生職業(yè)生涯規(guī)劃(高職)PPT完整全套教學(xué)課件
- 微信小程序開(kāi)發(fā)實(shí)戰(zhàn)(第2版)全套PPT完整教學(xué)課件
- 部編版語(yǔ)文四年級(jí)下冊(cè)全冊(cè)大單元整體作業(yè)設(shè)計(jì)
- 重慶自然博物館
- 收養(yǎng)人撫養(yǎng)教育被收養(yǎng)人能力的證明
評(píng)論
0/150
提交評(píng)論