基于案例的軟件構(gòu)造教程(第2版) 課件 03面向?qū)ο蟮能浖?gòu)造_第1頁
基于案例的軟件構(gòu)造教程(第2版) 課件 03面向?qū)ο蟮能浖?gòu)造_第2頁
基于案例的軟件構(gòu)造教程(第2版) 課件 03面向?qū)ο蟮能浖?gòu)造_第3頁
基于案例的軟件構(gòu)造教程(第2版) 課件 03面向?qū)ο蟮能浖?gòu)造_第4頁
基于案例的軟件構(gòu)造教程(第2版) 課件 03面向?qū)ο蟮能浖?gòu)造_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章

面向?qū)ο蟮能浖?gòu)造第3章面向?qū)ο蟮能浖?gòu)造學(xué)習(xí)如何運用面向?qū)ο蟮能浖?gòu)造技術(shù)管理和控制軟件的復(fù)雜性。繼續(xù)探討分解和模塊化,學(xué)習(xí)把抽象和封裝的原則表示成數(shù)學(xué)模型——抽象數(shù)據(jù)類型,用面向?qū)ο蠓椒▽崿F(xiàn)。通過面向?qū)ο蟮脑O(shè)計,理解軟件設(shè)計及其原則和設(shè)計模式。學(xué)習(xí)調(diào)試技術(shù)和工具,并初步學(xué)習(xí)自動化測試框架。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院2第3章面向?qū)ο蟮能浖?gòu)造故事4小強離校外出實習(xí),找好友小雨幫忙,并告訴了華經(jīng)理。小雨剛剛學(xué)完面向?qū)ο蠹夹g(shù),正想練習(xí)一下,就參考小強的描述和程序,重新編寫了程序。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院3第3章面向?qū)ο蟮能浖?gòu)造隨著要解決的問題及其程序變得越來越復(fù)雜,程序不斷增大,在編碼前考慮如何運用良好的原則把程序功能(用戶需求)分解到模塊,考慮各個模塊之間的交互、每個模塊的數(shù)據(jù)結(jié)構(gòu)與算法等,稱之為設(shè)計(動詞),結(jié)果稱為方案或設(shè)計(名詞),這個開發(fā)活動的重要性凸現(xiàn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院4第3章面向?qū)ο蟮能浖?gòu)造模塊化是在函數(shù)級,通過函數(shù)間的交互表示程序結(jié)構(gòu)、分配程序功能,暫時忽略了函數(shù)的內(nèi)部實現(xiàn)。面向?qū)ο蠹夹g(shù)把數(shù)據(jù)及其操作封裝在一個對象中,并把具有相同屬性(數(shù)據(jù)名稱)和方法(函數(shù))的所有對象抽象成類,使得能在比函數(shù)更抽象、更大程序單元粒度的層次上進(jìn)行軟件開發(fā)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院5第3章面向?qū)ο蟮能浖?gòu)造傳統(tǒng)設(shè)計工程的目標(biāo)是創(chuàng)作出堅固、適用和賞心悅目的模型或設(shè)計表示。堅固或稱為可靠,是指程序不含任何妨礙其功能的缺陷。適用指滿足用戶需求,符合程序的開發(fā)目標(biāo)。賞心悅目則是指程序具有友好的界面,使用程序的快樂體驗。為此,設(shè)計師必須首先獲得多種設(shè)計信息和方案,然后將其匯聚,從中精心挑選各種設(shè)計元素、得到某種特定的配置,最終形成滿足設(shè)計目標(biāo)的產(chǎn)品或系統(tǒng)的設(shè)計。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院6第3章面向?qū)ο蟮能浖?gòu)造軟件設(shè)計的多樣化和聚合需要直覺和判斷力,其質(zhì)量取決于構(gòu)造類似實體的經(jīng)驗、一系列指導(dǎo)面向演化的原則和啟發(fā)、一系列質(zhì)量評價標(biāo)準(zhǔn)及最終設(shè)計的表示的迭代過程。軟件設(shè)計在開發(fā)過程中處于技術(shù)核心,它使用的技術(shù)與軟件過程無關(guān)。軟件設(shè)計是軟件建模的最后一個活動,接著進(jìn)入構(gòu)造階段。軟件工程的一個獨特性是從分析到設(shè)計、從設(shè)計到程序的變遷。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院7第3章面向?qū)ο蟮能浖?gòu)造3.1抽象與封裝3.2認(rèn)識面向?qū)ο?.3面向?qū)ο蟮脑O(shè)計3.4調(diào)試的基本技術(shù)3.5軟件自動化測試3.6案例分析與實踐3.7討論與提高3.8思考與練習(xí)題2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院83.1抽象與封裝3.1.1模塊產(chǎn)生與合成3.1.2抽象與封裝3.1.3抽象數(shù)據(jù)類型2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院93.1.1模塊產(chǎn)生與合成2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院103.1.1模塊產(chǎn)生與合成函數(shù)簇包含了對核心數(shù)據(jù)的產(chǎn)生、變更和使用的操作函數(shù)。函數(shù)簇與其之外的其他函數(shù)通常不能產(chǎn)生、變更函數(shù)簇內(nèi)的核心數(shù)據(jù),僅僅使用。從模塊化理解,一個函數(shù)簇實現(xiàn)了一組圍繞核心數(shù)據(jù)的功能,具備通信內(nèi)聚和功能內(nèi)聚,屬于強內(nèi)聚。函數(shù)簇其他函數(shù)、函數(shù)簇、模塊的連接方式主要是數(shù)據(jù)的傳遞及對理解函數(shù)簇數(shù)據(jù)的函數(shù)的調(diào)用。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院113.1.1模塊產(chǎn)生與合成局部化,是實現(xiàn)模塊化的一種重要機制。如函數(shù)和復(fù)合語句的內(nèi)部變量函數(shù)調(diào)用可以視為模塊組合的一種機制。通過函數(shù)調(diào)用把函數(shù)聯(lián)系起來,構(gòu)成更大規(guī)模的程序。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院123.1.1模塊產(chǎn)生與合成數(shù)據(jù)結(jié)構(gòu),如數(shù)組或C的結(jié)構(gòu)體為組成更大、更復(fù)雜的數(shù)據(jù)提供了構(gòu)建具有層次結(jié)構(gòu)的組織方式。單純的數(shù)據(jù)結(jié)構(gòu)不含對數(shù)據(jù)的操作,也不能保護(hù)其中的數(shù)據(jù)元素??梢栽跀?shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型的基礎(chǔ)上實現(xiàn)模塊化機制,這就需要抽象與封裝。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院133.1.2抽象與封裝抽象是指對于一個過程或一件事物的某些細(xì)節(jié)有目的地隱藏,以便把其他方面、細(xì)節(jié)或結(jié)構(gòu)表達(dá)得更加清楚。抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征。抽象的目的是通過把相關(guān)的屬性和其他不相關(guān)的屬性分開,分離關(guān)注點。抽象是處理復(fù)雜問題的一個手段。抽象是分離對象特性、限制對它們在當(dāng)前環(huán)境關(guān)注的一個機制。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院143.1.2抽象與封裝如,教學(xué)管理系統(tǒng),把學(xué)生抽象成符號串(姓名、學(xué)號、學(xué)院、專業(yè)、課程)、數(shù)字(出生日期、課程成績)等用數(shù)據(jù)類型或數(shù)據(jù)結(jié)構(gòu)表示的屬性;查找一個學(xué)生的信息通過一個檢索函數(shù)實現(xiàn),使用者不必關(guān)心使用了什么檢索方法。又如,對口算題進(jìn)行了抽象,是有兩個運算數(shù)、一個運算符及一個運算結(jié)果的符號串或數(shù)據(jù)結(jié)構(gòu),不考慮算式表示的涵義、物理屬性、表現(xiàn)形式等。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院153.1.2抽象與封裝程序設(shè)計有兩種抽象,分別是過程抽象(函數(shù)抽象)和數(shù)據(jù)抽象。過程抽象是在使用一個函數(shù)或方法時知道它干什么,而不知道它是如何完成的。數(shù)據(jù)抽象是將一個數(shù)據(jù)類型的特性(值及其運算)與其實現(xiàn)分離。在軟件構(gòu)造中,我們需要一種機制來實現(xiàn)抽象,呈現(xiàn)關(guān)注點,隱藏其他細(xì)節(jié)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院163.1.2抽象與封裝封裝有兩個含義:①把描述一個事物的性質(zhì)和行為結(jié)合在一起成為構(gòu)件,對外形成該事物的一個界限,封裝使構(gòu)件能夠集中而完整地對應(yīng)并描述具體的事物,體現(xiàn)了事物的相對獨立性;②信息隱蔽,即外界不能直接存取構(gòu)件的內(nèi)部信息(屬性)及隱藏起來的內(nèi)部操作,外界也不必知道操作的內(nèi)部實現(xiàn)細(xì)節(jié);信息隱藏強制封裝。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院173.1.2抽象與封裝封裝具有如下優(yōu)勢構(gòu)件外部只能通過外部可用的操作來訪問內(nèi)部數(shù)據(jù)和操作,降低了構(gòu)件間的耦合度。構(gòu)件內(nèi)部修改對外部的影響變小,減少了修改引起整個程序范圍的“波動效應(yīng)”。更容易快速開發(fā)正確的程序,一旦程序員們確定了構(gòu)件間的交互,每個人都可以獨立地開發(fā)和測試分配的構(gòu)件。改善通用性和維護(hù)性。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院183.1.2抽象與封裝嚴(yán)格的封裝也會帶來諸如編程麻煩、執(zhí)行效率的問題。有些語言不強調(diào)嚴(yán)格的封裝和信息隱藏,而采取可見性控制來解決這些問題。例如,C++和Java語言通過定義對象的屬性和操作的可見性,規(guī)定了其他對象對其屬性和操作的可訪問性;另外,一個對象也可以通過把相應(yīng)的可見性指定為受保護(hù)的或私有的,而提供僅局限于特定對象的屬性和操作。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院193.1.2抽象與封裝【例3.1】一個商店中可能有一個人負(fù)責(zé)貨架(保管員),一個人負(fù)責(zé)進(jìn)貨(采購員)。對于保管員,貨架是存放商品位置的抽象,只需關(guān)注貨架的位置信息如行、列、層等,而不必關(guān)心貨架的材質(zhì)、色彩等。同樣,采購員對飲料進(jìn)行抽象,他只需知道飲料的名稱、編碼、價格、供應(yīng)商等有關(guān)信息,而不必關(guān)心飲料容器的大小、材料、色澤等。而保管員則必須知道這些信息,以便把商品放到正確的位置。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院203.1.2抽象與封裝封裝使得各行其責(zé)。當(dāng)保管員注意到庫存的飲料少了,只需通知采購員訂貨。保管員無須知道飲料的價格和來源。采購員也不關(guān)心飲料放在貨架的具體位置。封裝使得這些工作更加容易和安全。當(dāng)然,保管員和采購員相互獨立的職責(zé)有可能造成“采購員本周休假,飲料缺貨”的情形;或者保管員不在,倉庫有貨卻無法上架。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院213.1.3抽象數(shù)據(jù)類型數(shù)據(jù)類型是一個值的集合和定義在值集上的一組操作的總稱。明顯或隱含地規(guī)定了數(shù)據(jù)的取值范圍、存儲方式及其運算。數(shù)據(jù)類型可分為:原子類型和結(jié)構(gòu)類型。程序設(shè)計語言都提供了基本數(shù)據(jù)類型。每個數(shù)據(jù)都屬于某種數(shù)據(jù)類型。對于復(fù)雜的信息,編程處理時僅僅使用基本數(shù)據(jù)類型是不夠的。比如,可以把“學(xué)生”的取值集合與規(guī)定的一組操作定義成一種數(shù)據(jù)類型。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院223.1.3抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型(AbstractDataType,ADT)是一個數(shù)據(jù)模型及定義在該模型上的一組操作。定義一個ADT時,必須給出它的名字及各操作的名稱,并且規(guī)定這些函數(shù)的參數(shù)性質(zhì)。一旦定義了一個ADT及具體實現(xiàn),程序設(shè)計中就可以像使用基本數(shù)據(jù)類型那樣,十分方便地使用ADT。學(xué)生ADT,包含各種屬性及取值范圍;還有一組操作,如按照不同屬性查詢學(xué)生的信息、更改一些信息。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院233.1.3抽象數(shù)據(jù)類型一個程序員定義的ADT要通過高級編程語言中已有的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)。利用基本的數(shù)據(jù)結(jié)構(gòu)可以構(gòu)造一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如棧、隊列、樹、圖等,對數(shù)據(jù)集進(jìn)行抽象而不必讓使用者(程序員)關(guān)心實際數(shù)據(jù)的存儲細(xì)節(jié)(ADT的數(shù)據(jù)結(jié)構(gòu))。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院243.1.3抽象數(shù)據(jù)類型【例3.2】一個ADTStack提供如下操作。Stack():創(chuàng)建一個新的空棧;push(item):把參數(shù)item放在棧頂;pop():把棧頂元素從棧中移出并返回,若棧為空,則出錯;top():返回棧頂元素,但不移出,若棧為空,則出錯;isEmpty():若棧為空,返回真值,否則,返回假值;size():返回棧的元素的個數(shù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院253.1.3抽象數(shù)據(jù)類型無論如何實現(xiàn)該棧,它只提供這6個操作,除此之外沒有其他操作。使用者不知道、也不必關(guān)心它是用數(shù)組、還是通用表等基本類型實現(xiàn)的。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院263.1.3抽象數(shù)據(jù)類型ADT的定義與其實現(xiàn)分離,使其用戶只需關(guān)注如何使用,而不是它的實現(xiàn)細(xì)節(jié)。這種分離要求與ADT的交互使用接口(定義的操作集)。通過封裝實現(xiàn)細(xì)節(jié),要求通過接口訪問ADT,使得我們能使用抽象進(jìn)行工作,專注ADT提供的功能,而不必理解這些功能的實現(xiàn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院273.1.3抽象數(shù)據(jù)類型【例3.3】第2章把Equation當(dāng)成一個整體。如果Equation的定義包含運算結(jié)果value,按照ADT的概念,value是Equation的一個成員,使用Equation的程序(函數(shù))是不允許訪問它的。但C可以通過equation.value訪問,包括更改它的值。這樣,就會導(dǎo)致equation的不一致:算式實際的運算結(jié)果與存放結(jié)果value的值不一樣。所以在定義類型Equation時沒有包含它的運算結(jié)果,而是用一個函數(shù)動態(tài)地計算,才能使得一個算式保持一致。但是,這個計算顯然要占用資源。而且,在使用一個算式值時不能忘記這個計算函數(shù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院283.1.3抽象數(shù)據(jù)類型面向?qū)ο鬄閷崿F(xiàn)ADT提供了良好的機制。類:ADT的一種實現(xiàn)方式。加上繼承、聚合、多態(tài)等特性,不僅提高了軟件開發(fā)效率,還能提高軟件產(chǎn)品的質(zhì)量,使得面向?qū)ο蟮某绦蛟O(shè)計獲得普遍應(yīng)用。面向?qū)ο笳Z言提供了良好的編程機制,但語言本身并不能保證開發(fā)出高質(zhì)量程序,因而還需要學(xué)習(xí)和運用設(shè)計、編碼、測試等軟件構(gòu)造的基本原理,更好地運用面向?qū)ο笳Z言的特性來構(gòu)造出高質(zhì)量的程序。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院293.2認(rèn)識面向?qū)ο竺嫦驅(qū)ο蠹夹g(shù)包括軟件開發(fā)方法和程序設(shè)計語言,在傳統(tǒng)面向過程程序設(shè)計語言、結(jié)構(gòu)化設(shè)計方法的基礎(chǔ)上做出了改進(jìn),并在軟件開發(fā)、編程語言方面提出了新的理論和實踐。3.2.1設(shè)計類3.2.2設(shè)計操作3.2.3分類2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院303.2.1設(shè)計類用面向?qū)ο箝_發(fā)軟件時,我們把系統(tǒng)模塊化成類,它們封裝了屬性及其操作。決定一個類知道什么、做什么,就是抽象出一個類。在設(shè)計一個類如何做事情時,就是把它們封裝起來。良好設(shè)計的類限制訪問它的屬性及其操作,實質(zhì)上就是隱藏了信息及其處理。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院313.2.1設(shè)計類抽象是設(shè)計類的基本方法。抽象是在某個東西周圍畫上一個白盒子的動作:識別出它做什么、不做什么。抽象是對某個東西定義接口的動作。抽象告訴我們存儲學(xué)生的姓名、學(xué)號,也能讓學(xué)生選課。但是,抽象不告訴我們是如何做到這些的。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院323.2.1設(shè)計類封裝則處理如何將這些特性模塊化。封裝解決的是如何劃分一個系統(tǒng)的功能的設(shè)計問題。封裝是在某個東西周圍畫上一個黑盒子的動作:它明確某事能完成,但是不告訴是怎樣做到的。換句話說,封裝對類的使用者隱藏了實現(xiàn)細(xì)節(jié)。為了使應(yīng)用程序容易維護(hù),要限制訪問類的數(shù)據(jù)和操作。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院333.2.1設(shè)計類模塊化原則——緊內(nèi)聚、松耦合仍然適用于評價面向?qū)ο蟪绦?。包括類的?nèi)聚、方法的內(nèi)聚;不同類之間的耦合、同一個類不同對象之間的耦合及同一個類內(nèi)函數(shù)之間的耦合。類的模塊化準(zhǔn)則要求一個類應(yīng)當(dāng)是完整的原始的充分的2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院343.2.2設(shè)計操作類的設(shè)計要盡量使其所有的操作都是原始的,每個操作僅提供簡單、良好定義的行為。根據(jù)松散耦合的原則,也傾向于分離操作、減少它們之間的溝通。矛盾:把復(fù)雜的行為集中在一個方法中,簡化了接口,但其實現(xiàn)復(fù)雜了;反之,方法行為和實現(xiàn)簡單了,但方法多了,接口復(fù)雜了。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院353.2.2設(shè)計操作通常在面向?qū)ο箝_發(fā)中,把類的方法作為整體來設(shè)計,這是因為所有這些方法的合作構(gòu)成了抽象的全部協(xié)議。設(shè)計時考慮以下建議。復(fù)用:這個行為在更多的環(huán)境中更有意義嗎?復(fù)雜:實現(xiàn)這個行為有多難?適應(yīng):這個行為與其置身的類有多少關(guān)系?實現(xiàn)知識:實現(xiàn)這個行為要依賴于類的內(nèi)部細(xì)節(jié)嗎?2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院363.2.2設(shè)計操作多態(tài)多態(tài)是類型理論的一個概念,一個名字可以表示多個不同類的實例,只要它們具有某個共同的超類而且相關(guān)。所以,被這個名字表示的任何對象都能以不同的方式對一組某些相同的操作做出響應(yīng)。由于多態(tài),一個操作就能在層次結(jié)構(gòu)中的所有類以不同方式實現(xiàn)。這樣,子類就能擴展超類的能力或者覆蓋超類的操作。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院373.2.2設(shè)計操作很多類具有相同協(xié)議時,多態(tài)最有用。如果沒有多態(tài),程序中會出現(xiàn)大量的if或switch語句?!纠?.4】一個幾何圖形類Geometry有子類Rectangel、Segment、Triangle和Circle,顯示圖形的抽象方法display,每個子類都有自己的實現(xiàn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院383.2.2設(shè)計操作當(dāng)一個圖形編輯GraphicsEditor要顯示一個Geometry對象時,不用多態(tài)的代碼結(jié)構(gòu)可能是:2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院393.2.2設(shè)計操作如果使用多態(tài),則代碼精簡:新增一個子類Polygon,要重新實現(xiàn)display,無須改變程序的其他部分,尤其不用改變使用Geometry的GraphicsEditor。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院403.2.3分類關(guān)鍵抽象是構(gòu)成問題域術(shù)語的一個類或?qū)ο?。其主要價值在于識別確定問題邊界的抽象,指出在系統(tǒng)中出現(xiàn)的問題相關(guān)的類(領(lǐng)域類)、因而與設(shè)計相關(guān)的事情。機制用于描述通過對象的協(xié)作提供滿足問題需求的某種行為的任何結(jié)構(gòu)。因為類的設(shè)計具體表達(dá)了單個對象行為的知識,機制就是一個關(guān)于一組對象如何協(xié)作的設(shè)計決策。機制就是行為模式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院413.2.3分類分類是對整理知識的一致手段。識別類和對象是面向?qū)ο箝_發(fā)的一個挑戰(zhàn)。識別包含發(fā)現(xiàn)和發(fā)明。通過發(fā)現(xiàn),我們認(rèn)識到構(gòu)成問題域詞語的關(guān)鍵抽象和機制。通過發(fā)明,設(shè)計出一般化的抽象和機制,說明對象是如何協(xié)作的。發(fā)現(xiàn)和發(fā)明都是分類問題,其核心就是發(fā)現(xiàn)問題的共性。分類就是試圖把具有共同結(jié)構(gòu)或表現(xiàn)出共同行為的事情分為一組。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院423.2.3分類1.類之間的關(guān)系在類之間建立關(guān)系的原因,首先是一種類關(guān)系會指出某種共享。其次,一種類關(guān)系會指出某種語義聯(lián)系。面向?qū)ο笾杏腥N類關(guān)系。普通與特殊(繼承),即“是一種”。例如,加法算式是一種二元算式。整體-部分(聚合),即“是成員”。例如,算式是習(xí)題的一部分。關(guān)聯(lián),表示沒有其他關(guān)系的類之間的某種語義依賴。如,“學(xué)生”和“教師”是兩個獨立的類,但是它們都和“課程”相關(guān)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院433.2.3分類面向?qū)ο筌浖€有一種常見的關(guān)系——依賴。依賴表示關(guān)系一端的成員以某種方式依賴于關(guān)系另一端的成員。它告訴開發(fā)者,如果這些元素發(fā)生變化,會影響其他成員。例如,以幾何圖形的顯示display為例,除了顯示圖形的形狀,還可以顯示圖形的顏色和線條,類Geometry則依賴類Color和Style(粗細(xì)、實線、虛線)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院443.2.3分類2.接口與實現(xiàn)Meyer認(rèn)為程序設(shè)計本質(zhì)上是契約:一個較大問題的功能通過把它們分包到不同元素的設(shè)計,而分解成若干較小的問題。類的內(nèi)部和外部視角。類的接口提供了外部視角,重在抽象,同時隱藏了它的結(jié)構(gòu)和組成。接口主要包括聲明。類的實現(xiàn)是其內(nèi)部視角,包含其行為,主要由所有定義在類接口操作的實現(xiàn)組成。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院453.2.3分類類的接口可以進(jìn)一步分成4類。公共的:對所有用戶可訪問的聲明;保護(hù)的:僅允許類本身及其子類訪問的聲明;私有的:僅允許類本身訪問的聲明;包:僅允許和類在用一個包的聲明。接口是一些面向?qū)ο笳Z言的基本元素,如Java語言的接口Interface,必須有具體的類才能實現(xiàn)接口定義的操作。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院463.3面向?qū)ο蟮脑O(shè)計本節(jié)由淺入深地討論如何運用面向?qū)ο蟮脑瓌t和原理設(shè)計并開發(fā)良好的程序。初步識別出兩個類,分別是加減法的二元運算的算式及存放算式的練習(xí),分別命名為算式類BinaryOperation和習(xí)題類Exercise。3.3.1面向?qū)ο蟮脑O(shè)計符號3.3.2案例設(shè)計一3.3.3案例設(shè)計二2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院473.3.1面向?qū)ο蟮脑O(shè)計符號軟件設(shè)計語言或符號,如可視化圖形設(shè)計符號。在面向?qū)ο笤O(shè)計中,普遍采用的包括描述程序靜態(tài)結(jié)構(gòu)的類圖、描述程序動態(tài)行為的交互圖。它們掩藏了類中方法的實現(xiàn)細(xì)節(jié),突出了類的組成和類之間的關(guān)系,簡潔清晰地表達(dá)設(shè)計意圖和內(nèi)容。復(fù)雜的算法、數(shù)據(jù)結(jié)構(gòu)等操作的實現(xiàn),仍然使用代碼和偽代碼補充說明。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院483.3.1面向?qū)ο蟮脑O(shè)計符號統(tǒng)一建模語言UML類圖類用一個帶有類名、屬性和操作的矩形表示。分隔線用來分離類名、屬性和操作。類名在矩形的最上方,其次是屬性,然后是操作。類名:具體類的名稱正常書寫;抽象類名加abstract前綴,或用斜體書寫;接口名加前綴interface,屬性空著。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院493.3.1面向?qū)ο蟮脑O(shè)計符號屬性類似程序語言的聲明——可見性、變量名、類型、初始值;前綴表示可見性:“+”公用,“?”私有,“#”保護(hù)。靜態(tài)變量或常量用大寫字母的標(biāo)識符,成員變量允許具有初始值。操作用簽名表示——可見性、返回類型、操作名稱、參數(shù)及類型,可見性符號與屬性的相同。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院503.3.1面向?qū)ο蟮脑O(shè)計符號2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院513.3.1面向?qū)ο蟮脑O(shè)計符號為了表示程序中類之間的關(guān)系,可以只用一個標(biāo)示類名的矩形表示類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院523.3.1面向?qū)ο蟮脑O(shè)計符號類之間的關(guān)聯(lián)用一根線表示,包括每個關(guān)聯(lián)類的角色名、數(shù)目、方向和約束。泛化是一端帶空心三角形的連線,從子類到父類,空心三角形一端是父類。聚合用來描述一個元素(整體)包含另外的元素(部分),部分可以脫離整體作為一個獨立的個體存在。聚合的整體端用空心菱形表示。組合是一種語義更強的聚合,部分組成整體,不可分割,整體消失部分也跟著消失,部分不能脫離整體而單獨存在。組合的整體端用實心菱形表示。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院533.3.1面向?qū)ο蟮脑O(shè)計符號圖3.3表示設(shè)計的解釋:機械工程師、電氣工程師和軟件工程師都屬于員工,他們組成一個飛機建造團(tuán)隊。飛機由零件組成,零件還可以(遞歸)有零件。UML不僅能使軟件建??梢暬?,還有助于分析、評估和驗證軟件設(shè)計,支持從UML自動產(chǎn)生部分代碼,指導(dǎo)產(chǎn)生測試用例。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院543.3.2案例設(shè)計一1.算式類BinaryOperation2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院553.3.2案例設(shè)計一2.習(xí)題類Exercise2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院563.3.3案例設(shè)計二1.算式類BinaryOperation軟件設(shè)計中的單一職責(zé)原則(SingleResponsibilityPrinciple,SRP)是最容易理解和運用的。單一職能原則實際上是內(nèi)聚原則在面向?qū)ο蠓椒ㄖ械木唧w表現(xiàn),含義是就單個類而言,應(yīng)該只有一個引起它變化的原因。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院573.3.3案例設(shè)計二類BinaryOperation把其中的公共部分抽象出來,把差異部分細(xì)化成BinaryOperation的兩個子類:加法算式AdditionOperation減法算式SubstractOperation每個類只負(fù)責(zé)完成各自單一的功能,兩個子類相互獨立。這樣的程序結(jié)構(gòu)還便于程序擴展,如增加乘法、除法子類,不影響已經(jīng)存在的類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院583.3.3案例設(shè)計二里氏代換原則(LiskovSubstitutionPrinciple,LSP)是設(shè)計類層次結(jié)構(gòu)的基本原則,它要求子類型必須能夠替換其基類型。使用里氏代換原則的兩個要點如下。(1)子類的所有方法必須在父類中聲明,或子類必須實現(xiàn)父類中聲明的所有方法。(2)盡量把父類設(shè)計為抽象類或接口,讓子類繼承父類或?qū)崿F(xiàn)父接口,并實現(xiàn)在父類中聲明的所有方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院593.3.3案例設(shè)計二基類BinaryOperation設(shè)計成抽象類。子類AdditionOperation和SubstractOperation在基類中定義抽象方法intcalculate()返回運算式的計算結(jié)果,抽象方法booleancheckingCalculation()檢查運算結(jié)果。具體實現(xiàn)則分別在兩個子類中。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院603.3.3案例設(shè)計二2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院613.3.3案例設(shè)計二2.抽象類abstract類和接口interface的比較2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院623.3.3案例設(shè)計二3.依賴倒轉(zhuǎn)原則子類必須實現(xiàn)抽象父類定義的抽象方法才能生成對象,即低層的子類依賴高層的、抽象的父類。這種設(shè)計思想運用了面向?qū)ο蠹夹g(shù)中的依賴倒轉(zhuǎn)原則(DependencyInversionPrinciple,DIP),它轉(zhuǎn)換了依賴關(guān)系:高層模塊不依賴于低層模塊,兩者都依賴于抽象。抽象不依賴于實現(xiàn),實現(xiàn)依賴于抽象。換言之,就是高層模塊定義接口,低層模塊負(fù)責(zé)實現(xiàn)?!吧限D(zhuǎn)型對象”是面向?qū)ο蠓椒ㄖ袑崿F(xiàn)依賴倒轉(zhuǎn)原則的有效技術(shù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院633.3.3案例設(shè)計二4.習(xí)題類Exercise按照單一職責(zé)原則,把類Exercise的產(chǎn)生職責(zé)和使用職責(zé)分離出來,使類Exercise僅僅作為一個存儲和管理一定數(shù)量的算式題的數(shù)據(jù)集容器,同時建立一個使用習(xí)題的新類ExerciseSheet。兩個類之間是依賴關(guān)系:ExerciseSheet按照Exercise提供的方法使用它,當(dāng)然受其影響。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院643.3.3案例設(shè)計二在面向?qū)ο笾?,依賴關(guān)系可以視為具有特殊語義的關(guān)聯(lián)。UML類圖用帶箭頭的虛線連接兩個有依賴關(guān)系的類:虛線起端表示使用、受影響的類,帶箭頭的末端表示產(chǎn)生影響、被使用的類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院653.3.3案例設(shè)計二2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院663.3.3案例設(shè)計二5.?dāng)?shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)ExerciseSheet無法訪問類Exercise中存放算式的私有成員operationList。為了能讓其他對象使用Exercise中存儲在Array中的算式,它必須提供公共操作,如檢索、遍歷等。類Exercise可以選擇其他數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu),存放算式。面向?qū)ο笳Z言的容器型數(shù)據(jù)結(jié)構(gòu),如List、Queue、Stack等。Java語言的Collection(C#的ICollection)類層次結(jié)構(gòu)提供了豐富的管理數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)、接口和(抽象)類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院673.3.3案例設(shè)計二策略1:實現(xiàn)接口。隊列Queue的操作如contains、isEmpty、iterator等,完全滿足案例目前對Exercise的要求,可以讓Exercise實現(xiàn)接口Queue。在Java中使用隊列Queue,除了要實現(xiàn)這4個方法以外,還必須實現(xiàn)Queue及其繼承的所有其他所有方法,否則不能構(gòu)造對象實例。這違背了接口隔離原則(InterfaceSegregationPrinciple,ISP),根據(jù)該原則,不應(yīng)該強迫客戶程序依賴于它們不用的方法2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院683.3.3案例設(shè)計二策略2:運用繼承。讓Exercise繼承容器數(shù)據(jù)結(jié)構(gòu)中的一個,如具有動態(tài)改變?nèi)萜鲾?shù)量的ArrayList。ArrayList可以視為動態(tài)數(shù)組,即數(shù)組大小隨需增長。它提供了普通數(shù)組的操作,如按下標(biāo)添加、插入、查詢、刪除及迭代遍歷數(shù)據(jù)成員等方法,涵蓋了Exercise的設(shè)計要求。但這個設(shè)計策略暴露了存儲算式的內(nèi)部數(shù)據(jù)結(jié)構(gòu),因而違背了信息隱藏的基本原則。另外,同接口一樣,不能選擇性地繼承操作或?qū)傩?,子類Exercise繼承了一些不需要的操作。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院693.3.3案例設(shè)計二策略3:封裝結(jié)構(gòu)。Exercise定義容器類數(shù)據(jù)結(jié)構(gòu)(如Array、ArrayList、Queue、List)為私有成員變量封裝,Exercise提供訪問的next、hasNext等方法,以便ExerciseSheet能夠?qū)崿F(xiàn)遍歷等操作。不同的應(yīng)用需要Exercise提供的操作可能不完全一樣。例如,目前不需要從練習(xí)中刪除運算題,就可以不實現(xiàn)刪除操作。而且,不同的容器類數(shù)據(jù)結(jié)構(gòu),如Array和ArrayList,對這些操作的實現(xiàn)也不同。ArrayList能提供包含上述要求的操作,甚至更多、更方便。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院703.4調(diào)試的基本技術(shù)在Eclipse中,Java視圖中選擇要調(diào)試的函數(shù)/類右擊,選擇debugas→JavaApplication,出現(xiàn)debug視圖。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院713.4調(diào)試的基本技術(shù)啟動調(diào)試程序的兩種方式:(1)選擇菜單Run→DebugAs;(2)選擇debug的圖標(biāo)。使用調(diào)試器調(diào)試程序的基本模式如下:首先設(shè)置(若干)斷點,啟動運行調(diào)試器;遇到一個斷點后停下,單步調(diào)試一段代碼,可以檢查、改變斷點的程序狀態(tài)和行為。然后恢復(fù),讓調(diào)試器繼續(xù)執(zhí)行程序,直到遇到下一個斷點或執(zhí)行到程序的結(jié)束。調(diào)試可在任何時刻終止。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院723.4調(diào)試的基本技術(shù)3.4.1單步調(diào)試源程序3.4.2檢查/更改變量的值3.4.3設(shè)置監(jiān)視點觀察變量3.4.4上下移動調(diào)用棧2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院733.4.1單步調(diào)試源程序1.設(shè)置斷點在要檢查的語句上設(shè)置斷點,程序執(zhí)行到斷點處會暫停。通過窗口觀察此刻變量的值、檢查程序運行情況;可以輸入改變變量或表達(dá)式的值,然后讓程序繼續(xù)運行。Eclipse中在代碼行左邊的頁邊空白處雙擊設(shè)置斷點。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院743.4.1單步調(diào)試源程序2.單步調(diào)試?yán)脝尾矫?,從斷點處開始一次處理一條語句。變量值有助于程序員仔細(xì)觀察程序的執(zhí)行流程、了解程序變量值的變化、調(diào)查可疑代碼。在debug視圖中有三種方式執(zhí)行視圖中的圖標(biāo)右擊出現(xiàn)的選擇(含圖標(biāo))快捷鍵2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院753.4.1單步調(diào)試源程序單步調(diào)試的主要操作StepInto,F(xiàn)5,進(jìn)入方法內(nèi)部。StepOver,F(xiàn)6,執(zhí)行方法下一條語句。StepReturn,F(xiàn)7,從當(dāng)前方法跳出,跳轉(zhuǎn)到該方法的結(jié)尾代碼處。Resume,F(xiàn)8,恢復(fù)操作。跳出單步調(diào)試方式,讓程序繼續(xù)運行到下一個斷點或執(zhí)行完。DropToFrame,使調(diào)試器重新跳到當(dāng)前方法的開始處重新執(zhí)行,所有上下文變量的值也恢復(fù)??梢栽陉P(guān)注的狀態(tài)下反復(fù)調(diào)試,而不用重新啟動調(diào)試器。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院763.4.1單步調(diào)試源程序3.臨時斷點有時需要在顯示的代碼中臨時設(shè)置有期限的斷點,以便細(xì)致觀察程序。在Eclipse中,突出顯示源碼窗口中要設(shè)置臨時斷點的代碼行,然后右擊并選擇RuntoLine。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院773.4.2檢查/更改變量的值當(dāng)調(diào)試器暫停了程序運行后,可以執(zhí)行一些調(diào)試命令來顯示、改變程序變量的值。不使用調(diào)試器,在程序中增加打印語句顯示程序變量值的變化也可以。在圖(a)選中變量右擊選ChangePrimitiveValue,出現(xiàn)圖(b)所示的對話框。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院783.4.3設(shè)置監(jiān)視點觀察變量監(jiān)視點(watchpoint)結(jié)合了斷點和變量檢查的概念。每當(dāng)指定變量的值發(fā)生變化時,都暫停程序的運行。監(jiān)視點對局部變量的用途一般沒有對作用域更寬的變量的用途大,因為一旦變量超出作用域(如函數(shù)結(jié)束),在局部變量上設(shè)置的監(jiān)視點就會被取消。main()中的局部變量例外,因為其中的變量要等到程序執(zhí)行結(jié)束時才會被釋放。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院793.4.3設(shè)置監(jiān)視點觀察變量在Eclipse中設(shè)置監(jiān)視點的方法:在源碼窗口中右擊,選擇Watch,然后在對話框中填寫適當(dāng)?shù)谋磉_(dá)式,如圖3.11所示。代碼的執(zhí)行結(jié)果將顯示在表達(dá)式窗口中。選中一句或一段代碼右擊,選擇Inspect(檢查)項,可以直接顯示表達(dá)式的值。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院803.4.4上下移動調(diào)用棧與函數(shù)關(guān)聯(lián)的運行時信息存儲在稱為幀的內(nèi)存區(qū)域中。幀中包含了函數(shù)局部變量的值、形參,以及調(diào)用該函數(shù)的位置。系統(tǒng)為每個調(diào)用函數(shù)創(chuàng)建一個幀,并將其放在一個運行棧上;運行棧最上面的幀表示當(dāng)前正在運行的函數(shù),當(dāng)函數(shù)退出時,這個幀就退出運行棧并釋放所占的內(nèi)存。運用調(diào)試器可以觀察運行棧,追蹤函數(shù)之間的調(diào)用關(guān)系和變量值的來源、變化等信息。Eclipse中,運行棧在debug透視圖本身連續(xù)可見。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院813.5軟件自動化測試合適的測試工具和構(gòu)建工具,可以提高構(gòu)建效率,是現(xiàn)代軟件開發(fā)的基礎(chǔ)。JUnit已經(jīng)成為現(xiàn)代軟件開發(fā)方法和工具的核心組成。它是Java語言的測試框架,是包含測試用例、測試執(zhí)行、測試記錄等一組Java類和接口。JUnit由于簡單、實用、易用,特別適合自動化的單元測試和回歸測試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院823.5軟件自動化測試3.5.1初識Junit3.5.2編寫Junit測試代碼2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院833.5.1初識Junit使用JUnit進(jìn)行測試的基本步驟如下。(1)建立測試類,命名規(guī)則:待測類名+Test,如BinaryOperationTest。在該類的前面用@RunWith指定測試運行器,默認(rèn)JUnit4。(2)在用@Before注解的setUp()中為測試做必要準(zhǔn)備(測試裝置fixture)。(3)為待測類的成員方法/函數(shù)編寫測試方法,命名規(guī)則:test+待測方法,以@Test注解這個待測方法,其中務(wù)必包含測試斷言。(4)運行測試,查看運行結(jié)果,更改代碼。(5)增加方法或修改代碼時,重復(fù)(3、4)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院843.5.2編寫Junit測試代碼1.基本測試2.追蹤失敗的測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院853.6案例分析與實踐3.6.1分析3.6.2構(gòu)造2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院863.6.1分析構(gòu)造任務(wù)3.1:實現(xiàn)BinaryOperation及其子類。構(gòu)造任務(wù)3.2:實現(xiàn)Exercise和ExerciseSheet。開發(fā)方式(1)順序,即完成子任務(wù)1的程序后開始2;(2)并行,同時開始子任務(wù)1和2的編程。在子任務(wù)2編程期間,可以使用簡單的算式類代替BinaryOperation,最后再用編寫好的BinaryOperation替換,完成整個任務(wù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院873.6.1分析小強和小雨倆人的合作方式可以是:(1)兩人分別執(zhí)行一個子任務(wù);(2)兩人協(xié)作執(zhí)行一個子任務(wù)——一個人編寫程序,另一個人設(shè)計測試,等程序完成了就立刻執(zhí)行測試;整個開發(fā)期間兩人可以交換工作。合作方式(2)蘊含了敏捷開發(fā)方法中兩種實踐的基本思想——測試驅(qū)動開發(fā)與結(jié)對編程。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院883.6.2構(gòu)造2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院893.7討論與提高3.7.1對調(diào)試的進(jìn)一步認(rèn)識3.7.2設(shè)計原則與設(shè)計模式3.7.3面向?qū)ο蟮脑O(shè)計原則2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院903.7.1對調(diào)試的進(jìn)一步認(rèn)識1.調(diào)試與測試調(diào)試與測試都分析程序代碼、選擇性地運行程序,并觀察程序的結(jié)果或運行過程。測試與調(diào)試的目標(biāo)不同,采用了不同的技術(shù)、方法和工具。在軟件構(gòu)造過程中,開發(fā)者交替進(jìn)行測試與調(diào)試:測試發(fā)現(xiàn)程序可能存在錯誤,然后通過調(diào)試來修改錯誤,之后再通過測試確認(rèn)程序錯誤得到了修改。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院913.7.1對調(diào)試的進(jìn)一步認(rèn)識2.不調(diào)試就是最好的調(diào)試精通程序調(diào)試不僅要掌握專門的調(diào)試器,還要充分利用其他編程輔助工具。最好的調(diào)試方法就是一開始就不要錯誤地編程!首先,要熟練掌握編輯器的使用。充分利用支持編程語言的編輯器是最容易忽略的“預(yù)調(diào)試”方式。其次,充分利用編譯器。第三,使用靜態(tài)代碼檢查器。3.調(diào)試的智力活動2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院923.7.2設(shè)計原則與設(shè)計模式面向?qū)ο蠹夹g(shù)在軟件開發(fā)過程中出現(xiàn)了一些可反復(fù)使用、解決實際問題的解決方案,稱為設(shè)計模式。一個設(shè)計模式針對一個具體問題,用抽象方式描述解決一類特殊問題的、通用的設(shè)計方案元素。設(shè)計模式的核心元素包括:標(biāo)示模式的名稱,適用環(huán)境的場景,描述設(shè)計的模板。在面向?qū)ο蠹夹g(shù)中,用類圖描述設(shè)計模式的結(jié)構(gòu),用交互圖描述設(shè)計模式的行為。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院933.7.2設(shè)計原則與設(shè)計模式1.策略模式(1)問題分析。算法多種多樣、經(jīng)常改變,其他類不使用的算法。如何在運行時根據(jù)需要透明地更改對象的算法?將算法與對象本身解耦,從而避免上述問題?(2)解決思路。使用一個抽象的策略算法,用子類繼承這個公共的抽象類,定義一個個具體的策略算法,把它們封裝起來,通過實現(xiàn)抽象類的抽象算法使它們可互相替換。該模式使得算法可獨立于使用它的應(yīng)用客戶而變化和擴展。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院943.7.2設(shè)計原則與設(shè)計模式1.策略模式(3)設(shè)計結(jié)構(gòu)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院953.7.2設(shè)計原則與設(shè)計模式1.策略模式(4)模式特點。策略類及其子類提供了一系列可重用的封裝算法,通過面向?qū)ο蟮亩鄳B(tài)、動態(tài)綁定技術(shù),對象在運行時根據(jù)需要在各個算法之間進(jìn)行切換。策略模式容易造成很多的策略類。(5)案例研究。策略類BinaryOperation包含兩抽象方法calculate和checkingCalculation,兩個實現(xiàn)具體策略的子類AdditionOperation和SubstractOperation分別實現(xiàn)了這兩個方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院963.7.2設(shè)計原則與設(shè)計模式2.迭代器模式(1)問題分析。在軟件構(gòu)建過程中要處理集合數(shù)據(jù),集合對象的內(nèi)部結(jié)構(gòu)變化各異。對于這些集合對象,希望在不暴露其內(nèi)部結(jié)構(gòu)的同時,讓外部客戶代碼透明地順序訪問其中的每個成員對象;同時也為同一種算法在多種集合對象上進(jìn)行操作提供可能。(2)解決思路。提供一種方法有效地按順序訪問一個聚合對象中的各個成員對象,而又不暴露該聚合對象的內(nèi)部表示。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院973.7.2設(shè)計原則與設(shè)計模式2.迭代器模式(3)設(shè)計結(jié)構(gòu)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院983.7.2設(shè)計原則與設(shè)計模式2.迭代器模式(4)模式特點。迭代抽象——訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示。迭代多態(tài)——為遍歷不同的集合結(jié)構(gòu)提供一個統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。健壯性考慮——遍歷的同時有可能更改迭代器所在的集合結(jié)構(gòu),導(dǎo)致問題。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院993.7.2設(shè)計原則與設(shè)計模式2.迭代器模式(5)案例研究。①Java的CollectionsFramework是迭代器模式的典型實現(xiàn)。它的接口Collection和Iterator分別對應(yīng)模式中的Aggregate和Iterator。②案例設(shè)計二中的策略3的封閉結(jié)構(gòu)可以視為迭代器模式的(變形的)應(yīng)用。Exercise封裝了ArrayList,BinaryOperation是ArrayList泛型的具體類型??蛻鬍xerciseSheet直接使

溫馨提示

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

評論

0/150

提交評論