《軟件工程》 課件 第4章 面向對象思想與范型_第1頁
《軟件工程》 課件 第4章 面向對象思想與范型_第2頁
《軟件工程》 課件 第4章 面向對象思想與范型_第3頁
《軟件工程》 課件 第4章 面向對象思想與范型_第4頁
《軟件工程》 課件 第4章 面向對象思想與范型_第5頁
已閱讀5頁,還剩117頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

軟件工程第四章面向對象思想與范型4.1模塊4.1模塊計算機硬件系統的設計原則:模塊內部的交互程度最高模塊之間的交互程度最低5.1模塊軟件模塊是一個由聚合標識符所標識的、由邊界元素界定范圍的、詞匯上鄰接的程序語句序列。{、}、begin、end模塊內部的交互程度稱為內聚

Cohesion。模塊之間的交互程度稱之為耦合

Coupling。4.2內聚內聚Cohesion由低到高分為7個分類/級別:偶然性內聚邏輯性內聚時間性內聚過程性內聚通信性內聚功能性內聚信息性內聚低高1、偶然性內聚如果一個模塊執行多個完全不相關的操作,則該模塊具有偶然性內聚CoincidentalCohesion1、偶然性內聚2個嚴重的缺點:這樣的模塊極難讀懂、難以理解它到底要做什么;進而導致該模塊難調試、難修改、難維護、難升級。這樣的模塊根本不可能被其他軟件產品重用,因為不可能其他軟件產品“恰好”需要這樣一個做相同的雜事的模塊。1、偶然性內聚改進:將其分成更小的模塊,使每個模塊分別只執行一個操作2、邏輯性內聚當一個模塊進行一系列相關的操作,每個操作由調用模塊來選擇時,該模塊就具有邏輯性內聚LogicalCohesion。2、邏輯性內聚邏輯性內聚的模塊有三個問題:接口傳遞的數據和變量復雜,難以理解;增加了其與調用模塊之間的耦合度,邏輯性內聚模塊必然導致調用模塊與被調用模塊之間的控制耦合;完成多個操作的代碼互相交織在一起,導致嚴重的調試問題和維護問題。2、邏輯性內聚具有邏輯性內聚的模塊難讀、難懂、難調試、難重用。設計和開發人員應避免邏輯性內聚。3、時間性內聚如果一個模塊執行多個操作,這些操作出現在同一個模塊中的理由只是因為它們都要在同一個時間發生,則該模塊具有時間性內聚TemporalCohesion。典型的時間性內聚模塊有初始化模塊、終止模塊、異常處理模塊等。3、時間性內聚時間性內聚模塊也是難讀、難讀,不太可能在另一個產品中被重用。對時間性內聚要慎用。4、過程性內聚如果一個模塊執行一系列與要遵循的步驟順序相關的操作,也就是說這些操作必須按指定的過程執行,則該模塊具有過程性內聚ProceduralCohesion。4、過程性內聚4、過程性內聚過程性內聚比時間性內聚好些,因為模塊內的那些操作是過程關聯的。這樣的模塊被其他產品重用的可能性也不太大。5、通信性內聚如果一個模塊執行一系列與產品要遵循的步驟順序有關的操作,而且這些操作都在同一個數據結構上進行,或者各操作使用相同的輸入數據或者產生相同的輸出數據,則該模塊具有通信性內聚CommunicationalCohesion。5、通信性內聚6、功能性內聚如果一個模塊只執行一個操作或只達到單一目的,則該模塊具有功能性內聚FunctionalCohesion。例如模塊計算圓面積、計算圓周長、計算平均分、打印成績單、生成工資報表、計算利息等。6、功能性內聚功能性內聚模塊易讀、易懂,能夠隔離錯誤,易維護。功能性內聚模塊易擴充和升級。具有功能性內聚的模塊可以重用,而且機會非常大,因為其功能單一。一個經過設計和測試,并且文檔齊備的功能性內聚模塊對于軟件團隊來說是很有價值的,無論是經濟層面還是技術層面,都應該盡可能地重用良好的功能性內聚模塊。7、信息性內聚如果一個模塊進行多個操作,每個操作都有自己的入口點,每個操作的代碼相對獨立,且所有操作都基于相同的數據結構來完成,則該模塊具有信息性內聚InformationalCohesion。7、信息性內聚7、信息性內聚信息性內聚模塊可以用來實現一種抽象的數據類型,信息性內聚模塊可以得到實現抽象數據類型的所有優點。一個類就是一個具有信息性內聚的模塊,就是一個抽象數據類型abstractdatatype。小節低內聚模塊普遍存在著執行多個操作、難讀、難懂、難調試、難維護、難重用的問題,而信息性內聚和功能性內聚這樣的高內聚模塊成功地解決了低內聚模塊的問題。功能性內聚是結構化技術能做到的最好,信息性內聚是面向對象技術能做的最好。但無論是采用結構化技術還是面向對象技術,高內聚都是做軟件設計和實現所要追求的目標。歡迎學習《軟件工程》軟件工程第四章面向對象思想與范型4.3耦合4.3耦合模塊之間的耦合Coupling按照從強到弱分為5個級別:強弱內容耦合公共耦合控制耦合印記耦合數據耦合1、內容耦合如果兩個模塊中的一個直接引用了另一個模塊的內容,則它們之間就是內容耦合ContentCoupling。模塊由語句和數據構成,所謂訪問另一個模塊的內容,就是指訪問另一個模塊中的語句或數據。1、內容耦合例子1.在結構化系統中,把指向變量的指針作為參數傳遞,則調用模塊將不僅能夠獲得該變量的值,還能直接訪問該指針所指向的存儲單元,也就是說它可以直接重寫該存儲單元的數值。例子2.一個對象直接訪問另一個對象的屬性。1、內容耦合publicclassProduct{ publicfloatunitPrice; ……}publicclassOrder{ privateProductmyProduct; …... publicvoiddiscount(floatdiscountedPrice){

myProduct.unitPrice=discountedPrice; } …...}1、內容耦合內容耦合非常不好,因為這會造成很多問題和危險:必然造成兩個模塊的耦合度高,互相的交織和滲透較多,導致這兩個模塊的可讀性、可理解性差、可維護性差。模塊之間的高度耦合。必然導致模塊的獨立性差,可重用性差。模塊中的內容可以被直接訪問,能夠篡改或損壞系統中重要的數據,給計算機犯罪以可乘之機。1、內容耦合publicclassProduct{

privatefloatunitPrice; publicvoidsetUnitPrice(floatdiscountPrice){ unitPrice=discountPrice; }}publicclassOrder{ privateProductmyProduct; …... publicvoiddiscount(floatdiscountPrice){

myProduct.setUnitPrice(100.0); } …...}2、公共耦合如果兩個模塊都可以存取相同的全局數據,則它們之間是公共耦合,也稱為公共耦合CommonCoupling。2、公共耦合如某C語言開發的系統中模塊A和模塊B都直接訪問、讀寫某些全局變量,則模塊A和B之間具有公共耦合。再如Java或C++等面向對象語言中利用存取控制定義符public來定義公共數據,類似于全局變量。2、公共耦合問題和危險:(1)具有公共耦合的模塊的可讀性很差do{ ...... f1(); ...... f2(); ......}while(globalFlag<0||globalFlag>100)2、公共耦合問題和危險:(2)公共耦合的模塊很難維護(3)公共耦合的模塊很難重用(4)存在公共耦合的軟件系統的潛在危險很大盡量避免使用公共耦合慎用finalget*()和set*()3、控制耦合如果兩個模塊中的一個模塊向另一個模塊傳遞控制元素,則它們之間具有控制耦合ControlCoupling,即一個模塊明確地控制另一個模塊的邏輯。3、控制耦合3、控制耦合控制耦合導致被調用模塊模塊的邏輯性內聚。反之,邏輯性內聚的模塊必然導致與其調用模塊之間的控制耦合。應該盡量避免控制耦合。4、印記耦合一些編程語言支持模塊之間傳遞復雜的數據結構,如數據集合、記錄集等,如果被調用模塊只利用到傳遞的數據結構中的一部分數據,則這兩個模塊之間具有印記耦合StampCoupling。4、印記耦合printStudentNameList(ResultSetrsStudent){ ArrayListalStudent=newArrayList();

while(rsStudent.next()){

StringStudentName=

rsStudent.getString("StudentName");

alStudent.add(StudentName);

}}4、印記耦合傳遞的數據多于所需要,這將占用多于所必要的資源;接口復雜,難讀、難懂、難維護;如果預重用該模塊,那么就得向該模塊提供同樣的復雜的數據結構,這給重用造成很大的麻煩;多余的數據,將增加危險性;對于系統運行環境資源有限的情況,更要注意避免出現空間資源被不必要地占用的情況。設計和開發軟件時,應該盡量避免印記耦合。5、數據耦合如果兩個模塊之間傳遞的參數,無論是簡單數據類型還是復雜的數據結構,在被調用模塊中都被全部利用,則這兩個模塊之間具有數據耦合DataCoupling。數據耦合是低耦合,是最理想的情況,它克服了前面四種耦合的不足,既不會造成模塊之間過多的依賴性,也不會造成接口的復雜性,也不會造成過多數據的傳遞,這種模塊易讀、易懂、易維護、易重用。小節理想的低耦合,如數據耦合,模塊之間的接口簡單,所傳遞的參數數據在調研模塊中全部被使用,模塊有較強的獨立性,而且易讀、易懂、易維護、易重用。低耦合能夠促進模塊的高內聚,反之,高耦合則增加模塊之間的依賴程度,導致模塊的低內聚。因此低耦合應該是設計與實現軟件系統時所追求的。小節內聚與耦合是不能割離的兩個概念,它們息息相關,相輔相成。耦合必然對內聚產生影響,同樣,內聚也對耦合產生必然的影響:高內聚必然使低依賴性、低耦合成為可能,而低內聚必然導致高依賴性、高耦合。軟件系統的設計原則應該是高內聚且低耦合。小節

