亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

設計模式——設計原則

2019-11-10 20:45:48
字體:
來源:轉載
供稿:網友

面向對象原則、OOD和OOP概述

面向對象原則和OOD實際上是兩個不同的方面。

 面向對象原則:封裝、繼承、多態。

OOP指的是面向對象編程的基本原則和核心思路。在這里,OOP可以比作英語基礎語法,這些語法教你如何用單詞構造有意義且正確的句子,OOP教你在代碼中構造類,并在類里封裝屬性和方法,同時構造他們之間的層次關系。

現在假定你需要就某些主題寫幾篇文章或隨筆。你也希望就幾個你擅長主題寫幾本書。對寫好文章/隨筆或書來說,知道如何造句是不夠的。為了使讀者能更輕松的明白你講的內容,你需要寫更多的內容,學習以更好的方式解釋它。如果你想就某個主題寫一本書,如學習OOD,你知道如何把一個主題分為幾個子主題。你需要為這些題目寫幾章內容,也需要在這些章節中寫前言,簡介,例子和其他段落。 你需要為寫個整體框架,并學習一些很好的寫作技巧以便讀者能更容易明白你要說的內容。這就是整體規劃。

 

在軟件開發中,OOD是整體思路。在某種程度上,設計軟件時,你的類和代碼需能達到模塊化,可復用,且靈活,這些很不錯的指導原則不用你重新發明創造。而且有些原則你在自己的代碼中可能用到了。

為什么要OOD? 

軟件開發唯一的真理是“軟件一定會變化”。為什么?因為你的軟件解決的是現實生活中的業務問題,而現實生活中的業務流程總是在不停的變化。

假設你的軟件在今天工作的很好。但它能靈活的支持“變化”嗎?如果不能,那么你就沒有一個設計敏捷的軟件(一個設計敏捷的軟件能輕松應對變化,能被擴展,并且能被復用)。并且應用好OOD是做到敏捷設計的關鍵。

 

做到OOD的代碼需要滿足的條件:

1、面向對象

2、復用

3、能以最小的代價滿足變化

4、不用改變現有代碼滿足擴展

OOD最基本的原則

最基本的是叫做SOLID的5原則(感謝Uncle Bob,偉大OOD導師)。

S = 單一職責原則 Single Responsibility PRinciple

O = 開放閉合原則 Opened Closed Principle

L = Liscov替換原則 Liscov Substitution Principle

I = 接口隔離原則 Interface Segregation Principle

D = 依賴倒置原則 Dependency Inversion Principle

單一職責原則 Single Responsibility Principle

單一職責原則海報

海報上說:"并不是因為你能,你就應該做"。為什么?因為長遠來看它會帶來很多管理問題。

 

從面向對象角度解釋為:"引起類變化的因素永遠不要多于一個。"或者說"一個類有且只有一個職責"。這個原則是說,如果你的類有多于一個原因會導致它變化(或者多于一個職責),你需要依據它們的職責把這個類拆分為多個類。

當然可以在一個類中包含多個方法。問題是,他們都是為了一個目的。如今為什么拆分很重要?

 

那是因為:

 1、每個職責是軸向變化的;

 2、如果類包含多個職責,代碼會變得耦合;

 

看一下下面的類層次。

違反單一職責原則的類結構圖

 

這里,Rectangle類做了下面兩件事:

 1、計算矩形面積;

 2、在界面上繪制矩形;

 

并且,有兩個應用使用了Rectangle類:

 1、計算幾何應用程序用這個類計算面積;

 2、圖形程序用這個類在界面上繪制矩形;

 

Rectangle類做了兩件事。在一個方法里它計算了面積,在另外一個方法了它返回一個表示矩形的GUI。這會帶來一些有趣的問題:

1.在計算幾何應用程序中我們必須包含GUI。也就是在開發幾何應用時,我們必須引用GUI庫;

2.圖形應用中Rectangle類的變化可能導致計算幾何應用變化,編譯和測試,反之亦然;

 

應該依據職責拆分這個類,拆分職責到兩個不同的類中,如:

Rectangle:這個類應該定義Area()方法;

