(零雨其蒙原創(chuàng) 轉(zhuǎn)載請(qǐng)注明)
2007
年
3
月
9
日星期五
?
第
23
章
迭代
2
:更多模式
在前面學(xué)習(xí)用例的時(shí)候,已經(jīng)知道一個(gè)用例包含多個(gè)場(chǎng)景(主成功場(chǎng)景和擴(kuò)展場(chǎng)景),由于
UP
倡導(dǎo)的是增量式開發(fā),因此
Larman
給出了一些建議:在多次迭代中對(duì)同一用例的不同場(chǎng)景或特性進(jìn)行工作,并且逐漸地?cái)U(kuò)展系統(tǒng)以最終實(shí)現(xiàn)對(duì)所有功能需求的處理。但是,不應(yīng)該把一個(gè)場(chǎng)景分開在多次迭代中處理
,
一次迭代應(yīng)該完成一個(gè)或多個(gè)端到端的場(chǎng)景。(
P294
)
即一個(gè)用例可以分多次迭代完成(每次至少完成一個(gè)場(chǎng)景),一個(gè)場(chǎng)景必須在一次迭代中完成
?
第
24
章
快速地更新分析
P297
使用
UP
的過程成熟標(biāo)志是
,知道何時(shí)創(chuàng)建制品能夠帶來顯著價(jià)值,或是當(dāng)遇到呆板的“完成作業(yè)”式的步驟時(shí)能夠較好地略過。
?
?
創(chuàng)建子類的準(zhǔn)則
當(dāng)遇到下列情況時(shí),創(chuàng)建超類的概念子類:
1)
?
子類具有我們感興趣的額外屬性
2)
?
子類具有我們感興趣的額外關(guān)聯(lián)
3)
?
對(duì)子類概念的影響、處理、反應(yīng)和操作與超類或其他子類有顯著的差異
?
?
關(guān)于子類和超類的其他準(zhǔn)則(這些都是基于領(lǐng)域模型的討論,也就是在分析時(shí)觀點(diǎn))
準(zhǔn)則
:將超類聲明為抽象類。雖然這是與軟件無(wú)關(guān)的概念觀點(diǎn),但是也是常用的
OO
準(zhǔn)則,即所有軟件超類都是抽象的
準(zhǔn)則
:在子類上附以超類名稱。(如超類是
Square
,則子類名就是
GoSquare
,
RegularSquare
等)
?
?
第
25
章
GRASP
:更多具有職責(zé)的對(duì)象
?
??
在這一章中
larman
介紹了前面沒有介紹過的四個(gè)
GRASP
模式:多態(tài)、間接性、純虛構(gòu)和防止變異。經(jīng)過這章的學(xué)習(xí)之后,
GRASP
的
9
個(gè)模式就學(xué)全了
~
按照
Larman
的說法,那時(shí)我們就擁有了討論設(shè)計(jì)的豐富、共享的詞匯。
?
Polymorphism
多態(tài)
問題:
如何處理基于類型的選擇?如何創(chuàng)建可插拔的軟件構(gòu)件?
解決方案:
當(dāng)相關(guān)選擇或行為隨類型(類)有所不同時(shí),使用多態(tài)操作為變化的行為類型分配職責(zé)。
推理:
不要測(cè)試對(duì)象的類型,也不要使用條件邏輯來執(zhí)行基于類型的不同選擇。
?
多態(tài)使我們不再使用條件分支語(yǔ)句來解決條件變化問題,前面在學(xué)習(xí)
Martin Fowler
的《重構(gòu)》時(shí)我回憶了那個(gè)地磅系統(tǒng)中讓人惡心的
case
和
if-else
邏輯程序段,它制造了大量的重復(fù)和讓人感到對(duì)于業(yè)務(wù)過程的不解,從我個(gè)人的實(shí)踐來看,多態(tài)可以很好的解決這一問題,因?yàn)閺?fù)雜性被封裝在了超類和子類的繼承關(guān)系中——那時(shí)我在做一個(gè)搜索引擎時(shí),使用多態(tài)避免了傳統(tǒng)的使用條件分支語(yǔ)句來處理選擇搜索類別的問題(按商品名稱搜索,按作者搜索等類別),它有兩點(diǎn)好處:一個(gè)是簡(jiǎn)潔,一個(gè)是清楚。可以很輕易的看出其邏輯關(guān)系。因此廢棄條件分支語(yǔ)句吧,在
[
問題
]
中
Larman
實(shí)際上已經(jīng)給出了使用多態(tài)的好處,只不過用的是問句。
?
P305
當(dāng)對(duì)象
A
持續(xù)需要對(duì)象
B
中的數(shù)據(jù)時(shí),意味著:
1
)對(duì)象
A
不應(yīng)該持有該數(shù)據(jù);或
2
)對(duì)象
B
而不是對(duì)象
A
應(yīng)該具有這一職責(zé)(基于專家模式)。
?
?
?
?
Pure Fabrication
純虛構(gòu)
問題:
當(dāng)你并不想違背高內(nèi)聚和低耦合或其他目標(biāo),但是基于專家模式所提供的方案又不合適時(shí),哪些對(duì)象應(yīng)該承擔(dān)這一職責(zé)。
解決方案:
對(duì)人為制造的類分配一組高內(nèi)聚的職責(zé),該類并不代表問題領(lǐng)域的概念——虛構(gòu)的事物,用以支持高內(nèi)聚、低耦合和復(fù)用
?
?
P308-309
信息專家所支持的目標(biāo)是,將職責(zé)與這些職責(zé)所需信息結(jié)合起來賦予同一個(gè)對(duì)象,以實(shí)現(xiàn)對(duì)低耦合的支持。如果濫用純虛構(gòu),會(huì)導(dǎo)致大量行為對(duì)象,其職責(zé)與執(zhí)行職責(zé)所需的信息沒有結(jié)合起來,這樣會(huì)對(duì)耦合產(chǎn)生不良影響。其通常征兆是,對(duì)象內(nèi)的大部分?jǐn)?shù)據(jù)被傳遞給其他對(duì)象用以處理
(即該對(duì)象大量調(diào)用其它對(duì)象的方法來處理其自身的數(shù)據(jù))。
?
?
Indirection
間接性
問題:
為了避免兩個(gè)或多個(gè)事物之間直接耦合,應(yīng)該如何分配職責(zé)?如何使對(duì)象解耦合,以支持低耦合并提高復(fù)用性潛力?
解決方案:
將職責(zé)分配給中介對(duì)象,使其作為其他構(gòu)件或服務(wù)之間的媒介,以避免它們之間的直接耦合。中介實(shí)現(xiàn)了其他構(gòu)件之間的間接性。
?
Protected Variation
防止變異
問題:
如何設(shè)計(jì)對(duì)象、子系統(tǒng)和系統(tǒng),使其內(nèi)部的變化或不穩(wěn)定不會(huì)對(duì)其他元素產(chǎn)生不良影響?
解決方案:
識(shí)別預(yù)計(jì)變化或不穩(wěn)定之處,分配職責(zé)用以在這些變化之外創(chuàng)建穩(wěn)定的接口。注意:這里使用的“接口”指的是廣泛意義上的訪問視圖,而不僅僅是諸如
Java
接口等字面含義。
?????????????