系統(tǒng)分析與設(shè)計(jì)IBM-43面向?qū)ο笤O(shè)計(jì)的原則課件_第1頁
系統(tǒng)分析與設(shè)計(jì)IBM-43面向?qū)ο笤O(shè)計(jì)的原則課件_第2頁
系統(tǒng)分析與設(shè)計(jì)IBM-43面向?qū)ο笤O(shè)計(jì)的原則課件_第3頁
系統(tǒng)分析與設(shè)計(jì)IBM-43面向?qū)ο笤O(shè)計(jì)的原則課件_第4頁
系統(tǒng)分析與設(shè)計(jì)IBM-43面向?qū)ο笤O(shè)計(jì)的原則課件_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

關(guān)于對象設(shè)計(jì)你愿或者不愿,需求就在那里,日新月異你想或者不想,設(shè)計(jì)創(chuàng)新就在那里,始終持續(xù)你測或者不測,Bug都在那里,多多少少結(jié)束或者不結(jié)束,干系人在那里,決策終不由己來,面向?qū)ο蟮年嚑I里,或者,讓對象思想駐進(jìn)你的心里,默然,領(lǐng)會。由衷,歡喜 ……關(guān)于對象設(shè)計(jì)你愿或者不愿,需求就在那里,日新月異1關(guān)于對象設(shè)計(jì)其實(shí),真相是:面向?qū)ο蠓椒ū旧聿⒉荒鼙WC你的設(shè)計(jì)成為優(yōu)秀的設(shè)計(jì)YoucancreateaverybadOOdesignjustaseasilyasyoucancreateaverybadnon--‐OOdesign...關(guān)于對象設(shè)計(jì)其實(shí),真相是:2面向?qū)ο笤O(shè)計(jì)過程進(jìn)行適當(dāng)?shù)念I(lǐng)域分析撰寫問題描述,確定系統(tǒng)的開發(fā)任務(wù)基于問題描述抽取需求開發(fā)用戶界面原型識別對象類定義每個(gè)類的職責(zé)確定類之間的交互關(guān)系建立系統(tǒng)的設(shè)計(jì)模型面向?qū)ο笤O(shè)計(jì)過程進(jìn)行適當(dāng)?shù)念I(lǐng)域分析3面向?qū)ο蠼:诵睦砟顓^(qū)分接口與實(shí)現(xiàn)從具體到抽象最小接口原則面向?qū)ο蠼:诵睦砟顓^(qū)分接口與實(shí)現(xiàn)4區(qū)分接口與實(shí)現(xiàn)接口的標(biāo)準(zhǔn)化

vs.

實(shí)現(xiàn)的演化publicvoidopen(stringname)

{/*someapplication-specificprocessing

*//*calltheOracleAPItoopentheDB*//*moreapplicationspecificprocessing

*/}publicvoidopen(stringname)

{/*someapplication-specificprocessing

*//*calltheSQLAnywheretoopentheDB*//*moreapplicationspecificprocessing*/}區(qū)分接口與實(shí)現(xiàn)接口的標(biāo)準(zhǔn)化vs.實(shí)現(xiàn)的演化5接口

用戶代碼接口OracleDB2SQLAny用戶代碼接口用戶代碼接口OracleDB2SQLAny用戶代碼6UsingAbstractThinkingWhenDesigning

Interfaces設(shè)計(jì)抽象的接口UsingAbstractThinkingWhenD7抽象的接口抽

口師傅,請送我去機(jī)場抽象的接口抽象的接口師傅,請送我去機(jī)場8不太抽象的接口不

口右轉(zhuǎn)右轉(zhuǎn)左轉(zhuǎn)左轉(zhuǎn)左轉(zhuǎn)不太抽象的接口不夠抽象的接口9抽象的接口:向

實(shí)

現(xiàn)

細(xì)

節(jié)讓用戶知道的關(guān)于類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)越少越好:只給看必須的只看公開的只為用戶的業(yè)務(wù)需求考慮最

負(fù)

擔(dān)

則抽象的接口:向用戶暴露10確

戶用戶是誰 ? 重要程度高達(dá)50%面向服務(wù)的原則

(Services

Principle)提供服務(wù):只要能賺錢就好使

