




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、授課:李遠(yuǎn)輝,類設(shè)計(jì)的基本經(jīng)驗(yàn) OO設(shè)計(jì)原則,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,1、類要單一 2、加強(qiáng)內(nèi)聚,松散耦合 3、好的封裝性 4、類的粒度要合理 5、實(shí)現(xiàn)類不能依賴它的使用類 6、應(yīng)考慮靈活性,也就是可配置、可維護(hù) 可配置:可以通過修改配置文件來選擇系統(tǒng)提供的功能 可維護(hù):可以很方便地修改功能,容易定位bug,功能隔離較好,不會(huì)牽一發(fā)而動(dòng)全身,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,7、要考慮性能、考慮可伸縮性 綜合性能、性能定點(diǎn)、性能拐點(diǎn),軟件的體系結(jié)構(gòu)決定了性能的頂點(diǎn) 8、要考慮今后可能的變
2、化,也就是可擴(kuò)展性 9、要考慮合理的復(fù)用 10、要合理地考慮接口和抽象類的使用 優(yōu)先使用接口,抽象類既要約束子類的行為,又要為子類提供公共的功能。 11、盡量減少類與協(xié)作類的交互次數(shù)和交互信息的量 12、父類不應(yīng)知道子類的信息,子類必須知道父類的信息 13、更多地使用類的組合,而不是繼承 14、訪問對(duì)象必須通過接口,不能繞過接口直接去訪問。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,面向?qū)ο蟮脑O(shè)計(jì)原則 (1)單一職責(zé)原則:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起變化的原因。 (2)開放-封閉原則:軟件實(shí)體應(yīng)該是可以擴(kuò)展的,但是不可修改。 (3)替換原則:子類應(yīng)該能夠替換他的父類
3、。 (4)依賴倒置原則:抽象不應(yīng)該以來細(xì)節(jié),細(xì)節(jié)應(yīng)該以來抽象 (5)接口隔離原則:不應(yīng)強(qiáng)迫用戶依賴他們不用的方法,接口屬于客戶,不屬于他所在的類層次。 (6)重用發(fā)布等價(jià)原則:重用的粒度就是發(fā)布的粒度。 (7)共同封閉原則:包所有類應(yīng)該對(duì)于同一類性質(zhì)的變化應(yīng)該是共同封閉的。 (8)共同重用原則:一個(gè)包中的所有類應(yīng)該是共同重用的。如果重用包中的一個(gè)類,就應(yīng)該重用包中所有類。 (9)無環(huán)依賴原則:在包的依賴圖中不應(yīng)該存在環(huán)。 (10)穩(wěn)定依賴原則:朝著穩(wěn)定依賴的方向進(jìn)行依賴。 (11)穩(wěn)定抽象原則:包的抽象程度應(yīng)該和依賴的程度一致。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教
4、程,依賴是和變化緊密聯(lián)系在一起的概念。 由于依賴關(guān)系的存在,變化在某處發(fā)生時(shí),影響會(huì)波及開來,造成很多修改工作,這就是依賴的危害??梢哉f變化是始作俑者,依賴是助紂為虐。我們可以不去擁抱變化嗎?不可以。未來將是越來越不可預(yù)測,這是新經(jīng)濟(jì)最具挑戰(zhàn)性的方面之一。商務(wù)和技術(shù)上的瞬息萬變會(huì)產(chǎn)生變化,這既可以看作要防范的威脅,也可以看作應(yīng)該歡迎的機(jī)遇。既然變化不可避免,我們所能做的就是處理好依賴關(guān)系,將變化造成的影響波及范圍盡量減小。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,單 一職責(zé)原則(Single-Resposibility Principle)。 對(duì)一個(gè)類而言,應(yīng)該僅有
5、一個(gè)引起它變化的原因。本原則是我們非常熟悉地高內(nèi)聚性原則的引申,但是通過將職責(zé)極具創(chuàng)意地 定義為變化的原因,使得本原則極具操作性,盡顯大師風(fēng)范。同時(shí),本原則還揭示了內(nèi)聚性和耦合生,基本途徑就是提高內(nèi)聚性;如果一個(gè)類承擔(dān)的職責(zé)過多, 那么這些職責(zé)就會(huì)相互依賴,一個(gè)職責(zé)的變化可能會(huì)影響另一個(gè)職責(zé)的履行。其實(shí)OOD的實(shí)質(zhì),就是合理地進(jìn)行類的職責(zé)分配。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,開放封閉原則 (Open-Closed principle)。 軟件實(shí)體應(yīng)該是可以擴(kuò)展的,但是不可修改。本原則緊緊圍繞變化展開,變化來臨時(shí),如果不必改動(dòng)軟件實(shí)體裁的源代碼,就能擴(kuò)充它
6、的行為,那么這個(gè)軟件實(shí)體設(shè)計(jì)就是滿足開放封閉原則的。如果說我們預(yù)測到某種變化,或者某種變化發(fā)生了,我們應(yīng)當(dāng)創(chuàng)建抽象類來隔離以后發(fā)生的同類變化。在 Java中,這種抽象是指抽象基類或接口;在C+中,這各抽象是指抽象基類或純抽象基類。當(dāng)然,沒有對(duì)所有情況都貼切的模型,我們必須對(duì)軟件實(shí)體應(yīng)該面 對(duì)的變化做出選擇。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,Liskov替換原則(Liskov-Substituion Principle)。 子類型必須能夠替換掉它們的基類型。本原則和開放封閉原則關(guān)系密切,正是子類型的可替換性,才使得使用基類型模塊無需修改就可 擴(kuò)充。Liskov
7、替換原則從基于契約的設(shè)計(jì)演化而來,契約通過為每個(gè)方法聲明先驗(yàn)條件和后驗(yàn)條件;定義子類時(shí),必須遵守這些先驗(yàn)條件和后 驗(yàn)條件。當(dāng)前基于契的設(shè)計(jì)發(fā)展勢頭正勁,對(duì)實(shí)現(xiàn)軟件工廠的組裝生產(chǎn)夢想是一個(gè)有力的支持,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,依賴倒置原則(Dependecy- Inversion Principle)。 抽象不應(yīng)依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。本原則幾乎就是軟件設(shè)計(jì)的正本清源之道。因?yàn)槿私鉀Q問題的思考過程是先抽象后具體, 從籠統(tǒng)到細(xì)節(jié),所以我們先生產(chǎn)出的勢必是抽象程度比較高的實(shí)體,而后才是更加細(xì)節(jié)化的實(shí)體。于是,細(xì)節(jié)依賴于抽象就意味著后來的依賴于先前的,
8、這是自 然而然的重用之道。而且,抽象的實(shí)體代表著籠而統(tǒng)之的認(rèn)識(shí),人們總是比較容易正確認(rèn)識(shí)它們,而且本身也是不易變的,依賴于它們是安全的。依賴倒置原則適應(yīng) 了人類認(rèn)識(shí)過程的規(guī)律,是面向?qū)ο笤O(shè)計(jì)的標(biāo)志所在。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,接口隔離原則(Interface-Segregation Principle)。多個(gè)專用接口優(yōu)于一個(gè)單一的通用接口。本原則是單一職責(zé)原則用于接口設(shè)計(jì)的自然結(jié)果。一個(gè)接口應(yīng)該保證,實(shí)現(xiàn)該接口的實(shí)例對(duì)象 可以只呈現(xiàn)為單一的角色;這樣,當(dāng)某個(gè)客戶程序的要求發(fā)生變化,而迫使接口發(fā)生改變時(shí),影響到其他客戶程序的可能生性小。,湖南工程學(xué)院
9、計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,良性依賴原則 不會(huì)在實(shí)際中造成危害的依賴關(guān)系,都是良性依賴。通過分析不難發(fā)現(xiàn),本原則的核心思想是務(wù)實(shí),很好地揭示了極限編程(Extreme Programming)中簡單設(shè)計(jì)各重構(gòu)的理論基礎(chǔ)。本原則可以幫助我們抵御面向?qū)ο笤O(shè)計(jì)五大原則以及設(shè)計(jì)模式的誘惑,以免陷入過度設(shè)計(jì) (Over-engineering)的尷尬境地,帶來不必要的復(fù)雜性。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,OO設(shè)計(jì)原則 什么是設(shè)計(jì)原則? 設(shè)計(jì)原則是基本的工具,應(yīng)用這些規(guī)則可以使你的代碼更加靈活、更容易維護(hù),更容易擴(kuò)展。 基本原則: 封裝變
10、化Encapsulate what varies. 面向接口編程而非實(shí)現(xiàn) Code to an interface rather than to an implementation.優(yōu)先使用組合而非繼承 Favor Composition Over Inheritance,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,SRP: The single responsibility principle 單一職責(zé) 系統(tǒng)中的每一個(gè)對(duì)象都應(yīng)該只有一個(gè)單獨(dú)的職責(zé),而所有對(duì)象所關(guān)注的就是自身職責(zé)的完成。 Every object in your system should have a
11、 single responsibility ,and all the object s services should be focused on carrying out that single responsibility . 每一個(gè)職責(zé)都是一個(gè)設(shè)計(jì)的變因,需求變化的時(shí)候,需求變化反映為類職責(zé)的變化。當(dāng)你系統(tǒng)里面的對(duì)象都只有一個(gè)變化的原因的時(shí)候,你就已經(jīng)很好的遵循了SRP原則。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,SRP: The single responsibility principle 單一職責(zé) 如果一個(gè)類承擔(dān)的職責(zé)過多,就等于把這些職責(zé)耦合在了一
12、起。一個(gè)職責(zé)的變化就可能削弱或者抑制這個(gè)類其它職責(zé)的能力。這種設(shè)計(jì)會(huì)導(dǎo)致脆弱的設(shè)計(jì)。當(dāng)變化發(fā)生的時(shí)候,設(shè)計(jì)會(huì)遭到意想不到的破壞。 SRP 讓這個(gè)系統(tǒng)更容易管理維護(hù),因?yàn)椴皇撬械膯栴}都攪在一起。 內(nèi)聚Cohesion 其實(shí)是SRP原則的另外一個(gè)名字.你寫了高內(nèi)聚的軟件其實(shí)就是說你很好的應(yīng)用了SRP原則。 怎么判斷一個(gè)職責(zé)是不是一個(gè)對(duì)象的呢?你試著讓這個(gè)對(duì)象自己來完成這個(gè)職責(zé),比如:“書自己閱讀內(nèi)容”,閱讀的職責(zé)顯然不是書自己的。 僅當(dāng)變化發(fā)生時(shí),變化的軸線才具有實(shí)際的意義,如果沒有征兆,那么應(yīng)用SRP或者任何其它的原則都是不明智的。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技
13、術(shù)教程,DRY : Dont repeat yourself Principle 通過抽取公共部分放置在一個(gè)地方避免代碼重復(fù). Avoid duplicate code by abstracting out things that are common and placing those thing in a single location . DRY 很簡單,但卻是確保我們代碼容易維護(hù)和復(fù)用的關(guān)鍵。 你盡力避免重復(fù)代碼候?qū)嶋H上在做一件什么事情呢?是在確保每一個(gè)需求和功能在你的系統(tǒng)中只實(shí)現(xiàn)一次,否則就存在浪費(fèi)!系統(tǒng)用例不存在交集,所以我們的代碼更不應(yīng)該重復(fù),從這個(gè)角度看DRY可就不只是在說代碼
14、了。 DRY 關(guān)注的是系統(tǒng)內(nèi)的信息和行為都放在一個(gè)單一的,明顯的位置。就像你可以猜到正則表達(dá)式在.net中的位置一樣,因?yàn)楹侠硭钥梢圆碌健?DRY 原則:如何對(duì)系統(tǒng)職能進(jìn)行良好的分割!職責(zé)清晰的界限一定程度上保證了代碼的單一性。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,OCP : Open-Close Principle開閉原則 類應(yīng)該對(duì)修改關(guān)閉,對(duì)擴(kuò)展打開; Classes should be open for extension ,and closed for modification . OCP 關(guān)注的是靈活性,改動(dòng)是通過增加代碼進(jìn)行的,而不是改動(dòng)現(xiàn)有的代碼
15、; OCP的應(yīng)用限定在可能會(huì)發(fā)生的變化上,通過創(chuàng)建抽象來隔離以后發(fā)生的同類變化 OCP原則傳遞出來這樣一個(gè)思想:一旦你寫出來了可以工作的代碼,就要努力保證這段代碼一直可以工作。這可以說是一個(gè)底線。稍微提高一點(diǎn)要求,一旦我們的代碼質(zhì)量到了一個(gè)水平,我們要盡最大努力保證代碼質(zhì)量不回退。這樣的要求使我們面對(duì)一個(gè)問題的時(shí)候不會(huì)使用湊活的方法來解決,或者說是放任自流的方式來解決一個(gè)問題;比如代碼添加了無數(shù)對(duì)特定數(shù)據(jù)的處理,特化的代碼越來越多,代碼意圖開始含混不清,開始退化。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,OCP : Open-Close Principle開閉原則
16、OCP 背后的機(jī)制:封裝和抽象;封閉是建立在抽象基礎(chǔ)上的,使用抽象獲得顯示的封閉;繼承是OCP最簡單的例子。除了子類化和方法重載我們還有一些更優(yōu)雅的方法來實(shí)現(xiàn)比如組合; 怎樣在不改變?cè)创a(關(guān)閉修改)的情況下更改它的行為呢?答案就是抽象,OCP背后的機(jī)制就是抽象和多態(tài) 沒有一個(gè)可以適應(yīng)所有情況的貼切的模型!一定會(huì)有變化,不可能完全封閉.對(duì)程序中的每一個(gè)部分都肆意的抽象不是一個(gè)好主意,正確的做法是開發(fā)人員僅僅對(duì)頻繁變化的部分做出抽象。拒絕不成熟的抽象和抽象本身一樣重要。 OCP是OOD很多說法的核心,如果這個(gè)原則有效應(yīng)用,我們就可以獲更強(qiáng)的可維護(hù)性 可重用 靈活性 健壯性 LSP是OCP成為可能
17、的主要原則之一,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,LSP: The Liskov substitution principle 子類必須能夠替換基類 Subtypes must be substitutable for their base types. LSP關(guān)注的是怎樣良好的使用繼承. 必須要清楚是使用一個(gè)Method還是要擴(kuò)展它,但是絕對(duì)不是改變它。 LSP清晰的指出,OOD的IS-A關(guān)系是就行為方式而言,行為方式是可以進(jìn)行合理假設(shè)的,是客戶程序所依賴的。 LSP讓我們得出一個(gè)重要的結(jié)論:一個(gè)模型如果孤立的看,并不具有真正意義的有效性。模型的有效性只能通
18、過它的客戶程序來表現(xiàn)。必須根據(jù)設(shè)計(jì)的使用者做出的合理假設(shè)來審視它。而假設(shè)是難以預(yù)測的,直到設(shè)計(jì)臭味出現(xiàn)的時(shí)候才處理它們。 對(duì)于LSP的違反也潛在的違反了OCP,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,DIP:依賴倒置原則 高層模塊不應(yīng)該依賴于底層模塊,二者都應(yīng)該依賴于抽象; 抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象; 什么是高層模塊?高層模塊包含了應(yīng)用程序中重要的策略選擇和業(yè)務(wù)模型。這些高層模塊使其所在的應(yīng)用程序區(qū)別于其它。 如果高層模塊依賴于底層模塊,那么在不同的上下文中重用高層模塊就會(huì)變得十分困難。然而,如果高層模塊獨(dú)立于底層模塊,那么高層模塊就可以非常容易的被重用。該原則就是框架設(shè)計(jì)的核心原則。 這里的倒置不僅僅是依賴關(guān)系的倒置也是接口所有權(quán)的倒置。應(yīng)用了DIP我們會(huì)發(fā)現(xiàn)往往是客戶擁有抽象的接口,而服務(wù)者從這些抽象接口派生。,湖南工程學(xué)院計(jì)算機(jī)與通信學(xué)院,授課:李遠(yuǎn)輝,Java 編程技術(shù)教程,DIP:依賴倒置原則 這就是著名的Hollywood原則:Dont call us well call you.底層模塊實(shí)現(xiàn)了在高層模塊聲明并被高層模塊調(diào)用的接口。 通過倒置我們創(chuàng)建了更靈活 更持久更容易改變的結(jié)構(gòu) DIP的簡單的啟發(fā)規(guī)則:依賴于抽
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鉬合金行業(yè)發(fā)展戰(zhàn)略及前景趨勢分析報(bào)告
- 2025-2030年中國透明聚丙烯行業(yè)運(yùn)行狀況及發(fā)展規(guī)劃分析報(bào)告
- 2025-2030年中國過氧化二異丙苯行業(yè)運(yùn)行現(xiàn)狀及發(fā)展前景分析報(bào)告
- 2025-2030年中國苗圃產(chǎn)業(yè)市場十三五規(guī)劃及發(fā)展建議分析報(bào)告
- 2025-2030年中國納米銀市場運(yùn)行態(tài)勢及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國紫菜市場競爭格局與發(fā)展策略分析報(bào)告
- 2025-2030年中國管殼式換熱器行業(yè)運(yùn)行態(tài)勢與未來發(fā)展戰(zhàn)略研究報(bào)告
- 2025-2030年中國硬質(zhì)纖維板行業(yè)運(yùn)行態(tài)勢及投資戰(zhàn)略研究報(bào)告
- 天津師范大學(xué)津沽學(xué)院《半導(dǎo)體器件》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西交通職業(yè)技術(shù)學(xué)院《測量學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 幼兒園垃圾分類PPT
- 申請(qǐng)?zhí)崛∽》抗e金個(gè)人授權(quán)、承諾書(樣表)
- 施工作業(yè)申請(qǐng)表
- 浸出液的凈化與沉積
- 銀行間本幣市場交易員資格考試真題模擬匯編(共586題)
- 苯乙酸安全技術(shù)說明書(msds)
- 幼兒園大班《防欺凌》教案5篇,幼兒園大班防欺凌活動(dòng)教案
- 衛(wèi)生管理初中級(jí)職稱大綱
- 《當(dāng)代網(wǎng)絡(luò)文學(xué)作品發(fā)展研究6300字(論文)》
- 孟氏骨折與蓋氏骨折講解學(xué)習(xí)
- GB/T 9386-2008計(jì)算機(jī)軟件測試文檔編制規(guī)范
評(píng)論
0/150
提交評(píng)論