敏捷軟件開發(fā)第五講開閉原則與里氏替換原則ppt課件_第1頁
敏捷軟件開發(fā)第五講開閉原則與里氏替換原則ppt課件_第2頁
敏捷軟件開發(fā)第五講開閉原則與里氏替換原則ppt課件_第3頁
敏捷軟件開發(fā)第五講開閉原則與里氏替換原則ppt課件_第4頁
敏捷軟件開發(fā)第五講開閉原則與里氏替換原則ppt課件_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、廣州大學(xué)華軟軟件學(xué)院軟件工程系主講教師:譚翔緯答疑時(shí)間:周三 10:30-12:00 周四 9:00-12:00Tel:660028Email:第五講:開閉原則與里氏替換原則目錄目錄n開放開放封閉原則封閉原則OCP)nOCP編程實(shí)例編程實(shí)例nOCP原則實(shí)施要點(diǎn)原則實(shí)施要點(diǎn)nLiskov替換原則替換原則nLiskov原則實(shí)施要點(diǎn)原則實(shí)施要點(diǎn)n總結(jié)總結(jié)開放封閉原則OCP) 什么是軟件開發(fā)過程中最不穩(wěn)定的因素? 答案是需求!需求在軟件開發(fā)過程中時(shí)時(shí)刻刻都可能發(fā)生變化。那么,如何靈活應(yīng)對(duì)變化是軟件結(jié)構(gòu)設(shè)計(jì)中最重要也是最困難的一個(gè)問題。好的設(shè)計(jì)帶來了極大了靈活性,不好的設(shè)計(jì)則充斥著僵化的臭味。所以我們要

2、遵循開放封閉原則OCP。開放封閉原則OCP) Bertrand Meyer,面向?qū)ο蠹夹g(shù)大師,發(fā)明了Eiffel 語言和按契約設(shè)計(jì)Design by Contract的思想,名著的作者,法國(guó)工程院院士。目前,他除了擔(dān)任Eiffel環(huán)境和工具開發(fā)公司ISE的CTO之外,還是愛因斯坦的母校蘇黎世聯(lián)邦工學(xué)院計(jì)算機(jī)科學(xué)系教授,擔(dān)任軟件工程項(xiàng)目主席,同時(shí)還在澳大利亞Monash大學(xué)任教。他于1988年提出了著名的開放封閉原則OCP)。開放封閉原則的現(xiàn)實(shí)意義開放封閉原則OCP,Open Closed Principle是所有面向?qū)ο笤瓌t的核心。軟件設(shè)計(jì)本身所追求的目標(biāo)就是封裝變化、降低耦合。而開放封閉原則

3、正是對(duì)這一目標(biāo)的最直接體現(xiàn)。其他的設(shè)計(jì)原則,很多時(shí)候是為實(shí)現(xiàn)這一目標(biāo)服務(wù)的,例如后面將介紹的Liskov替換原則實(shí)現(xiàn)最佳的、正確的繼承層次,就能保證不會(huì)違反開放封閉原則。OCP核心的思想是:軟件實(shí)體應(yīng)該是可擴(kuò)展,而不可修改的。也就是說,對(duì)擴(kuò)展是開放的,而對(duì)修改是封閉的。OCP特征 軟件實(shí)體類、模塊、函數(shù)等應(yīng)該是可擴(kuò)展的,但是不可修改的。OCP有兩大特征:對(duì)于擴(kuò)展是開放的Open for extension) 模塊的行為可以擴(kuò)展,當(dāng)應(yīng)用的需求改變時(shí),可以對(duì)模塊進(jìn)行擴(kuò)展,以滿足新的需求。對(duì)于更改是封閉的Closed for modification) 對(duì)模塊行為擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或二進(jìn)制