務(wù):不要太貴喔確定用戶用戶是誰 ? 重要程度高達(dá)50%提供服11識別環(huán)境約束環(huán)境對對象的行為施加約束限制條件前置條件/后置條件/例外條件…識別環(huán)境約束環(huán)境對對象的行為施加約束限制條件前置條件/后置12公共接口的識別用戶

使

時(shí)

候,需

要以下功

告知司機(jī)終點(diǎn)付錢下

車用戶

?

的時(shí)候:有出

行地點(diǎn)召喚

出租

車付錢公共接口的識別用戶使用出租車對象的13確定實(shí)現(xiàn)細(xì)節(jié)公共接口以外的內(nèi)容都可以看做是實(shí)現(xiàn)相關(guān)的用戶永遠(yuǎn)無需關(guān)注實(shí)現(xiàn)細(xì)節(jié)方法的命名和參數(shù)定義

(nameandparameterlist)編碼實(shí)現(xiàn)對實(shí)現(xiàn)的修改無須牽涉接?實(shí)現(xiàn)為用戶的期望提供解決?方案接口從用戶的角度看待對象,實(shí)現(xiàn)則是對象的果核和果肉實(shí)現(xiàn)中包含有描述對象狀態(tài)的代碼確定實(shí)現(xiàn)細(xì)節(jié)公共接口以外的內(nèi)容都可以看做是實(shí)現(xiàn)相關(guān)的14開閉原則(Open/Closed

Principle,

OCP)最初由Bertrand

Meyer提出軟件實(shí)體在擴(kuò)展性?方?面應(yīng)該是開放的,而在更改性方面應(yīng)該是

封閉