跟其他行業一樣,做軟件也要有工匠精神,要精益求精。只有這樣,才能保證我們做出來的軟件具有良好的質量,經得起考驗,才能夠為廣大用戶以及全社會提供優質可靠的軟件。歡迎學習《軟件工程》軟件工程第四章面向對象思想與范型4.4數據封裝4.4數據封裝圖書館管理信息系統,考慮其中的借書、還書、續借、和預約業務功能。4.4數據封裝3.4數據封裝m_Encapsulation成為一個抽象數據類型

abstractdatatype4.4數據封裝信息性內聚使數據封裝成為可能。利用面向對象語言中類的機制,就可以實現信息性內聚模塊。4.4數據封裝使用數據封裝設計軟件產品的優點體現在2個方面:1、數據封裝與開發數據封裝

抽象數據類型先高層次,然后低層次設計數據抽象、過程抽象

逐步求精2、數據封裝與維護改變將僅限于該方法的內部,使將來修改產品的影響最小化,數據封裝對程序易維護性、易修改性的提高非常有益處。publicclassBook{StringbookNo;//圖書編號StringbookStatus;//圖書狀態......voidborrow_book(){//借該圖書對象

bookStatus="已借出";

......//生成一條借書記錄

......//刪除一條預約記錄,如果有}voidreturn_book(){//還該圖書對象

bookStatus="在架可借";......//生成一條還書記錄}//續借該圖書對象voidrenew_book(){bookStatus="在架可借";......//生成一條續借記錄

}

