大三下軟工設計原則_第1頁
大三下軟工設計原則_第2頁
大三下軟工設計原則_第3頁
大三下軟工設計原則_第4頁
大三下軟工設計原則_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、面向對象的設計原則-2-從問題開始!長方形與正方形假如我們有一個類:長方形(Rectangle)我們需要一個新的類,正方形(Square)問:可否直接繼承長方形?沒問題,因為數(shù)學上正方形就是長方形的子類!-3-開始設計:正方形public class Rectangle private int width; private int height; public void setWidth(int w) width = w; public int getWidth() return width; public void setHeight(int h) height = h; public in

2、t getHeight() return height; public class Square extends Rectangle public void setWidth(int w) super.setWidth (w); super.setHeight (w); public void setHeight(int h) super.setWidth (h); super.setHeight (h) ; -4-設計方案正確嗎?public static void resize(Rectangle r) while (r.getHeight() = r.getWidth() r.setHe

3、ight(r.getHeight() + 1); System.out.println(“Its OK.); Rectangle r1 = new Rectangle();r1.setHeight(5);r1.setWidth(15);resize(r1);Rectangle r2 = new Square();r2.setHeight(5);r2.setWidth(15);resize(r2);使用父類(長方形)時,程序正常運行使用子類(正方形)時,程序陷入死循環(huán)設計出問題了?繼承出問題了?-5-為什么會出現(xiàn)問題?違背了面向對象的設計原則!-6-面向對象的設計原則什么是面向對象設計原則?面向

4、對象設計原則有什么意義?是指導面向對象設計的基本指導思想是評價面向對象設計的價值觀體系是設計模式的出發(fā)點和歸宿-7-設計目標設計目標可擴展性 (Extensibility)靈活性 (Flexibility)可插入性 (Pluggability)-8-設計質量:好的設計什么是好的設計?容易理解容易修改和擴展容易復用容易實現(xiàn)與應用簡單、緊湊、經(jīng)濟適用讓人工作起來心情愉快的設計-9-設計質量:壞的設計什么是壞的設計?僵化性(Rigidity):剛性,難以修改,牽一發(fā)而動全身脆弱性(Fragility):易碎,牽一發(fā)而肝膽俱裂牢固性(Immobility):無法分解成可移植的組件粘滯性(Viscosi

5、ty),修改設計代價高昂不必要的復雜性(Needless Repetition)晦澀性(Opacity):不透明,很難看清設計者的真實意圖-10-設計質量:培養(yǎng)靈敏的嗅覺糟糕的設計總是散發(fā)出臭味,讓人不悅。判斷一個設計的好壞,主觀上能否讓你的合作方感到心情愉悅,是最直觀的標準設計開發(fā)人員要培養(yǎng)嗅覺,當你看到UML圖或者代碼,感到雜亂、繁瑣、郁悶的時候,你可能正面對一個糟糕的設計這種嗅覺是在實踐開發(fā)中培養(yǎng)起來的,而面向對象設計原則對此加以歸納和總結-11-面向對象的基本設計原則LSP:Liskov替換原則The Liskov Substitution PrincipleOCP:開放-封閉原則Th

6、e Open-Close PrincipleSRP:單一職責原則The Single Responsibility PrincipleISP:接口隔離原則The Interface Segregation Principle DIP:依賴倒置原則The Dependency Inversion Principle-12-LSPLSP(The Liskov Substitution Principle, Liskov替換原則) “若對于類型S的任一對象o1,均有類型T的對象o2存在,使得在T定義的所有程序P中,用o1替換o2之后,程序的行為不變,則S是T的子類型”如果在任何情況下,子類(或子類型

7、)或實現(xiàn)類與基類都是可以互換的,那么繼承的使用就是合適的。為了達到這一目標,子類不能添加任何父類沒有的附加約束“子類對象必須可以替換基類對象”-13-違背LSP原則Square類針對height、width添加了Rectangle所沒有的附加的約束(即要求height=width),這樣Square類(子類)不能完全替換Rectangle(父類)違背了LSP原則帶來潛在的設計問題(使用resize方法時,子類出錯!)-14-怎么辦?在可能的情況下,由抽象類(接口)繼承-15-抽象類與具體類只要有可能,不要從具體類繼承。行為集中的方向是向上的(抽象類)數(shù)據(jù)集中的方向是向下的(具體類)-16-解決

8、方案-17-IS-A關系的思考?鴕鳥是鳥嗎?是鴕鳥有翅膀,鳥也有翅膀鴕鳥有喙,鳥也有喙但是鳥.getFlySpeed()鴕鳥.getRunSpeed()有著不同-18-IS-A關系的思考(續(xù))對于動物學家只關心鳥的生理特征,對他們來說,鴕鳥就是鳥 對于養(yǎng)鳥人關心鳥的行為特征,鴕鳥不是鳥 他們都正確考慮一個特定設計是否恰當時,不能完全孤立地看這個解決方案,應該根據(jù)設計的使用者提出的合理假設來審視-19-OCPOCP(The Open-Close Principle, 開放-封閉原則)軟件實體(類、模塊、函數(shù)等)應該是可擴展的,但是不可修改的特征:對于擴展是開放的(Open for extensi

9、on)模塊的行為可以擴展,當應用的需求改變時,可以對模塊進行擴展,以滿足新的需求對于更改是封閉的(Closed for modification)對模塊行為擴展時,不必改動模塊的源代碼或二進制代碼-20-OCP的關鍵在于抽象OCP的關鍵在于抽象抽象技術:abstract class, Interface抽象預見了可能的所有擴展(閉)由抽象可以隨時導出新的類(開)-21-范例:手與門如何在程序中模擬用手去開門和關門?行為:開門(open)關門(close)判斷門的狀態(tài)(isOpened)-22-設計實現(xiàn)public class Door private boolean _isOpen=false

10、; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class Hand public Door door; void do() if (door.isOpen() door.close(); else door.open(); public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHa

11、nd.door = new Door(); myHand.do(); -23-新的需求需要手去開關抽屜,冰箱?我們只好去修改程序!-24-解決新的需求:修改設計public class Hand public Door door; public Drawer drawer; void do(int item) switch (item) case 1: if (door.isOpen() door.close(); else door.open(); break;case 2: if (drawer.isOpen() drawer.close(); else drawer.open(); br

12、eak; public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.door = new Door(); myHand.do(1); 手被改了!主(使用手)程序也被改了!-25-符合OCP的設計方案public interface Excutable public boolean isOpen(); public void open(); public void close();-26-新的實現(xiàn)public class Door implements Excutabl

13、e private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class Hand public Excutable item; void do() if (item.isOpen() item.close(); else item.open(); public class Drawer implements Excutable private boo

14、lean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; public class SmartTest public static void main(String args) Hand myHand = new Hand(); myHand.item = new Door(); myHand.do(); -27-public class Refrigerator implements

15、Excutable private boolean _isOpen = false; public boolean isOpen() return _isOpen; public void open() _isOpen = true; public void close() _isOpen = false; 新的需求需要手去開關冰箱?為冰箱實現(xiàn)Excutable接口不需要修改任何原有的設計和代碼-28-關于OCPOCP是OOD中很多說法的核心如果這個原則應用得有效,應用程序就會具有更多的可維護性、可重用性以及可健壯性LSP是OCP成為可能的主要原則之一正是子類型的可替換性才使得使用基類類型的模

16、塊在無需修改的情況下就可以擴展-29-SRPSRP(The Single Responsibility Principle, 單一職責原則)就一個類而言,應該僅有一個引起它變化的原因有關類的職責分配問題,是面向對象設計中最重要的基本原則“A critical, fundamental ability in OOA/D is to skillfully assign responsibility to software components.” Craig Larman-30-SRP本質SRP體現(xiàn)了內聚性(Cohesion)內聚性:一個模塊的組成元素之間的功能相關性類的職責定義為“變化的原因”,

17、每個職責都是變化的一個軸線;當需求變化時,該變化會反映為類的職責的變化如果一個類承擔了多于一個的職責,那么引起它變化的原因就會有多個-31-違反SRP的案例Rectangle類可能會因為兩方面的原因而變化:計算幾何方面的原因和用戶界面設計方面的原因。其中只一發(fā)生變化之后,必須修改Rectangle類,而這種修改則可能導致另一個應用程序出錯除此之外,違反SRP還會帶來物理依賴的缺點。-32-解決方案增加新的類,使得每個類僅有一個職責-33-ISPISP( The Interface Segregation Principle,接口隔離原則)客戶不應該依賴他們不用到的方法,只給每個客戶它所需要的接口為了避免“肥接口(fat interface)”,應當以一個類實現(xiàn)多個接口,而各客戶僅僅獲知必須的接口-34-接口污染需求:一扇能超時報警的門DoorOpen()Close()Timeout()當需要其它的門時習慣性從Door中繼承問題在哪兒?所有的門都擁有timeout接口,即便它不需要-35-解決方案:分離接口使用委托分離接口Adapter模式使用多重繼承分離接口-36-ISP本質使用多個

溫馨提示

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

評論

0/150

提交評論