<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    零雨其蒙's Blog

    做優(yōu)秀的程序員
    隨筆 - 59, 文章 - 13, 評論 - 58, 引用 - 0
    數(shù)據(jù)加載中……

    零雨其蒙《對象設(shè)計:角色、責(zé)任和協(xié)作》學(xué)習(xí)筆記(三)

    2007 3 21 日星期三

    第三章?? 發(fā)現(xiàn)對象

    尋找和評定候選對象的步驟

    詳情見本書第 66 頁,其實這些內(nèi)容和好多方法論的思想差不多,核心不過就是“是什么”“做什么”“怎么做”的不同版本。這些步驟只是思考方法,并未指明工具,其基本思路其實很簡單,就是先對領(lǐng)域進(jìn)行描述(設(shè)計提綱),從描述中發(fā)現(xiàn)重要的主題(主題就是討論問題的角度,比如從分布式式系統(tǒng)的角度來考慮需要什么對象,從業(yè)務(wù)角度考慮需要什么對象),再從主題中發(fā)現(xiàn)對象(描述關(guān)鍵概念的對象,描述軟件外部特征的對象和描述附加機(jī)制和結(jié)構(gòu)的對象),然后再細(xì)化對象,進(jìn)而對已有的對象進(jìn)行分析,尋找共性,進(jìn)行進(jìn)一步抽象和合并。最后一步很有意義,自問每個對象是否有存在的必要。

    受到 Larman 對于用例的深刻理解的影響,我越發(fā)覺得文字是描述一個系統(tǒng)概貌很好的工具,而不是圖。而且我也覺得 XP 中的 User Story 是很好的實踐,這些用自然語言寫出的東西很方便與領(lǐng)域?qū)<液蜆I(yè)務(wù)人員進(jìn)行交流。但是所有這些都有一個統(tǒng)一的原則,就是簡單!夠用就好,不要寫太多,而且以后可能會增加,一次寫太多也理解不了,人的知識是需要一個滿滿的積累過程的,你一天能讀完《史記》嗎?一天讀完之后你還能分得清司馬相如和藺相如嗎?

    ?

    ?

    找尋對象、角色和類

    P67 我們建議你先尋找那些候選角色和對象。一旦你決定在設(shè)計中保留它們,再考慮使用接口還是類來實現(xiàn)它們。

    ?

    ?

    ??? 我覺得上面這段話對我而言相當(dāng)有啟發(fā),以前看 Rod Johnson 的《 J2EE 設(shè)計開發(fā)編程指南》時,對“實現(xiàn)依賴于接口,而非接口依賴于實現(xiàn)”覺得很疑惑,總是覺得我們應(yīng)該設(shè)計好類,然后再將那些公共方法用接口的形式對外公開,怎么才能先把公共方法先寫出來呢?不過現(xiàn)在終于明白這一順序了。

    ??? 實際上接口或是類的定義是通過角色和對象來的,它們的本質(zhì)都是責(zé)任,角色是一組可以由不同對象承擔(dān)的責(zé)任,對象通過承擔(dān)責(zé)任來表現(xiàn)它扮演什么角色。而這些責(zé)任有些就會變成未來接口中的方法簽名了。等于是說,我們先來討論系統(tǒng)中有哪些角色,哪些對象,然后再考慮是通過接口還是類來實現(xiàn)它們,類是使用抽象類還是具體類。

    ?

    直觀的來看,我們最先能找到的對象肯定是領(lǐng)域?qū)ο?。因此作者給出的步驟是這樣的:

    l???????? 尋找第一批對象——代表系統(tǒng)中的概念、結(jié)構(gòu)、機(jī)制等重要元素的對象

    l???????? 然后思考對象的共性,定義公共角色

    l???????? 然后將對象轉(zhuǎn)化成類或接口??梢允褂美^承、抽象、接口和協(xié)作等手段來構(gòu)造合理、靈活的設(shè)計。

    ?

    很喜歡作者對于抽象類、具體類和接口的描述,作者對于面向?qū)ο蠛诵母拍畹年U述都讓我覺得很深刻,而不像閱讀狠多高深的教材那樣——不知道作者在說什么!

    P67 抽象類提供了責(zé)任的部分實現(xiàn),并制定了子類必須實現(xiàn)的責(zé)任規(guī)范 (或許說的是鉤子函數(shù)或回調(diào)函數(shù))。具體類提供了責(zé)任的完整實現(xiàn),而接口使用一組方法簽名( method signatures )更精確的定義了責(zé)任,但沒有為其指定實現(xiàn)。

    ?

    ?

    候選對象特征

    ??? 作者接下來在“尋找的策略”這個子標(biāo)題下介紹了候選對象代表的內(nèi)容,我覺得這又是一份充滿了作者經(jīng)驗的清單,它為我們提供了尋找對象的方法,它的意思就是說:“如果看到這些內(nèi)容,那么就把它看成候選對象”。而且作者還強(qiáng)調(diào)了這份清單與領(lǐng)域另一份清單要契合,那份清單就是角色分類(角色構(gòu)造型,我不太喜歡這個譯法,它總讓我想到構(gòu)造器)。我將候選對象包含的內(nèi)容叫做候選對象的特征:

    l???????? 系統(tǒng)完成的工作 (應(yīng)該指的是領(lǐng)域概念,比如銷售,付款等)

    l???????? 直接受應(yīng)用程序影響或與其有關(guān)聯(lián)的東西(其他軟件、物理及期或硬件設(shè)備)

    l???????? 軟件中的信息流

    l???????? 決策、控制和協(xié)調(diào)的行為

    l???????? 結(jié)構(gòu)和對象群

    l???????? 對應(yīng)用程序有意義,代表現(xiàn)實事物的對象。

    ?

    候選對象應(yīng)該指的就是領(lǐng)域模型,更準(zhǔn)確地說應(yīng)該是其中包含領(lǐng)域模型,我想在這里可以跟 Larman 的書中的方法做個統(tǒng)一,描述主題可以使用用例文本,而現(xiàn)在要做的就是發(fā)現(xiàn)領(lǐng)域模型或者說是候選對象。

    ?

    我覺得作者的經(jīng)驗分享應(yīng)該受到重視,下面摘錄了作者對于某些應(yīng)用應(yīng)該選擇的對象的經(jīng)驗:

    l???????? 如果應(yīng)用程序的中心任務(wù)是計算 ,那么將其分解為多個服務(wù)供應(yīng)者對象,這些對象分別具有計算、轉(zhuǎn)換和演算等功能。你或許還要設(shè)計出代表算法或控制工作流程的對象。

    l???????? 如果你的應(yīng)用程序的主要行為是進(jìn)行信息收集和傳送 ,則對象通常是信息及其傳送操作的模型

    l???????? 如果應(yīng)用程序與其它系統(tǒng)相連 ,設(shè)計代表連接的外部接口則成為了工作的重點。大部分設(shè)計都需要進(jìn)行控制和協(xié)調(diào)的對象,根據(jù)控制的復(fù)雜度,設(shè)計這些對象或許成為整個設(shè)計工作的主要部分。

    l???????? 如果應(yīng)用程序需要徹底地分類、組織和建立相關(guān)對象間的聯(lián)系 ,那么就應(yīng)該有構(gòu)造者對象。

    ?

    P72 在你所尋找的對象和應(yīng)用軟件所完成的工作的本質(zhì)之間通常都會存在著某些直接關(guān)聯(lián)。

    作者這段或許是過去經(jīng)驗的總結(jié),然而并沒有在文中用特殊的字體來表示,我想我也應(yīng)該按照 Rod Johnson 所說的“循證”原則,對這些進(jìn)行一番實踐再下結(jié)論 ~

    ?

    關(guān)于命名

    ???? ? 我也一向主張,要給對象、方法、屬性等賦以有意義的名字,作者在“”名字到底有何內(nèi)涵,給出了好的建議:

    1)??????? 修飾通用名字。 也就是在通用的名字前面加上表示該特定對象的特征的修飾詞,比如 Calendar 類表示日期和時間系統(tǒng)。 ChineseCalendar 自然就表示中國日歷了。

    2)??????? 名字里只能包含將最有啟迪性和最突出的因素 。意思是說不要把任何細(xì)節(jié)都寫道名字里,要不然這名字也忒長了。

    3)??????? 給服務(wù)提供者以“ worker ”式命令。 并不是說名字后面都要用 worker ,而是說加上 er ,表示服務(wù),比如 SystemClassLoader 等;如果某些情況下 er 表服務(wù)聽起來不太舒服就用 Service 也行,比如 NamingService

    4)??????? 為那些名字暗示了廣泛責(zé)任的對象尋找輔助對象。

    5)??????? 選擇不限制行為的名字

    6)??????? 選擇一個適合對象生存期的名字。

    7)??????? 選擇一個適合當(dāng)前設(shè)計背景的名字。

    8)??????? 不要重載名字。

    9)??????? 通過添加形容詞來消除名字沖突。

    10)???? 通過選擇相似意義的名字來消除沖突。

    11)???? 選擇容易被理解的名字。

    ?

    描述候選對象

    ??? 本書作者建議通過確定對象的構(gòu)造型來確定其意圖,即找到一個對象,首先為它命名,然后用合適的一個或多個構(gòu)造型來刻畫它。

    其中,服務(wù)提供者、控制者、協(xié)調(diào)者通過他們所完成的功能來進(jìn)行區(qū)分,描述這些構(gòu)造型的方法如下:

    P79 服務(wù)提供者(或者控制者,或協(xié)調(diào)者)是完成某種功能的一類事物。首先,簡單的描述這些功能。然后指出與功能相關(guān)的重要的、有意義的信息,或其協(xié)作者。

    ?

    有一條有意義的建議是命名與熟悉的或其概念是廣泛認(rèn)可的事物關(guān)聯(lián)起來,以便于不同的人對其進(jìn)行理解。

    ?

    連接候選對象

    把完成相似任務(wù)或相互關(guān)聯(lián)的對象放在一起,將其組織起來,這一步如何去做,作者給出了如下建議:

    l???????? 依據(jù)應(yīng)用層

    l???????? 依據(jù)用例

    l???????? 依據(jù)構(gòu)造型角色

    l???????? 依據(jù)鄰域

    l???????? 依據(jù)抽象層

    l???????? 依據(jù)應(yīng)用主題

    ?

    ?

    保留和拋棄候選對象?

    ?????????? 做什么事情都不能過度,因此尋找候選對象也要適可而止,在某一個階段,什么樣的候選對象應(yīng)該保留,什么樣的候選對象應(yīng)該拋棄,作者給出了一個列表。

    保留的候選對象的特征:

    l???????? 為它起個好名字

    l???????? 定義它

    l???????? 確定其構(gòu)造型

    l???????? 確定它可以支持某個特殊用例

    l???????? 確定它是體系結(jié)構(gòu)中的一個重要元素

    l???????? 賦予它一或兩個初始責(zé)任

    l???????? 理解其外在視圖

    l???????? 確定其重要性

    l???????? 把它與相似的對象區(qū)分開來

    ?

    拋棄的候選對象的特征:

    l???????? 所擁有的責(zé)任與你更認(rèn)可的候選對象的責(zé)任重疊。

    l???????? 對象的責(zé)任、角色都比較含糊

    l???????? 對象所持有的功能存放于軟件需求之外

    l???????? 對于軟件系統(tǒng)來說無特別價值

    l???????? 對于軟件實現(xiàn)來說似乎無足輕重或又太過復(fù)雜。

    posted on 2007-03-21 17:06 零雨其蒙 閱讀(553) 評論(0)  編輯  收藏 所屬分類: 學(xué)習(xí)筆記

    主站蜘蛛池模板: 国产成人 亚洲欧洲| 最近中文字幕电影大全免费版| 亚洲国产美女精品久久久久| 日韩内射激情视频在线播放免费| 亚洲人成电影亚洲人成9999网| 免费永久在线观看黄网站| 污污污视频在线免费观看| 亚洲人成色77777在线观看| 少妇中文字幕乱码亚洲影视| 成人毛片免费在线观看| 免费国产在线精品一区| 亚洲国产精品一区二区第一页 | 国产一级高清视频免费看| h片在线免费观看| 最近最好最新2019中文字幕免费| 粉色视频在线观看www免费| 亚洲一区二区三区在线观看网站| 国产a不卡片精品免费观看 | 亚洲理论片在线观看| 免费无码精品黄AV电影| 精品国产免费人成电影在线观看| 国产在线观看免费视频软件| 亚洲日本乱码卡2卡3卡新区| 亚洲无人区一区二区三区| 成人影片麻豆国产影片免费观看| 91热成人精品国产免费| 久久青草国产免费观看| 国产亚洲精品仙踪林在线播放| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲欧洲久久精品| 亚洲国产综合在线| 亚洲 暴爽 AV人人爽日日碰| 精品久久亚洲中文无码| 亚洲va在线va天堂成人| 亚洲综合一区无码精品| 亚洲国产成人综合精品| 亚洲欧洲日韩在线电影| 亚洲一区二区三区免费在线观看 | 日日麻批免费40分钟日本的| 久久精品免费一区二区| 久久天天躁狠狠躁夜夜免费观看|