軟件工程面向?qū)ο笤O(shè)計(jì)方法與法則.ppt_第1頁(yè)
軟件工程面向?qū)ο笤O(shè)計(jì)方法與法則.ppt_第2頁(yè)
軟件工程面向?qū)ο笤O(shè)計(jì)方法與法則.ppt_第3頁(yè)
軟件工程面向?qū)ο笤O(shè)計(jì)方法與法則.ppt_第4頁(yè)
軟件工程面向?qū)ο笤O(shè)計(jì)方法與法則.ppt_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

軟 件 工 程 第21講:面向?qū)ο笤O(shè)計(jì)方法與法則,主講人:陽王東 Email:,主要內(nèi)容,優(yōu)先使用(對(duì)象)組合,而非(類)繼承 針對(duì)接口編程,而非(接口的)實(shí)現(xiàn) 類的封閉性原則 開放封閉法則(OCP) Liskov替換法則(LSP),優(yōu)先使用(對(duì)象)組合,而非(類)繼承,組合 繼承 示例分析 練習(xí),組合的定義,定義 (對(duì)象)組合是一種通過創(chuàng)建一個(gè)組合了其它對(duì)象的對(duì)象,從而獲得新功能的復(fù)用方法。 將功能委托給所組合的一個(gè)對(duì)象,從而獲得新功能。 有些時(shí)候也稱之為“聚合”(aggregation)或“包容”(containment),盡管有些作者對(duì)這些術(shù)語賦予了專門的含義 兩種方式實(shí)現(xiàn) 根據(jù)引用(By reference) 根據(jù)值(By value),組合的優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn) 容器類僅能通過被包含對(duì)象的接口來對(duì)其進(jìn)行訪問。 “黑盒”復(fù)用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)對(duì)外是不可見。 對(duì)裝性好。 實(shí)現(xiàn)上的相互依賴性比較小。(譯者注:被包含對(duì)象與容器對(duì)象之間的依賴關(guān)系比較少) 每一個(gè)類只專注于一項(xiàng)任務(wù)。 通過獲取指向其它的具有相同類型的對(duì)象引用,可以在運(yùn)行期間動(dòng)態(tài)地定義(對(duì)象的)組合。 缺點(diǎn) 從而導(dǎo)致系統(tǒng)中的對(duì)象過多。 為了能將多個(gè)不同的對(duì)象作為組合塊(composition block)來使用,必須仔細(xì)地對(duì)接口進(jìn)行定義。,繼承的特點(diǎn),(類)繼承是一種通過擴(kuò)展一個(gè)已有對(duì)象的實(shí)現(xiàn),從而獲得新功能的復(fù)用方法。 泛化類(超類)可以顯式地捕獲那些公共的屬性和方法。 特殊類(子類)則通過附加屬性和方法來進(jìn)行實(shí)現(xiàn)的擴(kuò)展。,繼承的優(yōu)點(diǎn)和缺點(diǎn),優(yōu)點(diǎn) 容易進(jìn)行新的實(shí)現(xiàn),因?yàn)槠浯蠖鄶?shù)可繼承而來。 易于修改或擴(kuò)展那些被復(fù)用的實(shí)現(xiàn)。 缺點(diǎn) 破壞了封裝性,因?yàn)檫@會(huì)將父類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類。 “白盒”復(fù)用,因?yàn)楦割惖膬?nèi)部細(xì)節(jié)對(duì)于子類而言通常是可見的。 當(dāng)父類的實(shí)現(xiàn)更改時(shí),子類也不得不會(huì)隨之更改。 從父類繼承來的實(shí)現(xiàn)將不能在運(yùn)行期間進(jìn)行改變。,規(guī)則,僅當(dāng)下列的所有標(biāo)準(zhǔn)被滿足時(shí),方可使用繼承: 子類表達(dá)了“是一個(gè)的特殊類型”,而非“是一個(gè)由所扮演的角色”。 子類的一個(gè)實(shí)例永遠(yuǎn)不需要轉(zhuǎn)化(transmute)為其它類的一個(gè)對(duì)象。 子類是對(duì)其父類的職責(zé)(responsibility)進(jìn)行擴(kuò)展,而非重寫或廢除(nullify)。 子類沒有對(duì)那些僅作為一個(gè)工具類(utility class)的功能進(jìn)行擴(kuò)展。 對(duì)于一個(gè)位于實(shí)際的問題域(Problem Domain)的類而言,其子類特指一種角色(role),交易(transaction)或設(shè)備(device)。,示例分析,火車票售票系統(tǒng) 乘客是人所扮演的一種角色。代理人亦然。 隨著時(shí)間的發(fā)展,一個(gè)Person的子類實(shí)例可能會(huì)從Passenger轉(zhuǎn)變成Agent,再到Agent Passenger。,組合設(shè)計(jì)1,組合設(shè)計(jì)2,總結(jié),組合與繼承都是重要的重用方法 在OO開發(fā)的早期,繼承被過度地使用 隨著時(shí)間的發(fā)展,我們發(fā)現(xiàn)優(yōu)先使用組合可以獲得重用性與簡(jiǎn)單性更佳的設(shè)計(jì) 當(dāng)然可以通過繼承,以擴(kuò)充(enlarge)可用的組合類集(the set of composable classes)。 因此組合與繼承可以一起工作 但是我們的基本法則是: 優(yōu)先使用對(duì)象組合,而非(類)繼承,練習(xí),設(shè)計(jì)下列類的關(guān)系 人、學(xué)生、教師 本科、研究生 大一學(xué)生、大二學(xué)生、大三學(xué)生、大四學(xué)生 講師、教授,針對(duì)接口編程,而非(接口的)實(shí)現(xiàn),接口的特征 實(shí)現(xiàn)繼承和接口繼承 接口的好處 示例分析 練習(xí),接口的特征,接口是一個(gè)對(duì)象在對(duì)其它的對(duì)象進(jìn)行調(diào)用時(shí)所知道的方法集合。 一個(gè)對(duì)象可以有多個(gè)接口(實(shí)際上,接口是對(duì)象所有方法的一個(gè)子集) 類型是對(duì)象的一個(gè)特定的接口。 不同的對(duì)象可以具有相同的類型,而且一個(gè)對(duì)象可以具有多個(gè)不同的類型。 一個(gè)對(duì)象僅能通過其接口才會(huì)被其它對(duì)象所了解。 某種意義上,接口是以一種非常局限的方式,將“是一種”表達(dá)為“一種支持該接口的”。 接口是實(shí)現(xiàn)插件化(pluggability)的關(guān)鍵 接口表示“像”(LikeA)的關(guān)系,繼承表示“是”(IsA)的關(guān)系,組合表示“有”(HasA)的關(guān)系。,實(shí)現(xiàn)繼承和接口繼承,實(shí)現(xiàn)繼承(類繼承):一個(gè)對(duì)象的實(shí)現(xiàn)是根據(jù)另一個(gè)對(duì)象的實(shí)現(xiàn)來定義的。 接口繼承(子類型化):描述了一個(gè)對(duì)象可在什么時(shí)候被用來替代另一個(gè)對(duì)象。 C+的繼承機(jī)制既指類繼承,又指接口繼承。 C+通過繼承純虛類來實(shí)現(xiàn)接口繼承。 Java對(duì)接口繼承具有單獨(dú)的語言構(gòu)造方式Java接口。 Java接口構(gòu)造方式更加易于表達(dá)和實(shí)現(xiàn)那些專注于對(duì)象接口的設(shè)計(jì)。,接口的好處,優(yōu)點(diǎn) Client不必知道其使用對(duì)象的具體所屬類。 一個(gè)對(duì)象可以很容易地被(實(shí)現(xiàn)了相同接口的)的另一個(gè)對(duì)象所替換。 對(duì)象間的連接不必硬綁定(hardwire)到一個(gè)具體類的對(duì)象上,因此增加了靈活性。 松散藕合(loosens coupling)。 增加了重用的可能性。 提高了(對(duì)象)組合的機(jī)率,因?yàn)楸话瑢?duì)象可以是任何實(shí)現(xiàn)了一個(gè)指定接口的類。 缺點(diǎn) 設(shè)計(jì)的復(fù)雜性略有增加,接口定義,抽象的交通工具的定義,接口實(shí)現(xiàn),練習(xí),畫圖類的設(shè)計(jì) 實(shí)現(xiàn)畫圖功能 可以畫線、圓、長(zhǎng)方形、正方形、三角形等。,類的封閉性原則,完備性。一個(gè)類要完成一個(gè)獨(dú)立的業(yè)務(wù)過程,該類的內(nèi)部應(yīng)該定義了這個(gè)業(yè)務(wù)的整個(gè)過程,盡量不要在這個(gè)類定義了一些過程,而在另一個(gè)類中又定義了另外一些過程。 透明性。一個(gè)類要提供一項(xiàng)功能給其他的類復(fù)用,該項(xiàng)功能對(duì)其使用者是透明的,不但是在實(shí)現(xiàn)上是透明的,而且在使用上也是透明的。,封閉性原則在類繼承中運(yùn)用,類的繼承形式 直接繼承父類的方法實(shí)現(xiàn)復(fù)用 調(diào)用父類的方法構(gòu)成自己的方法實(shí)現(xiàn)復(fù)用 通過抽象方法來實(shí)現(xiàn)邏輯關(guān)系的復(fù)用,直接繼承父類的方法實(shí)現(xiàn)復(fù)用,public class Vechile protected void roll() /滾動(dòng)的實(shí)現(xiàn)代碼 public class Car extends Vechile public void driver() Car bmw=new Car(); bmw.driver(); bmw.roll();,最終調(diào)用者需要知道開動(dòng)汽車的所有操作方法,調(diào)用父類的方法構(gòu)成自己的方法實(shí)現(xiàn)復(fù)用,public class Car public void go() /實(shí)現(xiàn)驅(qū)動(dòng)功能代碼 roll();/調(diào)用父類的輪子滾動(dòng)方法 Car bmw=new Car(); bmw.go();,最終調(diào)用者只需知道一個(gè)開動(dòng)汽車的方法,子類中需要知道汽車開動(dòng)的操作流程,通過抽象方法來實(shí)現(xiàn)邏輯關(guān)系的復(fù)用,public class abstract Vechile private void roll /實(shí)現(xiàn)滾動(dòng)功能 /抽象的驅(qū)動(dòng)方法 protected abstract void drive(); /車輛的行駛邏輯方法 public void go() /驅(qū)動(dòng) drive(); /滾動(dòng) roll(); ,汽車的開動(dòng)過程在這里完全定義,符合完備性原則,public class Car extends Vechile /實(shí)現(xiàn)父類的抽象的驅(qū)動(dòng)方法 public void drive() /具體特有的驅(qū)動(dòng)功能代碼 Vechile vechiletest = new Car(); /調(diào)用車輛行駛功能 vechiletest.go();,子類只需要做自己的驅(qū)動(dòng)就行了,開放封閉法則(OCP),開放-封閉法則認(rèn)為我們應(yīng)該試圖去設(shè)計(jì)出永遠(yuǎn)也不需要改變的模塊。 我們可以添加新代碼來擴(kuò)展系統(tǒng)的行為。我們不能對(duì)已有的代碼進(jìn)行修改。 符合OCP的模塊需滿足兩個(gè)標(biāo)準(zhǔn): 可擴(kuò)展,即“對(duì)擴(kuò)展是開放的”(Open For Extension)模塊的行為可以被擴(kuò)展,以需要滿足新的需求。 不可更改,即“對(duì)更改是封閉的”(Closed for Modification)模塊的源代碼是不允許進(jìn)行改動(dòng)的。,OCP示例,設(shè)計(jì)要求 Purchase類的calculate方法要求在制訂的部件數(shù)組中計(jì)算各個(gè)部件價(jià)格的總和。 部件有顯示器、CPU、內(nèi)存、主板、硬盤、光驅(qū)、機(jī)箱、鍵盤、鼠標(biāo)等 初步設(shè)計(jì) 定義一個(gè)基類Part表示部件,所有具體部件都從Part繼承下來的子類 Part的定義為:,計(jì)算總價(jià)的實(shí)現(xiàn),但是在計(jì)算總價(jià)格時(shí),若財(cái)務(wù)部頒布主板和內(nèi)存應(yīng)使用額外費(fèi)用,改進(jìn)方案1,子類重載父類的方法:每當(dāng)計(jì)價(jià)策略發(fā)生改變,我們就修改Part的每個(gè)子類!,改進(jìn)的方案2,采用一個(gè)PricePolicy類,通過對(duì)其進(jìn)行繼承以提供不同的計(jì)價(jià)策略,改進(jìn)部件類,練習(xí),計(jì)算住房按揭

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論