第6章 軟件設計目標_第1頁
第6章 軟件設計目標_第2頁
第6章 軟件設計目標_第3頁
第6章 軟件設計目標_第4頁
第6章 軟件設計目標_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章軟件設計目標《軟件體系結構與設計實用教程》第二版6.1概述基本概念正確性指設計符合需求,代碼按照要求執(zhí)行。通常對給定的需求可能有多種正確的設計。如果在出現(xiàn)錯誤時應用程序也能執(zhí)行,那么設計是具有健壯性的;錯誤的種類有很多,用戶在操作應用程序時會出現(xiàn)一些錯誤,軟件開發(fā)者在設計和編碼時也會犯一些錯誤一個可維護性的設計意味著可以很容易地對其進行修改可復用性是指可以將其方便地移植到其他應用中。高效性有兩個方面——時間效率和空間效率。實例與分析用Java實現(xiàn)一個計算器控制臺程序,輸入兩個數(shù),相除得到結果。importjava.io.*;classCommandLineCalculator{publicstaticvoidmain(String[]args)throwsIOException{BufferedReaderb=newBufferedReader(newInputStreamReader(System.in));System.out.println("請輸入數(shù)字A:");

StringA=b.readLine();

//輸入錯誤怎么辦?

System.out.println("請輸入數(shù)字B:");

StringB=b.readLine();

intC=(newInteger(A)).intValue()/(newInteger(B)).intValue();

//B=0怎么辦?System.out.println("結果是:"+C);}}實例與分析分析一下實現(xiàn)方法的特點和需要考慮的問題。首先,要求的功能實現(xiàn)了,所以正確性是滿足的。其次,假如用戶輸入出錯,系統(tǒng)將崩潰或出現(xiàn)不可預知的結果,所以健壯性存在問題。第三,Calculator類是專門為特殊的問題制定的,所以不能作為整體復用。所以,可復用性存在問題。第五,要修改Calculator類比較困難。加一個減法功能,會發(fā)現(xiàn)增加功能需要修改原來的類,這就違背了開-閉原則。所以可維護性存在問題。第四,執(zhí)行速度怎樣?需要多少內存?這是高效性的問題。應用程序要在真實的計算機上運行,并且被人們使用。而計算機的內存是有限的,同時用戶也不愿意長時間等待應用程序完成操作。本程序較簡單,可不考慮這方面的內容。6.2健壯性健壯性如果設計或實現(xiàn)能處理各種各樣的異常情況,比如數(shù)據(jù)錯誤、用戶錯誤、環(huán)境條件,那么這個設計是健壯的。為了提高健壯性,需要防止錯誤輸入,包括用戶輸入,數(shù)據(jù)通信、其他應用程序的方法調用等非用戶的輸入;還要防止開發(fā)錯誤,包括錯誤的設計和錯誤的實現(xiàn)。上小節(jié)程序的一種執(zhí)行結果如下:請輸入數(shù)字A:12請輸入數(shù)字B:2結果是:6B=0時的執(zhí)行結果如下,程序出錯:請輸入數(shù)字A:12請輸入數(shù)字B:0Exceptioninthread"main"java.lang.ArithmeticException:/byzeroatCalculator.main(Calculator.java:9)修改CommandLineCalculator類的代碼,可使其更健壯。(1)除數(shù)不能為0if(intNumberB!=0)intResult=intNumberA/intNumberB;else{System.out.println("除數(shù)不能為0");

System.exit(0);}(2)當用戶輸入不合理的整型數(shù)據(jù),甚至不是整型而是字符串型的數(shù)據(jù)時,程序提示用戶再次輸入,程序仍然能夠繼續(xù)執(zhí)行,得到健壯的交互方式。下面的程序具有了一定的健壯性。importjava.io.*;importjava.util.*;classCommandLineCalculator{privateintaccumulatedValue=0;publicCommandLineCalculator(){super();}privatestaticStringgetAnInputFromUser(){ try{ BufferedReaderb=newBufferedReader(newInputStreamReader(System.in)); return(b.readLine());}catch(IOExceptione){System.out.println(e+"Inputtakentobeasingleblank.");return"";}}publicstaticvoidmain(String[]args){System.out.print("請輸入數(shù)字A:");StringA=getAnInputFromUser();System.out.print("請輸入數(shù)字B:");StringB=getAnInputFromUser();intamountAdded=0;while(!A.equals("stop")&!B.equals("stop")){ try{ inta=(newInteger(A)).intValue();//不是整數(shù)時出錯

intb=(newInteger(B)).intValue();//不是整數(shù)時出錯

intc=a/b;//b=0時出錯System.out.println("結果是:"+c);}catch(Exceptione){//輸入的不是整數(shù)System.out.println("Sorry--incorrectentry:Tryagain.");}

System.out.print("請輸入數(shù)字A:");A=getAnInputFromUser();System.out.print("請輸入數(shù)字B:");B=getAnInputFromUser();}System.out.println("Applicationends.");}}程序執(zhí)行結果如下:請輸入數(shù)字A:12請輸入數(shù)字B:0Sorry--incorrectentry:Tryagain.請輸入數(shù)字A:12請輸入數(shù)字B:6結果是:2請輸入數(shù)字A:12請輸入數(shù)字B:stopApplicationends.上面的代碼比較健壯了。如果這個應用程序通過周期性地將數(shù)據(jù)保存到文件以避免應用和系統(tǒng)出現(xiàn)錯誤,那么程序將會更加健壯。如果以速度為代價,將數(shù)據(jù)發(fā)送到遠端的存儲器,那么還可以增加健壯性。但是,上述程序只滿足了當前的需求,程序不容易維護,不容易擴展,更不容易復用。從而達不到高質量代碼的要求。6.3高效性高效性高效性(效率問題)的目標是利用可用的內存,盡可能快地完成工作。利用可用的機器時間周期和內存,應用程序必須在指定的時間內完成特定的功能。同樣,對內存容量(RAM或硬盤空間)也有一定的要求。執(zhí)行效率應用程序必須在指定的時間內完成特定的功能。航天控制系統(tǒng)等實時系統(tǒng)對執(zhí)行速度要求最高,它要求在微秒級甚至更短的固定時間內完成所需的功能。對于非實時系統(tǒng),執(zhí)行速度也很重要。無論設計多么出色的應用程序,如果不能及時完成操作,用戶會很快失去耐心。例如,如果網頁打開過慢,那么等其完全打開時,用戶早就不再關注它了??梢詮倪h程調用、循環(huán)、函數(shù)調用、對象創(chuàng)建等方面提高執(zhí)行效率。(1)處理循環(huán)問題很多算法分析(例如排序算法分析)就是計算相關的平均時間或最差情況下的時間。嵌套循環(huán)常常是算法分析的重點。如果外部循環(huán)執(zhí)行10000次,而且內部還含有執(zhí)行10000次的循環(huán),那么整個內部操作完成了難以置信的十億次(為兩者乘積)循環(huán)。(2)消除遠程調用一個通過本地網絡或Internet進行的遠程調用肯定會消耗大量的時間。遠程調用操作花費的時間與下面因素有關網絡的性能調用的頻率每次調用取回的信息量(數(shù)據(jù)量)避免BobSchudy曾經指出,可以在后臺運行一個線程來獲取數(shù)據(jù)。這基于在進行操作時只有一部分的CPU被占用,因而可利用空閑的時鐘周期來對數(shù)據(jù)進行預取。即使一些數(shù)據(jù)不會使用,這種預取處理也將進行。Proxy(代理)設計模式可以避免不必要的函數(shù)調用,常用于連接對遠程函數(shù)的調用(3)消除或制定函數(shù)調用函數(shù)調用的好處很大,但降低了時間效率,特別是在循環(huán)語句中對函數(shù)進行調用。例如,如下循環(huán):

for(i=0;i<1000;++i)doFunctionCall(i);看上去沒問題,但它掩飾了可能隱含的內部循環(huán)(會對效率產生影響),這完全依靠doFunctionCall()是如何實現(xiàn)的。消除函數(shù)調用會提高代碼效率但降低了可讀性。因為減少函數(shù)調用,會產生大量的方法和類,難于擴展和復用。存儲效率應用程序需要存儲數(shù)據(jù),以備將來在執(zhí)行時提取。這需要對存儲數(shù)據(jù)的空間進行有效的利用。至少有三種存儲問題:RAM的大小(運行時)、代碼本身規(guī)模和輔助存儲器(通常指磁盤驅動)的大小。數(shù)據(jù)存儲方面的技術(獲得存儲效率)。(1)只存儲需要的數(shù)據(jù)(在存儲效率與數(shù)據(jù)提取及重整時間之間獲得折中);(2)壓縮數(shù)據(jù)(在存儲效率與數(shù)據(jù)壓縮及解壓縮時間之間獲得折中);(3)按相關訪問頻率存儲數(shù)據(jù)(在存儲效率與決定存儲位置的時間之間獲得折中)設計效率從簡易性方面的考慮,使用便捷的工具和語言會節(jié)約大量的設計時間,但程序員也失去了對這種系統(tǒng)使用的時空方面的控制。例如,為了方便程序員,數(shù)據(jù)庫管理系統(tǒng)提供了大量的內置功能。但在早期軍事計算中,數(shù)據(jù)庫管理系統(tǒng)很少使用,原因就是缺少對時空效率方面的控制。隨著數(shù)據(jù)庫管理系統(tǒng)的發(fā)展,這種情況發(fā)生了改變,允許使用更多已有的工具。如果考慮源代碼的大小方面的因素,在降低開發(fā)、維護的成本的同時也會犧牲時空效率。高效性高效性有時和其他目標相矛盾,要考慮可維護性、可復用性、健壯性和正確性對高效性的影響。下面總結了兩個有效設計的基本方法(針對時間效率的基本方法)。先按其他原則設計,以可維護性、可復用性等原則進行設計,再考慮效率問題,找出效率低的部分,有針對性地修改。一開始就按效率原則進行設計。確認當前關鍵的效率需求,在整個階段都按需求進行設計還可以是以上兩種方法的結合,在整個過程中都綜合考慮高效性和其他目標,必要時折中考慮。6.4可復用性

基本概念一個好的設計應該易于修改和復用,這就需要考慮可維護性和復用性,本小節(jié)討論復用性,下小節(jié)討論可維護性。復用(或者叫重用,Reuse)一個軟件的組成部分,可以在同一個項目的不同地方甚至另一個項目中重復使用。一種降低成本、獲得最大生產率的方法是利用原有的工作,也就是復用。JavaAPI的應用就是復用的一個典型例子,JavaAPI就是可復用的類集合。復用的實現(xiàn)多個方面實現(xiàn)復用代碼類相關類的聚合(例如:java.awt包)類聚合模式——設計模式組件框架軟件體系結構…類的復用對于一個已經設計好的類,可以使用繼承、聚合、依賴等技術實現(xiàn)復用。具體說,將新創(chuàng)建類直接說明為已經設計好的類(父類)的子類,通過繼承和修改父類的屬性與行為完成新創(chuàng)建類的定義;或者,在新創(chuàng)建類中引進已經設計好的類的對象作為新創(chuàng)建類的成員變量,然后在新創(chuàng)建類中通過成員變量復用已經設計好的類的屬性和方法;或者,在新創(chuàng)建類中引進已經設計好的類的對象,作為新創(chuàng)建類中的方法的參數(shù)或返回類型。原始類已經設計好的類——原始的Customer類。classCustomer{Customer(){}

intCompute(){inti=0;//……returni;}//……}利用繼承實現(xiàn)復用classSubCustomerextendsCustomer{SubCustomer(){}intComputeSub(){intbaseAmount;//……baseAmount=Compute(); //調用父類方法實現(xiàn)復用returnbaseAmount;}//……}利用聚合實現(xiàn)復用classObjCustomer{Customercustomer=newCustomer();//創(chuàng)建Customer類的對象作為類的成員變量//……ObjCustomer(){}intComputeObj(){//使用Customer類的對象實現(xiàn)復用intamount=customer.Compute();//……return0;}}利用依賴實現(xiàn)復用(一)classCustomerOper{

//……booleaninsert(Customercustomer){

//使用Customer類的對象作為成員方法的參數(shù)intamount=customer.Compute();//使用Customer類的對象實現(xiàn)復用

//……returntrue;

}

//……}

利用依賴實現(xiàn)復用(二)classCreateCustomer{

//……CustomerloadCustomer(){

Customercustomer=newCustomer();//創(chuàng)建Customer類的對象//……returncustomer;

//返回Customer類的對象}

//……}可以通過減少類的耦合來增加復用性。如果類A與類B耦合,沒有類B就不可以使用類A,這降低了類A的復用性。使用中介者(Mediator)設計模式會減少這種耦合。6.5可維護性基本概念軟件工程領域最大的挑戰(zhàn)之一就是當應用程序已經做完的時候需求又改變了;當已經決定如何去做的時候,應用程序的目標卻變化了。無論如何完善軟件需求分析,需求仍然會在項目開發(fā)過程中發(fā)生變化。設計開始后最好能阻止客戶改變需求,但這常常又不太可能。所以,軟件設計要具有可維護性,在設計中通常要考慮到將來的變化。1.基于面向對象技術的計算器程序業(yè)務邏輯與界面邏輯分開對于前面的計算器的例子,如果分一個類出來,讓計算和顯示分開,也就是讓業(yè)務邏輯與界面邏輯分開,這樣它們之間的耦合度就下降了,容易維護或擴展。classOperation{//Operation運算類

publicintgetResult(intnumberA,intnumberB){intresult=0;if(numberB!=0)result=numberA/numberB;returnresult;}}客戶端代碼如下。importjava.io.*;classclient{publicstaticvoidmain(String[]args){intintNumberA=0,intNumberB=0;try{BufferedReaderbufR=newBufferedReader(newInputStreamReader(System.in));System.out.print("請輸入數(shù)字A:");try{intNumberA=newInteger(bufR.readLine()).intValue();}catch(Exceptione){ System.out.println(e); System.exit(0); }System.out.print("請輸入數(shù)字B:");try{intNumberB=newInteger(bufR.readLine()).intValue();}catch(Exceptione){

System.out.println(e); System.exit(0);

}intintResult=0;intResult=newOperation().getResult(intNumberA,intNumberB);System.out.println("結果是:"+intResult);}catch(Exceptione){System.out.println(e);}}}程序執(zhí)行結果為:請輸入數(shù)字A:12請輸入數(shù)字B:6結果是:2面向對象三大特性是封裝、繼承和多態(tài),這里用到的是封裝。優(yōu)點上面的代碼就完全把業(yè)務和界面分離了。如果要修改界面那就去改界面程序,與運算無關?,F(xiàn)在要寫一個Windows界面的計算器應用程序,就可以復用這個Operation運算類了。Web版程序需要也可以用它,PDA、手機等移動系統(tǒng)的軟件也可以用它。缺點如果希望增加加法運算,只能改Operation類。加一個加法運算,已經寫好的除法運算也得來參與編譯,很難避免不小心把除法運算改成了減法。本來是加一個功能,卻使得原有的運行良好的功能代碼產生了變化。應該把加減乘除等運算分離,修改其中一個不影響另外的幾個,增加運算算法也不影響其他代碼。這就要用到繼承和多態(tài)。2.基于簡單工廠模式的計算器程序對于前面的計算器程序,為滿足可維護性,考慮重構程序,增加一個抽象的運算類。通過繼承、多態(tài)等面向對象手段,隔離具體加法、減法與客戶端的耦合。這樣,需求仍然可以滿足,還能應對變化。如果再要增加乘法、除法的功能,就不需要去更改加法、減法的類,而是增加乘法和除法子類就可。即面對需求,對程序的改動是通過增加新代碼進行的,而不改變現(xiàn)有的代碼。這就滿足了開-封原則(對擴展開放,對修改關閉)。運算類interfaceOperation{publicintgetResult(intnumberA,intnumberB);}classOperationAddimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA+numberB;}}classOperationDivimplementsOperation{publicintgetResult(intnumberA,intnumberB){intresult=0;if(numberB!=0)result=numberA/numberB;else{System.out.println("除數(shù)不能為0。");System.exit(0);}returnresult;}}classOperationSubimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA-numberB;}}classOperationMulimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA*numberB;}}運算接口中定義了getResult()方法用于得到結果,它有兩個參數(shù)用于計算器的操作數(shù)。加減乘除類都實現(xiàn)了運算接口,重寫了getResult()方法,這樣修改任何一個算法,都不需要提供其他算法的代碼。但是,現(xiàn)在的問題是如何確定使用加減乘除中哪一個類?,F(xiàn)在的問題是如何實例化對象,到底實例化誰,將來會不會增加實例化的對象,比如增加求M的N次方的運算,這是很容易變化的地方??梢钥紤]用一個單獨的類來做這個創(chuàng)造實例的過程,這就是工廠。簡單運算工廠類如下。classOperationFactory{publicOperationcreateOperate(charoperate){Operationoper=null;switch(operate){case'+':oper=newOperationAdd();break;case'-':oper=newOperationSub();break;case'*':oper=newOperationMul();break;case'/':oper=newOperationDiv();break;}returnoper;}}客戶端客戶端代碼如下:classclientSimpleFactory{publicstaticvoidmain(String[]args){Operationoper;

oper=newOperationFactory().createOperate('+');intresult=oper.getResult(1,2);System.out.println("result="+result);}}這樣只需輸入運算符號,工廠就實例化出合適的對象,通過多態(tài)返回父類的方式實現(xiàn)了計算器結果。命令行客戶端代碼如下:importjava.io.*;classclientSimpleFactory{publicstaticvoidmain(String[]args){intintNumberA=0,intNumberB=0;try{BufferedReaderbufR=newBufferedReader(newInputStreamReader(System.in));System.out.print("請輸入數(shù)字A:");try{intNumberA=newInteger(bufR.readLine()).intValue();}catch(Exceptione){System.out.println(e);System.exit(0);}System.out.print("請輸入數(shù)字B:");try{intNumberB=newInteger(bufR.readLine()).intValue();}catch(Exceptione){System.out.println(e);System.exit(0);}Operationoper=newOperationFactory().createOperate('+'); intresult=oper.getResult(intNumberA,intNumberB); System.out.println("result="+result);}catch(Exceptione){System.out.println(e);}}}程序的執(zhí)行結果如下:

請輸入數(shù)字A:12請輸入數(shù)字B:3result=15簡單工廠模式實現(xiàn)計算器程序優(yōu)點不管控制臺程序,Windows程序,Web程序,PDA還是手機程序,都可以用這段代碼來實現(xiàn)計算器的功能。如果需要更改加法運算,只改OperationAdd就可以了如果需要增加其他運算,比如M的N次方,平方根,立方根,自然對數(shù),正弦余弦等,只要增加相應的運算子類就可以了。缺點還需要去修改運算類工廠,在switch中增加分支。3.基于工廠方法模式的計算器程序在簡單工廠里,如果現(xiàn)在需要增加其他運算,比如要加一個“求M的N次方”的功能,要先增加“求M的N次方”的功能類,再更改工廠方法。這需要給運算工廠類的方法里加“Case”的分支條件來做判斷。這實際上是修改了原有的類,不但對擴展開放了,對修改也開放了,這樣就違背了開放-封閉原則。采用工廠方法模式可以解決這個問題。工廠方法(FactoryMethod)模式定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法模式實現(xiàn)計算器程序工廠類先構建一個工廠接口。interfaceIFactory{ OperationCreateOperation();}工廠類然后加減乘除各建一個具體工廠去實現(xiàn)這個接口classAddFactoryimplementsIFactory{publicOperationCreateOperation(){returnnewOperationAdd();}}classSubFactoryimplementsIFactory{publicOperationCreateOperation(){returnnewOperationSub();}}工廠類classMlFactoryimplementsIFactory{publicOperationCreateOperation(){ returnnewOperationMul(); }}classDivFactoryimplementsIFactory{publicOperationCreateOperation(){returnnewOperationDiv();}}運算類-不變interfaceOperation{publicintgetResult(intnumberA,intnumberB);}classOperationAddimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA+numberB;}}運算類-不變classOperationDivimplementsOperation{publicintgetResult(intnumberA,intnumberB){intresult=0;if(numberB!=0)result=numberA/numberB;else{System.out.println("除數(shù)不能為0。");System.exit(0);}returnresult;}}運算類-不變classOperationSubimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA-numberB;}}classOperationMulimplementsOperation{publicintgetResult(intnumberA,intnumberB){returnnumberA*numberB;}}客戶端客戶端代碼如下:classclientSimpleFactory{publicstaticvoidmain(String[]args){IFactoryoperFactory=newAddFactory();Operationoper=operFactory.CreateOperation();intresult=oper.getResult(intNumberA,intNumberB);System.out.println("result="+result);}}命令行客戶端代碼如下:importjava.io.*;classclientFactoryMethod{publicstaticvoidmain(String[]args){intintNumberA=0,intNumberB=0;try{BufferedReaderbufR=newBufferedReader(newInputStreamReader(System.in));System.out.print("請輸入數(shù)字A:");try{intNumberA=newInteger(bufR.readLine()).intValue();}catch(Exceptione){System.out.print(e);System.exit(0);}

System.out.print("請輸入數(shù)字B:");try{intNumberB=newInteger(bufR.readLine()).intValue();}catch(Exceptione){

System.out.println(e);System.exit(0);

}IFactoryoperFactory=newAddFactory();Operationoper=operFactory.CreateOperation();intresult=oper.getResult(intNumberA,intNumberB);System.out.println("result="+result);}catch(Exceptione){System.out.println(e);}}}程序的執(zhí)行結果如下:請輸入數(shù)字A:12請輸入數(shù)字B:3result=15工廠類根據(jù)依賴倒轉原則,把工廠類抽象出一個接口,這個接口只有一個方法——創(chuàng)建抽象產品的工廠方法。然后,所有要生產具體類的工廠,實現(xiàn)這個接口。這樣,一個簡單工廠模式的工廠類,變成了一個工廠抽象接口和多個具體生成對象的工廠。要增加“求M的N次方”的功能時,只需要增加此功能的運算類和相應的工廠類,不需要更改原有的工廠類了。這樣沒有了修改的變化,只是擴展的變化,完全符合了開-閉原則的精神??蛻舳斯S方法模式實現(xiàn)時,客戶端需要決定實例化哪一個工廠來實現(xiàn)運算類,還是存在選擇判斷。也就是說,工廠方法模式把簡單工廠模式的內部邏輯判斷移到了客戶端代碼來進行。要增加功能,本來是改工廠類的,而現(xiàn)在是修改客戶端。但是一般情況下,修改客戶端的時候,修改的工作量也很小,比起簡單工廠模式也少得多。工廠方法模式是簡單工廠模式的進一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡單工廠模式封裝對象創(chuàng)建過程的優(yōu)點,克服了它違背開-封原則的缺點。集中封裝對象的創(chuàng)建,不需要做大的改動就可更換對象,降低了客戶程序與產品對象的耦合。但工廠方法模式的缺點是由于每加一個產品,就需要加一個產品工廠的類,增加了很多類和方法,增加了額外的開發(fā)量和復雜性。6.6可維護性復用6.6.1可維護性復用的概念通常認為,一個可維護性較好的系統(tǒng),就是復用率較高的系統(tǒng);而一個可復用性好的系統(tǒng),就是一個可維護性好的系統(tǒng)。但是實際上,可維護性和可復用性是兩個獨立的目標。對于面向對象的軟件系統(tǒng)設計來說,在支持可維護性(Maintainability)的同時,提高系統(tǒng)的可復用性(Reuseability)是一個核心的問題??删S護性復用是指在支持可維護性的同時,提高系統(tǒng)的可復用性。傳統(tǒng)的復用(1)代碼的剪貼復用雖然代碼的剪貼復用比完全沒有復用好一些,但是代碼的剪貼復用在具體實施時,要冒著產生錯誤的風險。復用所能節(jié)省的初期投資十分有限。(2)算法的復用:各種算法比如排序算法得到了大量的研究。應用程序編程時通常不會建立自己的排序算法,而是在得到了很好的研究的各種算法中選擇一個。(3)數(shù)據(jù)結構的復用:隊列、列表等數(shù)據(jù)結構得到了十分透徹的研究,可以方便地拿過來使用??删S護性與復用的關系傳統(tǒng)復用的缺陷就是復用常常是以破壞可維護性為代價的。比如兩個模塊A和B同時使用另一個模塊C中的功能。那么當A需要C增加一個新的行為的時候,B有可能不需要、甚至不允許C增加這個新行為。如果堅持使用復用,就不得不以系統(tǒng)的可維護性為代價;而如果從保持系統(tǒng)的可維護性出發(fā),就只好放棄復用??删S護性與可復用性是有共同性的兩個獨立特性因此,重要的是支持可維護性的復用,也就是在保持甚至提高系統(tǒng)的可維護性的同時,實現(xiàn)系統(tǒng)的復用。面向對象設計的復用面向對象的語言(例如Java語言)中,數(shù)據(jù)的抽象化、繼承、封裝和多態(tài)性等語言特性使得一個系統(tǒng)可在更高的層次上提供可復用性。數(shù)據(jù)的抽象化和繼承關系使得概念和定義可以復用多態(tài)性使得實現(xiàn)和應用可以復用而抽象化和封裝可以保持和促進系統(tǒng)的可維護性復用的焦點不再集中在函數(shù)和算法等具體實現(xiàn)細節(jié)上而是集中在最重要的含有宏觀商業(yè)邏輯的抽象層次上。抽象層次的復用是在提高復用性的同時保持和提高可維護性的關鍵。在面向對象的設計中,可維護性復用是以設計原則和設計模式為基礎的。6.6.2可維護性復用與設計原則設計原則是提高一個系統(tǒng)可維護性的同時,提高這個系統(tǒng)的可復用性的指導原則遵循這些設計原則可以有效地提高系統(tǒng)的復用性,同時提高系統(tǒng)的可維護性。設計原則“開-閉”原則里氏代換原則依賴倒轉原則組合聚合復用原則單一職責原則迪米特法則接口隔離原則……設計原則常用的面向對象設計原則包括7個,這些原則并不是孤立存在的,它們相互依賴,相互補充。設計原則6.6.3可維護性復用與設計模式設計模式三大類別,主要有23個。創(chuàng)建模式結構模式行為模式設計模式本身并不能保證一個系統(tǒng)的可復用性和可維護性,但是設計師運用設計模式的思想設計系統(tǒng)可以提高系統(tǒng)設計的復用性和可維護性。設計模式的思想有助于提高設計師的設計風格、設計水平,并促進同行之間的溝通。設計模式的誕生與發(fā)展模式的誕生與定義Alexander給出了關于模式的經典定義:每個模式都描述了一個在我們的環(huán)境中不斷出現(xiàn)的問題,然后描述了該問題的解決方案的核心,通過這種方式,我們可以無數(shù)次地重用那些已有的解決方案,無需再重復相同的工作。模式是在特定環(huán)境中解決問題的一種方案設計模式的誕生與發(fā)展設計模式的發(fā)展