//續借該圖書對象voidreserve_book(){

bookStatus="已預約";......//生成一條預約記錄

}}classOperation{

publicvoidoper(){

......

BookaBook;

......

aBook=......;

//獲取將被操作的圖書對象

aBook.borrow_book();

//借該圖書對象

......

aBook=......;

//獲取將被操作的圖書對象

aBook.return_book();

//還該圖書對象

......

aBook=......;

//獲取將被操作的圖書對象

aBook.renew_book();

//續借該圖書對象

......

aBook=......;

//獲取將被操作的圖書對象

aBook.reserve_book();

//預約該圖書對象

......

}}4.4數據封裝數據封裝對程序易維護性、易修改性的提高非常有益處。4.5信息隱藏publicclassBook{StringbookNo;//圖書編號StringbookStatus;//圖書狀態......voidborrow_book(){//借該圖書對象

bookStatus="已借出";

......//生成一條借書記錄

......//刪除一條預約記錄,如果有}voidreturn_book(){//還該圖書對象

bookStatus="在架可借";......//生成一條還書記錄}//續借該圖書對象voidrenew_book(){bookStatus="在架可借";......//生成一條續借記錄

}

//續借該圖書對象voidreserve_book(){

bookStatus="已預約";......//生成一條預約記錄

}}classOperation{publicvoidoper(){......BookaBook;

......aBook=......;//獲取將被操作的圖書對象

aBook.bookStatus=“已借出”;

//借該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.bookStatus=“在架可借”;//還該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.bookStatus=“已借出”;//續借該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.bookStatus=“已預約”;//預約該圖書對象

......}}