4、代碼。OCP的關(guān)鍵在于抽象lOCP的關(guān)鍵在于抽象l抽象技術(shù):abstract class, Interfacel抽象預(yù)見了可能的所有擴(kuò)展閉)l由抽象可以隨時(shí)導(dǎo)出新的類開)ClientServerServerClient InterfaceClient范例:手與門l如何在程序中模擬用手去開門和關(guān)門?l行為:l開門open)l關(guān)門close)l判斷門的狀態(tài)isOpened)設(shè)計(jì)實(shí)現(xiàn)新的需求解決新的需求:修改設(shè)計(jì)符合OCP的設(shè)計(jì)方案新的實(shí)現(xiàn)新的需求OCP原則實(shí)施要點(diǎn)l預(yù)測(cè)變化和預(yù)測(cè)變化和“貼切的構(gòu)造貼切的構(gòu)造l 上述的例子其實(shí)并不是完全封閉的,如果手上述的例子其實(shí)并不是完全封閉的,如果手增加了新的動(dòng)

5、作,例如搬運(yùn),很多地方還是會(huì)有增加了新的動(dòng)作,例如搬運(yùn),很多地方還是會(huì)有改動(dòng)變化。那么原來所選定的抽象對(duì)于這種變化改動(dòng)變化。那么原來所選定的抽象對(duì)于這種變化來說反到成為一種障礙。來說反到成為一種障礙。l 一般而言,無論模塊是多么的一般而言,無論模塊是多么的“封鎖封鎖”,都會(huì)存在一些無法對(duì)之封閉的變化。沒有對(duì)于所都會(huì)存在一些無法對(duì)之封閉的變化。沒有對(duì)于所有的情況都貼切的模型。有的情況都貼切的模型。l 設(shè)計(jì)人員必須對(duì)于他們?cè)O(shè)計(jì)的模塊應(yīng)該對(duì)設(shè)計(jì)人員必須對(duì)于他們?cè)O(shè)計(jì)的模塊應(yīng)該對(duì)哪種變化封閉做出選擇。哪種變化封閉做出選擇。 必須先猜測(cè)出最有可能必須先猜測(cè)出最有可能發(fā)生的變化種類,然后構(gòu)造抽象來隔離變化。

6、發(fā)生的變化種類,然后構(gòu)造抽象來隔離變化。OCP原則實(shí)施要點(diǎn)l要避免進(jìn)行多余的抽象要避免進(jìn)行多余的抽象l 遵循遵循OCPOCP的代價(jià)也是昂貴的。創(chuàng)建正確的抽的代價(jià)也是昂貴的。創(chuàng)建正確的抽象是要花費(fèi)時(shí)間和精力的。同時(shí)這些抽象也增加象是要花費(fèi)時(shí)間和精力的。同時(shí)這些抽象也增加了軟件的復(fù)雜性。因此,開閉原則很難被完全實(shí)了軟件的復(fù)雜性。因此,開閉原則很難被完全實(shí)現(xiàn),只能在某些模塊、某種程度上、某個(gè)限度內(nèi)現(xiàn),只能在某些模塊、某種程度上、某個(gè)限度內(nèi)符合符合OCPOCP的要求。所以可以說,的要求。所以可以說,OCPOCP具有理想主義具有理想主義的色彩,是的色彩,是OODOOD的終極目標(biāo)。的終極目標(biāo)。l 在項(xiàng)目很

7、緊張的情況下,一般只會(huì)對(duì)能百在項(xiàng)目很緊張的情況下,一般只會(huì)對(duì)能百分之百預(yù)測(cè)到的變化經(jīng)行抽象,而且要是那種會(huì)分之百預(yù)測(cè)到的變化經(jīng)行抽象,而且要是那種會(huì)經(jīng)常發(fā)生變化的部分才進(jìn)行抽象。經(jīng)常發(fā)生變化的部分才進(jìn)行抽象。OCP原則實(shí)施要點(diǎn)l隔離變化的手段隔離變化的手段l1. 1. “只受一次愚弄只受一次愚弄”l 這意味著在我們最初編寫代碼時(shí),假設(shè)變化這意味著在我們最初編寫代碼時(shí),假設(shè)變化不會(huì)發(fā)生;當(dāng)變化發(fā)生時(shí),我們就創(chuàng)建抽象來隔不會(huì)發(fā)生;當(dāng)變化發(fā)生時(shí),我們就創(chuàng)建抽象來隔離以后發(fā)生的同類變化。離以后發(fā)生的同類變化。l2. 2. 刺激變化。刺激變化。l我們首先編寫測(cè)試我們首先編寫測(cè)試l我們使用很短的迭代周期進(jìn)