1987年,KentBeck和WardCunningham借鑒Alexander的模式思想在程序開發(fā)中開始應用一些模式,在OOPSLA會議上發(fā)表了他們的成果。1990年,OOPSLA與ECOOP聯(lián)合舉辦,ErichGamma和RichardHelm等人開始討論有關模式的話題(BruceAnderson主持),“四人組”正式成立,并開始著手進行設計模式的分類整理工作。1991年,OOPSLA,BruceAnderson主持了首次針對設計模式的研討會。1992年,OOPSLA,Anderson再度主持研討會,模式已經逐漸成為人們討論的話題。注:OOPSLA(Object-OrientedProgramming,Systems,Languages&Applications,面向對象編程、系統(tǒng)、語言和應用大會),編程語言及軟件工程國際頂級會議,2010年改為SPLASH---Systems,Programming,LanguagesandApplications:SoftwareforHumanity設計模式的誕生與發(fā)展設計模式的發(fā)展1993年,KentBeck和GradyBooch贊助了第一次關于設計模式的會議,這個設計模式研究組織發(fā)展成為著名的HillsideGroup研究組。1994年,由HillsideGroup發(fā)起,在美國伊利諾伊州(Illinois)的AllertonPark召開了第1屆關于面向對象模式的世界性會議,名為PLoP(PatternLanguagesofPrograms,編程語言模式會議),簡稱PLoP‘94。1995年,PLoP‘95仍在伊利諾伊州的AllertonPark舉行,“四人組”出版了《設計模式:可復用面向對象軟件的基礎》(DesignPatterns:ElementsofReusableObject-OrientedSoftware)一書,本書成為1995年最搶手的面向對象書籍,也成為設計模式的經典書籍。設計模式的誕生與發(fā)展設計模式的發(fā)展從1995年至今,設計模式在軟件開發(fā)中得以廣泛應用,在Sun的JavaSE/JavaEE平臺和Microsoft的.net平臺設計中就應用了大量的設計模式。誕生了越來越多的與設計模式相關的書籍和網站,設計模式也作為一門獨立的課程或作為軟件體系結構等課程的重要組成部分出現(xiàn)在國內外研究生和大學教育的課堂上。設計模式的定義與分類設計模式的定義設計模式(DesignPattern)是一套被反復使用、多數(shù)人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式的定義與分類設計模式的基本要素設計模式一般有如下幾個基本要素:模式名稱、問題、目的、解決方案、效果、實例代碼和相關設計模式,其中的關鍵元素包括以下四個方面:模式名稱(Patternname)問題(Problem)解決方案(Solution)效果(Consequences)設計模式的定義與分類設計

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論