內容耦合可能的應用代碼面向對象語言提供了實現信息隱藏的機制,類內部的屬性以及方法的訪問控制可以有4種定義,其私有性從低到高為:publicprotecteddefaultprivate4.5信息隱藏publicclassBook{

privateStringbookNo;//圖書編號

privateStringbookName;//書名

privateStringauthor;//作者

privateStringpress;//出版社

privateStringpressYearMonth;//出版時間

privateStringISBN;//國際標準圖書編號

privatefloatunitPrice;//價格

privateStringbookStatus;//圖書狀態

......publicvoidborrow_book(){//借該圖書對象

bookStatus="已借出"; ......//生成一條借書記錄

......//刪除一條預約記錄,如果有}publicvoidreturn_book(){//還該圖書對象

bookStatus="在架可借"; ......//生成一條還書記錄}……publicStringget_bookStatus(){//獲取該圖書對象的狀態

returnbookStatus;}}classOperation{publicvoidoper(){......BookaBook;

......aBook=......;//獲取將被操作的圖書對象

aBook.borrow_book();//借該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.return_book();//還該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.renew_book();//續借該圖書對象

......aBook=......;//獲取將被操作的圖書對象

aBook.reserve_book();//預約該圖書對象

......}}小節數據封裝和信息隱藏能夠提高程序的可復用性和可維護性徹底消除了傳統結構方法中數據與操作分離所帶來的種種問題,非常完美地避免了內容耦合的問題,最大限度地降低了模塊之間的耦合度。對模塊進行修改所造成的影響將僅限于該模塊內部,而對其接口沒有影響,也即對其他與之有交互的模塊不造成任何影響。數據封裝和信息隱藏還可以把模塊中的私有數據和公共數據分離開,保護了私有數據,減少了可能的模塊間干擾,達到降低程序復雜性、提高可控性的目的。小節設計良好的數據封裝和信息隱藏使程序更安全,更易讀、易懂、易修改、和易維護,且增強程序的安全性。數據封裝和信息隱藏是面向對象機制所特有的優勢。歡迎學習《軟件工程》軟件工程第四章面向對象思想與范型4.6類之間的關系4.6類之間的關系繼承聚合關聯4.6.1繼承關系繼承關系Inheritance父類parent子類child超類superclass子類sub-class基類baseclass派生類derivedclass4.6.1繼承關系4.6.1繼承關系4.6.1繼承關系4.6.1繼承關系classHuman{StringID;Stringname;voideat(){……}voidsleep(){……}}classStudentextendsHuman{StringstudentNo;Stringschool;voidtake_course(){……}voidtake_exam(){……}}脆弱的基類問題4.6.1繼承關系4.6.2聚合關系聚合關系Aggregation整體類部分類4.6.2聚合關系classPersonalComputer{ CPUcpu; Monitormonitor; Keyboardkeyboard; Mousemouse;}4.6.2聚合關系組合關系Composition階元關系UML中階元關系的標識符標識符含義0..10或11