8、行開發(fā)我們使用很短的迭代周期進(jìn)行開發(fā)一個(gè)周期一個(gè)周期為幾天而不是幾周為幾天而不是幾周l我們?cè)诩尤牖A(chǔ)結(jié)構(gòu)之前就開發(fā)特性,并且經(jīng)常我們?cè)诩尤牖A(chǔ)結(jié)構(gòu)之前就開發(fā)特性,并且經(jīng)常性的把那些特性展示給涉眾性的把那些特性展示給涉眾l我們首先開發(fā)最重要的特性我們首先開發(fā)最重要的特性l盡早的、經(jīng)常的發(fā)布軟件盡早的、經(jīng)常的發(fā)布軟件Liskov替換原則LSP)lLSPLSPThe Liskov Substitution Principle, LiskovThe Liskov Substitution Principle, Liskov替換替換原則)原則) l“若對(duì)于類型若對(duì)于類型S S的任一對(duì)象的任一對(duì)象o1o1

9、,均有類型,均有類型T T的對(duì)象的對(duì)象o2o2存在,存在,使得在使得在T T定義的所有程序定義的所有程序P P中,用中,用o1o1替換替換o2o2之后,程序的行之后,程序的行為不變,則為不變,則S S是是T T的子類型的子類型”p如果在任何情況下,子類或子類型如果在任何情況下,子類或子類型或?qū)崿F(xiàn)類與基類都是可以互換的,或?qū)崿F(xiàn)類與基類都是可以互換的,那么繼承的使用就是合適的。為了達(dá)那么繼承的使用就是合適的。為了達(dá)到這一目標(biāo),子類不能添加任何父類到這一目標(biāo),子類不能添加任何父類沒有的附加約束沒有的附加約束p“子類對(duì)象必須可以替換父類對(duì)象子類對(duì)象必須可以替換父類對(duì)象”從問題開始!l長(zhǎng)方形與正方形長(zhǎng)方

10、形與正方形l假如我們有一個(gè)類:長(zhǎng)方形假如我們有一個(gè)類:長(zhǎng)方形RectangleRectangle)l我們需要一個(gè)新的類,正方形我們需要一個(gè)新的類,正方形SquareSquare)l問:可否直接繼承長(zhǎng)方形?問:可否直接繼承長(zhǎng)方形?開始設(shè)計(jì):正方形設(shè)計(jì)方案正確嗎?違背LSP原則-23-怎么辦?ABABC-24-解決方案IS-A關(guān)系的思考?l鴕鳥是鳥嗎?是l鴕鳥有翅膀,鳥也有翅膀l鴕鳥有喙,鳥也有喙l但是l鳥.getFlySpeed()l鴕鳥.getRunSpeed()l有著不同l結(jié)論:IS-A應(yīng)當(dāng)是關(guān)于行為的。lLSP清晰的指出,OOD中ISA關(guān)系是就行為方式而言的,行為方式是可以進(jìn)行合理假設(shè)的,