的。例:打印輸出設(shè)計(jì)設(shè)計(jì)1設(shè)計(jì)2開閉原則(Open/ClosedPrinciple,OC15Liskov替換原則

(Liskov

Substitution

Principle,

LSP)最早由Liskov于1987年在OOPSLA會議上提出子類可以替換父類出現(xiàn)在父類能出現(xiàn)的任何地方Liskov替換原則(LiskovSubstitutio16違反LSP的例子publicclassRectangle

{privateinttopLe5X;privateinttopLe5Y;intwidth;int

height;publicvoidsetWidth(intwidth){this.width=width;}publicvoidsetHeight(intheight){this.height=

height;}publicintgetWidth(){return

width;}publicintgetHeight(){returnheight;}}問題:如果將Square作為Rectangle的子類,則如何定義Square類的setWidth和setHeight方法??違反LSP的例子publicclassRectangle17解決方法:publicclassSquareextendsRectangle{publicvoidsetWidth(intwidth){super.setWidth(width);super.setHeight(width);}publicvoidsetHeight(intheight){super.setHeight(height);super.setWidth(height);}}這種解決方法是否可行??解決方法:publicclassSquareexten18考

碼:publicclassTest

{publicstaGcvoidmain(String[]args){Testt=new

Test();Rectangler=new

Rectangle();Squares=newSquare();t.g(r);// t.g(s);}}privatevoidg(Rectangler)

{r.setWidth(10);r.setHeight(20);assert(r.getWidth()*r.getHeight()==

200);如果傳給方法g的參數(shù)是Rectangle類型的對象,則沒有問題,如果是Square類型的對象,則出錯(cuò)。}?考慮下面的代碼:publicclassTes19思考題:如

求?契約式設(shè)計(jì)

(DesignbyContract)為了滿足Liskov替換原則,設(shè)計(jì)時(shí)要求:子類中方法的前置條件不能強(qiáng)于父類中相應(yīng)方法的前置條件。子類中方法的后置條件不能弱于父類中相應(yīng)方法的后置條件。Liskov

替換原則要求子類寬

入嚴(yán)出!思考題:如何知道子類的行為符合父20依賴倒置原則

(DependencyInversionPrinciple,

DIP)依賴倒置原則指的是依賴關(guān)系應(yīng)該是盡量依賴接口(或抽象類),而不是依賴于具體類。?結(jié)構(gòu)化設(shè)計(jì)中模塊間的依賴關(guān)系依賴倒置原則(DependencyInversionP21面向?qū)ο笤O(shè)計(jì)中的依賴關(guān)系OOD中的依賴關(guān)系面向?qū)ο笤O(shè)計(jì)中的依賴關(guān)系OOD中的依賴關(guān)系22接口分離原則(InterfaceSegrega:on

Principle,

ISP)在設(shè)計(jì)時(shí)采用多個(gè)和特定客戶類(client)有關(guān)的接口要比采用一個(gè)通用的接口要好。使用通用接口的設(shè)計(jì)使用分離接口的設(shè)計(jì)接口分離原則(InterfaceSegrega:onPr23好的系統(tǒng)設(shè)計(jì)的特征用戶友好易理解可靠可擴(kuò)展可移植可伸縮可重用…簡單性:實(shí)現(xiàn)簡單,使

用簡單,理解簡單,維護(hù)簡單軟件老化的特征修改難很脆弱移植難重

用難粘性強(qiáng)

(設(shè)計(jì)+環(huán)境)需求變更好的系統(tǒng)設(shè)計(jì)的特征用戶友好簡單性:實(shí)現(xiàn)簡單,使用簡單,理解24OO設(shè)計(jì)時(shí)要注意的一些問題不同類中相似方法的名字應(yīng)該相同遵守已有的約定俗成的習(xí)慣盡量減少消息模式的數(shù)目。只要可能,就使消息具有一致的模式,以利于理解。設(shè)計(jì)簡單的類。類的職責(zé)要明確,應(yīng)該從類名就可以較容易地推斷出類的用途。定義簡單的操作、方法定義簡單的交互協(xié)議泛化結(jié)構(gòu)的深度要適當(dāng)把設(shè)計(jì)變動的副作用減至最少OO設(shè)計(jì)時(shí)要注意的一些問題不同類中相似方法的名字應(yīng)該相同25關(guān)于對象設(shè)計(jì)你愿或者不愿,需求就在那里,日新月異你想或者不想,設(shè)計(jì)創(chuàng)新就在那里,始終持續(xù)你測或者不測,Bug都在那里,多多少少結(jié)束或者不結(jié)束,干系人在那里,決策終不由己來,面向?qū)ο蟮年嚑I里,或者,讓對象思想駐進(jìn)你的心里,默然,領(lǐng)會。由衷,歡喜 ……關(guān)于對象設(shè)計(jì)你愿或者不愿,需求就在那里,日新月異26關(guān)于對象設(shè)計(jì)其實(shí),真相是:面向?qū)ο蠓椒ū旧聿⒉荒鼙WC你的設(shè)計(jì)成為優(yōu)秀的設(shè)計(jì)YoucancreateaverybadOOdesignjustaseasilyasyoucancreateaverybadnon--‐OOdesign...關(guān)于對象設(shè)計(jì)其實(shí),真相是:27面向?qū)ο笤O(shè)計(jì)過程進(jìn)行適當(dāng)?shù)念I(lǐng)域分析撰寫問題描述,確定系統(tǒng)的開發(fā)任務(wù)基于問題描述抽取需求開發(fā)用戶界面原型識別對象類定義每個(gè)類的職責(zé)確定類之間的交互關(guān)系建立系統(tǒng)的設(shè)計(jì)模型面向?qū)ο笤O(shè)計(jì)過程進(jìn)行適當(dāng)?shù)念I(lǐng)域分析28面向?qū)ο蠼:诵睦砟顓^(qū)分接口與實(shí)現(xiàn)從具體到抽象最小接口原則面向?qū)ο蠼:诵睦砟顓^(qū)分接口與實(shí)現(xiàn)29區(qū)分接口與實(shí)現(xiàn)接口的標(biāo)準(zhǔn)化

vs.

實(shí)現(xiàn)的演化publicvoidopen(stringname)

{/*someapplication-specificprocessing

*//*calltheOracleAPItoopentheDB*//*moreapplicationspecificprocessing

*/}publicvoidopen(stringname)

{/*someapplication-specificprocessing

*//*calltheSQLAnywheretoopentheDB*//*moreapplicationspecificprocessing*/}區(qū)分接口與實(shí)現(xiàn)接口的標(biāo)準(zhǔn)化vs.實(shí)現(xiàn)的演化30接口

用戶代碼接口OracleDB2SQLAny用戶代碼接口用戶代碼接口OracleDB2SQLAny用戶代碼31UsingAbstractThinkingWhenDesigning