只有10..*0到多1..*1到多n

只有n(n>1)0..n0到n(n>1)1..n1到n(n>1)n..mn到m(n>1andm>1)n..*n到多(n>1)4.6.3關聯關系4.6.3關聯關系4.6.3關聯關系classDriver{methoddrive(Carcar){ …… car.run(); ……}}階元關系歡迎學習《軟件工程》軟件工程第四章面向對象思想與范型4.7多態與動態綁定4.7多態與動態綁定在結構化編程語言實現的軟件系統中,函數名不可以重名,即在一個系統中絕不允許任何兩個函數擁有相同的函數名。例如C語言的標準函數庫中,各種數值型數據分別有相應的取絕對值函數,abs()是取int數據的絕對值,labs()是取長整型數據的絕對值,fabs()是取浮點型數據的絕對值等等4.7多態與動態綁定結構化編程語言實現幾種圖形的面積switch(figure_type){ casecircle: area=area_circle(); break; caserectangle: area=area_rectangle(); break; casetriangle: area=area_triangle(); break; caseellipse: area=area_ellipse(); break; case…: ……}4.7多態與動態綁定在面向對象系統,一個方法可以有多個實現版本,這稱為多態性Polymorphism例如,取各種數據類型絕對值的方法都可以擁有同一個方法名abs(),計算各種圖形面積的方法都可以擁有同一個方法名area(),這使得設計與實現這些方法很方便,也使得調用這些方法更方便。4.7多態與動態綁定利用面向對象技術,可以有有3種實現多態的方法覆蓋Overriding重載Overloading接口Interface1、覆蓋覆蓋abstractclassFigure{......abstractdoublearea();}classRectangleextendsFigure{doublelength,width;doublearea(){......}}classTriangleextendsFigure{doublea,b,c;doublearea(){......}}classEllipseextendsFigure{doublea,b;doublearea(){......}}classCircleextendsFigure{doubleradius;doublearea(){......}}classTest{......method_1(){FigureaFigure;......doublearea=aFigure.area();......}}動態綁定重載publicstaticclassMyAbs{……staticdoubleabs(doubled){……}staticfloatabs(floatf){……}staticintabs(inti){……}staticlongabs(longlng){……}……}publicclassTest{publicstaticvoidmain(Stringargs[]){inta=-8;doubled=-100;floatf=-90;

System.out.println(MyAbs.abs(a));System.out.println(MyAbs.abs(d));System.out.println(MyAbs.abs(f));}}接口classRectangleimplementsFigure{doublelength,width;doublearea(){......}doubleperimeter(){......}}classTriangleimplementsFigure{doublea,b,c;doublearea(){......}doubleperimeter(){......}}classEllipseimplementsFigure{doublea,b;doublearea(){......}doubleperimeter(){......}}classCircleimplementsFigure{doubleradius;doublearea(){......}doubleperimeter(){......}}interfaceFigure{doublearea();doubleperimeter();……}classTest{......method_1(){......FigureaFigure;......doublearea=aFigure.area();doubleperimeter=aFigure.perimeter();......}}4.7多態與動態綁定面向對象范型中的覆蓋、重載和接口機制,也都可實現多態,而多態使得動態綁定成為可能。多態和動態綁定使程序員寫代碼更容易、程序更靈活。4.7多態與動態綁定但多態和動態綁定在帶來這些便利的同時,也會造成一些麻煩:通常不太可能在編譯階段確定在運行時會調用哪個特定的多態方法;相應地,也很難調試,很難確定程序失敗的原因。多態和動態綁定對可維護性具有消極影響,理解相應代碼的工作非常費力。在代碼的某個特定位置,程序員必須考慮動態調用的所有可能的方法,這

溫馨提示

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

評論

0/150

提交評論