11、是客戶程序所依賴的。IS-A關(guān)系的思考(續(xù))l對(duì)于動(dòng)物學(xué)家l只關(guān)心鳥的生理特征,對(duì)他們來說,鴕鳥就是鳥l 對(duì)于養(yǎng)鳥人l關(guān)心鳥的行為特征,鴕鳥不是鳥l 他們都正確l考慮一個(gè)特定設(shè)計(jì)是否恰當(dāng)時(shí),不能完全孤立地看這個(gè)解決方案,應(yīng)該根據(jù)設(shè)計(jì)的使用者提出的合理假設(shè)來審視。抽象類與具體類具體類3具體類3抽象類1抽象類1抽象類2抽象類2具體類1具體類1抽象類3抽象類3具體類2具體類2LSP原則實(shí)施要點(diǎn)l 一個(gè)模型,如果孤立的看,并不具有真正意義上的有效性。模型的有效性只能通過它的客戶程序來表現(xiàn)。l 有誰知道設(shè)計(jì)的使用者會(huì)做出什么樣的合理假設(shè)呢?大多數(shù)這樣的假設(shè)都很難預(yù)測(cè)。事實(shí)上,如果試圖去預(yù)測(cè)所有這些假設(shè),

12、我們所得到的系統(tǒng)很可能會(huì)充滿不必要的復(fù)雜性的臭味。l 因此,像OCP原則一樣通常最好的辦法就是只預(yù)測(cè)那些最明顯的對(duì)于LSP的違反情況,而推遲所有其它的預(yù)測(cè),直到出現(xiàn)相關(guān)的脆弱性的臭味時(shí),才去處理它們。LSP原則實(shí)施要點(diǎn)l基于契約設(shè)計(jì)l 基于契約設(shè)計(jì)DBC:Design By Contract)。使用DBC,類的編寫者能夠顯式的規(guī)定針對(duì)該類的契約。客戶代碼的編寫者可以通過該契約獲悉可以依賴的行為方式。契約是通過為每個(gè)方法聲明的前置條件preconditions)和后置條件postconditions)來指定的。要使一個(gè)方法得以執(zhí)行,前置條件必須要為真。執(zhí)行完畢后,該方法要保證后置條件為真。LSP

13、原則實(shí)施要點(diǎn)l在單元測(cè)試中指定契約l 也可以通過編寫單元測(cè)試的方式來指定契約??蛻舸a編寫者會(huì)去查看這些單元測(cè)試,這樣他們就可以知道對(duì)于要使用的類,應(yīng)該做什么合理的假設(shè)。LSP原則實(shí)施要點(diǎn)l啟發(fā)式規(guī)則l1.派生類中的退化函數(shù)l 在基類中實(shí)現(xiàn)了f()方法,在派生類中的函數(shù)f()就是退化的,派生類中的退化函數(shù)并不總表示為違反LSP,但是當(dāng)存在這種情況時(shí),還是值得注意一下的。l2.從派生類中拋出異常l 在派生類的方法中添加了其基類不會(huì)拋出的異常。如果基類的使用者不期望這些異常,那么把它們添加到派生類的方法中就會(huì)導(dǎo)致不可替換性。此時(shí)要遵循LSP,要么就必須改變使用者的期望,要么派生類就不應(yīng)該拋出這些異

14、常。LSP原則實(shí)施要點(diǎn) 里氏替換原則通俗的來講就是: 子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。下面是幾種常用的遵循LSP的實(shí)施方法:子類可以實(shí)現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。子類中可以增加自己特有的方法。當(dāng)子類的方法重載父類的方法時(shí),方法的前置條件即方法的形參要比父類方法的輸入?yún)?shù)更寬松。當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件即方法的返回值要比父類更嚴(yán)格??偨Y(jié) 在許多方面,OCP是面向?qū)ο笤O(shè)計(jì)的核心所在。遵循這個(gè)原則可以帶來面向?qū)ο蠹夹g(shù)所聲稱的巨大好處也就是:靈活性、可重用性以及可維護(hù)性)。然而,并 不是說只要使用一種面向?qū)ο笳Z言就是遵循了這個(gè)原則。對(duì)于應(yīng)用程序中的每個(gè)部分都肆意地進(jìn)行抽象同樣不是一個(gè)好主意。正確的做法是,開發(fā)人員應(yīng)該僅僅對(duì)程 序中呈現(xiàn)出頻繁

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論