RectangleUI:這個類應繼承Rectangle類,并定義Draw()方法。

 

   SRP是把事物分離成分子部分,以便于能被復用和集中管理。我們也可以把SRP應用到方法之中,應當分解你的方法,讓每個方法只做某一項工作。那樣允許你復用方法,并且一旦出現變化,你能購以修改最少的代碼滿足變化。

開放閉合原則 Opened Closed Principle

從面向對象設計角度看,它可以這么說:"軟件實體(類,模塊,函數等等)應當對擴展開放,對修改閉合。"

通俗來講,它意味著你應當能在不修改類的前提下擴展一個類的行為。就好像我不需要改變我的身體而可以穿上衣服。

客戶端和服務段都耦合在一起。那么,只要出現任何變化,服務端變化了,客戶端一樣需要改變。

 在這個例子中,添加了一個抽象的服務器類,客戶端包含一個抽象類的引用,具體的服務類實現了抽象服務類。那么,因任何原因引起服務實現發生變化時,客戶端都不需要任何改變。

 

這里抽象服務類對修改是閉合的,實體類的實現對擴展是開放的。

 

抽象是關鍵,基本上,你抽象的東西是你系統的核心內容,如果你抽象的好,很可能在擴展功能時它不需要任何修改(就像服務是一個抽象概念)。如果在實現里定義了抽象的東西(比如IIS服務器實現的服務),代碼要盡可能以抽象(服務)為依據。這會允許你擴展抽象事物,定義一個新的實現(如Apache服務器)而不需要修改任何客戶端代碼。

Liscov替換原則 Liscov Substitution Principle

這個原則意思是:"子類型必須能夠替換它們父類型。"或者換個說法:"使用父類引用的函數必須能使用子類的對象而不必知道它。"

在基本的面向對象原則里,"繼承"通常是"is a"的關系。如果"Developer" 是一個"SoftwareProfessional",那么"Developer"類應當繼承"SoftwareProfessional"類。在類設計中"Is a"關系非常重要,但它容易沖昏頭腦,結果使用錯誤的繼承造成錯誤設計。

 

"Liskov替換原則"正是保證繼承能夠被正確使用的方法。

這里,KingFisher類擴展了Bird基類,并繼承了Fly()方法,這看起來沒問題。

 

   現在看下面的例子:

Ostrich(鴕鳥)是一種鳥(顯然是),并從Bird類繼承。它能飛嗎?不能,這個設計就違反了LSP。

 

所以,即使在現實中看起來沒問題,在類設計中,Ostrich不應該從Bird類繼承,這里應該從Bird中分離一個不會飛的類,Ostrich應該繼承與它。

 

為什么LSP這么重要:

如果沒有LSP,類繼承就會混亂;如果子類作為一個參數傳遞給方法,將會出現未知行為;

如果沒有LSP,適用與基類的單元測試將不能成功用于測試子類;

接口隔離原則 Interface Segregation Principle

它的意思是:"客戶端不應該被迫依賴于它們不用的接口。"

假設你想買個電視機,你有兩個選擇。一個有很多開關和按鈕,它們看起來很混亂,且好像對你來說沒必要。另一個只有幾個開關和按鈕,它們很友好,且適合你使用。假定兩個電視機提供同樣的功能,你會選哪一個?答:第二個,因為我不需要那些看起來混亂又對我沒用的開關和按鈕。

以便外部能夠知道這些類有哪些可用的功能,客戶端代碼也能根據接口來設計.現在,如果接口太大,包含很多暴露的方法,在外界看來會很混亂.接口包含太多的方法也使其可用性降低,像這種包含了無用方法的"胖接口"會增加類之間的耦合.你通過接口暴露類的功能,同樣地,假設你有一些類,如果一個類想實現該接口,那么它需要實現所有的方法,盡管有些對它來說可能完全沒用.所以說這么做會在系統中引入不必要的復雜度,降低可維護性或魯棒性.

 

接口隔離原則確保實現的接口有他們共同的職責,它們是明確的,易理解的,可復用的.

 

接口應該僅包含必要的方法,而不該包含其它的。

注意到IBird接口包含很多鳥類的行為,包括Fly()行為.現在如果一個Bird類(如Ostrich)實現了這個接口,那么它需要實現不必要的Fly()行為(Ostrich不會飛).