Interfaces設(shè)計(jì)抽象的接口UsingAbstractThinkingWhenD32抽象的接口抽

口師傅,請送我去機(jī)場抽象的接口抽象的接口師傅,請送我去機(jī)場33不太抽象的接口不

口右轉(zhuǎn)右轉(zhuǎn)左轉(zhuǎn)左轉(zhuǎn)左轉(zhuǎn)不太抽象的接口不夠抽象的接口34抽象的接口:向

實(shí)

現(xiàn)

細(xì)

節(jié)讓用戶知道的關(guān)于類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)越少越好:只給看必須的只看公開的只為用戶的業(yè)務(wù)需求考慮最

負(fù)

擔(dān)

則抽象的接口:向用戶暴露35確

戶用戶是誰 ? 重要程度高達(dá)50%面向服務(wù)的原則

(Services

Principle)提供服務(wù):只要能賺錢就好使

務(wù):不要太貴喔確定用戶用戶是誰 ? 重要程度高達(dá)50%提供服36識別環(huán)境約束環(huán)境對對象的行為施加約束限制條件前置條件/后置條件/例外條件…識別環(huán)境約束環(huán)境對對象的行為施加約束限制條件前置條件/后置37公共接口的識別用戶

使

時(shí)

候,需

要以下功

告知司機(jī)終點(diǎn)付錢下

車用戶

?

的時(shí)候:有出

行地點(diǎn)召喚

出租

車付錢公共接口的識別用戶使用出租車對象的38確定實(shí)現(xiàn)細(xì)節(jié)公共接口以外的內(nèi)容都可以看做是實(shí)現(xiàn)相關(guān)的用戶永遠(yuǎn)無需關(guān)注實(shí)現(xiàn)細(xì)節(jié)方法的命名和參數(shù)定義

(nameandparameterlist)編碼實(shí)現(xiàn)對實(shí)現(xiàn)的修改無須牽涉接?實(shí)現(xiàn)為用戶的期望提供解決?方案接口從用戶的角度看待對象,實(shí)現(xiàn)則是對象的果核和果肉實(shí)現(xiàn)中包含有描述對象狀態(tài)的代碼確定實(shí)現(xiàn)細(xì)節(jié)公共接口以外的內(nèi)容都可以看做是實(shí)現(xiàn)相關(guān)的39開閉原則(Open/Closed

Principle,

OCP)最初由Bertrand

Meyer提出軟件實(shí)體在擴(kuò)展性?方?面應(yīng)該是開放的,而在更改性方面應(yīng)該是

封閉

的。例:打印輸出設(shè)計(jì)設(shè)計(jì)1設(shè)計(jì)2開閉原則(Open/ClosedPrinciple,OC40Liskov替換原則

(Liskov

Substitution

Principle,

LSP)最早由Liskov于1987年在OOPSLA會議上提出子類可以替換父類出現(xiàn)在父類能出現(xiàn)的任何地方Liskov替換原則(LiskovSubstitutio41違反LSP的例子publicclassRectangle

{privateinttopLe5X;privateinttopLe5Y;intwidth;int

height;publicvoidsetWidth(intwidth){this.width=width;}publicvoidsetHeight(intheight){this.height=

height;}publicintgetWidth(){return

width;}publicintgetHeight(){returnheight;}}問題:如果將Square作為Rectangle的子類,則如何定義Square類的setWidth和setHeight方法??違反LSP的例子publicclassRectangle42解決方法:publicclassSquareextendsRectangle{publicvoidsetWidth(intwidth){super.setWidth(width);super.setHeight(width);}publicvoidsetHeight(intheight){super.setHeight(height);super.setWidth(height);}}這種解決方法是否可行??解決方法:publicclassSquareexten43考

碼:publicclassTest

{publicstaGcvoidmain(String[]args){Testt=new

Test();Rectangler=new

Rectangle();Squares=newSquare();t.g(r);// t.g(s);}}privatevoidg(Rectangler)

{r.setWidth(10);r.setHeight(20);assert(r.getWidth()*r.getHeight()==

200);如果傳給方法g的參數(shù)是Rectangle類型的對象,則沒有問題,如果是Square類型的對象,則出錯(cuò)。}?考慮下面的代碼:publicclassTes44思考題:如

溫馨提示

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

評論

0/150

提交評論