所以,這個"胖接口"應該拆分未兩個不同的接口,IBird和IFlyingBird,IFlyingBird繼承自IBird.

 這里如果一種鳥不會飛(如Ostrich),那它實現IBird接口。如果一種鳥會飛(如KingFisher),那么它實現IFlyingBird.

 

    所以回頭看包含了很多開關和按鈕的電視機的例子,電視機制造商應該有一個電視機的圖紙,開關和按鈕都在這個方案里。不論任何時候,當他們向制造一種新款電視機時,如果他們想復用這個圖紙,他們將需要在這個方案里添加更多的開關和按鈕。那么他們將沒法復用這個方案。如果他們確實需要復用方案,它們應當把電視機的圖紙份為更小部分,以便在任何需要造新款電視機的時候復用這點小部分。

依賴倒置原則 Dependency Inversion Principle

它的意思是:高層模塊不應該依賴底層模塊,兩者都應該依賴其抽象。

考慮一個現實中的例子。你的汽車是由很多如引擎,車輪,空調和其它等部件組成。

它們沒有一個是嚴格的構建在一個單一單元里;換句話說,它們都是可插拔的,因此當引擎或車輪出問題時,你可以修理它(而不需要修理其它部件),甚至可以換一個。

在替換時,你僅需要確保引擎或車輪符合汽車的設計(如汽車能使用任何1500CC的引擎或任何18寸的車輪)。

 

當然,汽車也可能允許你在1500CC引擎的地方安裝一個2000CC的引擎,事實上對某些制造商(如豐田汽車)是一樣的。

如果你的汽車的零部件不具備可插拔性會有什么不同?那會很可怕!因為如果汽車的引擎出故障了,你可能修理整部車或者需要買一個新的。

 

如何做到"可插拔性"呢?關鍵就是抽象。

在現實中,汽車是高級模塊或實體,它依賴于低級模塊或實體,如引擎或車輪。相比直接依賴于引擎或車輪,汽車應依賴于某些抽象的有規格的引擎或車輪,以便于如果任何引擎或車輪符合抽象,那么它們都能組合到汽車中,汽車也能跑動。

注意到上面Car類有兩個屬性,它們都是抽象類型(接口)。引擎和車輪是可插拔的,因為汽車能接受任何實現了聲明接口的對象,并且Car類不需要做任何改動。

 

如果代碼中不用依賴倒置,我們將面臨如下風險:

1、使用低級類會破環高級代碼;

2、當低級類變化時需要很多時間和代價來修改高級代碼;

3、產生低復用的代碼;

其他面向對象原則

除SOLID原則外還有很多其它的面向對象原則。如:

"組合替代繼承":這是說相對于繼承,要更傾向于使用組合;

"笛米特法則":這是說"你的類對其它類知道的越少越好";

"共同封閉原則":這是說"相關類應該打包在一起";

"穩定抽象原則":這是說"類越穩定,越應該由抽象類組成";

 

設計模式只是對一些經常出現的場景的一些通用設計建議。這些靈感主要來自于面向對象原則。你可以把設計模式看作"框架",把OOD原則看作"規范".


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩另类在线| 日韩视频免费观看| 欧美激情国产日韩精品一区18| 亚洲精品美女在线观看| 久久精品国产亚洲精品| 操91在线视频| 亚洲欧美日韩视频一区| 91黑丝在线观看| 欧美一级黑人aaaaaaa做受| 久久国产精品久久国产精品| 欧美高清无遮挡| 久久久久久久一区二区三区| 国产精品久久久久久亚洲影视| 日韩国产精品亚洲а∨天堂免| 欧美高跟鞋交xxxxhd| 国产精品成av人在线视午夜片| 成人久久一区二区三区| 丝袜一区二区三区| 在线精品国产欧美| 国产一区二区三区直播精品电影| 一区二区三区四区精品| 国产精品福利在线观看网址| 欧美成人精品影院| 久久久免费观看视频| 日韩专区中文字幕| 亚洲老头老太hd| 色综合影院在线| 欧美性猛交xxxxx免费看| 中文日韩电影网站| 欧美日韩美女在线观看| 亚洲图片欧美日产| 日韩美女免费视频| 奇米4444一区二区三区| 5566日本婷婷色中文字幕97| 欧美有码在线观看| 国产精品精品视频一区二区三区| 久久天天躁狠狠躁夜夜躁2014| 亚洲精品综合精品自拍| 欧美成人精品一区二区三区| 日韩中文字幕网址| 日韩欧美精品免费在线| 91产国在线观看动作片喷水| 成人a视频在线观看| 久久综合免费视频影院| 国产精品久久久久久av下载红粉| 久久九九热免费视频| 亚洲新声在线观看| 亚洲性视频网站| 亚洲999一在线观看www| 国产mv久久久| 日韩美女视频中文字幕| 国产精品美女在线观看| 久久久国产一区二区三区| 成人有码在线播放| 国产精品久久久久999| 亚洲人午夜精品免费| 国产区精品视频| 久久精品国产一区二区电影| 人九九综合九九宗合| 国产精品久久久久影院日本| 欧美综合第一页| 亚洲va国产va天堂va久久| 欧美床上激情在线观看| 一区二区三欧美| 日韩在线视频二区| 中文字幕视频一区二区在线有码| 国产精品国内视频| 久久资源免费视频| 91sao在线观看国产| 国产精品视频中文字幕91| 久久免费观看视频| 国产视频亚洲精品| 日韩av理论片| 亚洲自拍高清视频网站| 日韩精品在线播放| 精品久久中文字幕久久av| 欧美日韩aaaa| 国产不卡在线观看| 国产精品成人一区二区三区吃奶| 91精品中国老女人| 成人乱人伦精品视频在线观看| 亚洲国产精品电影在线观看| 精品国产鲁一鲁一区二区张丽| 久久久视频在线| 中文字幕亚洲一区二区三区五十路| 久久免费精品日本久久中文字幕| 综合激情国产一区| 国产香蕉一区二区三区在线视频| 久久精视频免费在线久久完整在线看| 欧美一区二区三区四区在线| 国产一区二区三区在线看| 亚洲人成电影在线| 国产精品视频免费在线观看| 在线亚洲欧美视频| 欧美视频不卡中文| 97涩涩爰在线观看亚洲| 日韩中文在线中文网三级| 欧美日韩国产成人| 国产精品久久久久秋霞鲁丝| 成人免费网视频| 国产经典一区二区| 国产精品久久久久久久美男| 日韩专区中文字幕| 欧美极品少妇xxxxⅹ喷水| 国产欧美日韩精品在线观看| 成人激情视频在线观看| 大伊人狠狠躁夜夜躁av一区| 日韩av在线免费播放| www.日韩av.com| 国语自产精品视频在免费| 欧美裸体xxxx极品少妇软件| 国产精品欧美风情| 精品久久香蕉国产线看观看亚洲| 欧美自拍视频在线| 欧美精品亚州精品| 久久久久久久色| 欧美特黄级在线| 亚洲欧美中文另类| 欧美国产视频一区二区| 日韩中文视频免费在线观看| 国产美女精彩久久| 国产欧美日韩精品在线观看| 九九九久久国产免费| 欧美肥臀大乳一区二区免费视频| 狠狠色狠狠色综合日日小说| 亚洲美女在线视频| 日韩av在线高清| 亚洲全黄一级网站| xvideos国产精品| 91久久精品国产91久久| 欧美精品videossex88| 国产精品伦子伦免费视频| 成人网在线免费看| 亚洲aⅴ男人的天堂在线观看| 日韩av网站导航| 在线精品高清中文字幕| 亚洲人成电影网站色…| 国产精品久久久久久久久久久久久久| 成人福利网站在线观看| 亚洲片国产一区一级在线观看| 中文国产亚洲喷潮| 成人精品久久一区二区三区| 精品久久久久国产| 日本午夜精品理论片a级appf发布| 九九精品视频在线观看| 久久人人爽人人爽人人片av高清| 亚洲色图25p| 亚洲国产古装精品网站| 亚洲激情电影中文字幕| 尤物精品国产第一福利三区| 成人精品一区二区三区| 大荫蒂欧美视频另类xxxx| 国产精品久久久久久久av大片| 日韩精品在线免费观看视频| 国产成人精品综合| 国产精品丝袜白浆摸在线| 国产欧美中文字幕| 亚洲欧美另类在线观看| 久久精品亚洲热| 中文字幕亚洲欧美日韩2019| 欧美极品少妇xxxxⅹ免费视频| 久久久免费电影| 精品久久久久久久久久久久| 色综合影院在线|