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

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

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

    空間站

    北極心空

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
     

    你是一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員嗎?你知道GRASP 

    一.職責(zé)分配和職責(zé)驅(qū)動(dòng)設(shè)計(jì)

    在一個(gè)軟件項(xiàng)目開(kāi)始的時(shí)候,我們通常需要進(jìn)行需求分析,了解客戶需要設(shè)計(jì)一個(gè)什么樣的軟件,這個(gè)軟件中應(yīng)當(dāng)有什么功能。需求分析了解到的是現(xiàn)實(shí)世界中客戶需求的業(yè)務(wù)功能,每個(gè)業(yè)務(wù)功能往往是一個(gè)業(yè)務(wù)流程,即客戶在日常工作中不斷在完成的業(yè)務(wù)流程。同時(shí),在用戶的問(wèn)題世界中,必然有一些東西或者說(shuō)事物,它們之間存在著相互的關(guān)聯(lián)。

    拿一個(gè)軟件評(píng)審管理系統(tǒng)作為一個(gè)例子吧。評(píng)審管理系統(tǒng)的業(yè)務(wù)需求如下:

    1通過(guò)以上需求的描述,我們不難發(fā)現(xiàn)整個(gè)問(wèn)題世界中的相關(guān)事物:評(píng)審組織者、評(píng)審計(jì)劃、評(píng)審者、評(píng)審對(duì)象、評(píng)審表、疑問(wèn)、評(píng)審報(bào)告、評(píng)審結(jié)論、問(wèn)題。我們也不難分析出這些事物相互關(guān)系,比如評(píng)審計(jì)劃與評(píng)審者是一對(duì)多,而評(píng)審報(bào)告與評(píng)審結(jié)論是一對(duì)一。

    RUP領(lǐng)域模型中的對(duì)象將成為軟件開(kāi)發(fā)中形成具體對(duì)象的基礎(chǔ)(軟件開(kāi)發(fā)中形成什么對(duì)象是根據(jù)軟件開(kāi)發(fā)的具體需求而定的,并不一定要與領(lǐng)域模型的對(duì)象一致)。用例模型中的用例,將通過(guò)賦予這些對(duì)象行為而得以實(shí)現(xiàn)。現(xiàn)在的問(wèn)題就出來(lái)了,用例模型中的功能,或者說(shuō)一系列行為,應(yīng)當(dāng)如何分配給這些對(duì)象呢。也就是說(shuō),為了完成同一個(gè)任務(wù),我可以將行為A我們通過(guò)對(duì)現(xiàn)實(shí)世界的分析,或者說(shuō)對(duì)于領(lǐng)域模型的分析,設(shè)計(jì)出了軟件系統(tǒng)中的對(duì)象,這時(shí)候我們應(yīng)當(dāng)為每一個(gè)對(duì)象分配職責(zé)。什么是對(duì)象的職責(zé)呢,當(dāng)然是通過(guò)對(duì)現(xiàn)實(shí)世界的分析,定義的這個(gè)對(duì)象應(yīng)當(dāng)完成的任務(wù)。比如評(píng)審者對(duì)象的職責(zé)是存取與評(píng)審者相關(guān)的數(shù)據(jù)。當(dāng)然對(duì)象的職責(zé)不一定是一個(gè),比如評(píng)審計(jì)劃包含了評(píng)審對(duì)象和評(píng)審者的子項(xiàng),所以它在工作不繁忙的情況下可以代理處理評(píng)審對(duì)象和評(píng)審者的信息存取。但是一個(gè)對(duì)象的職責(zé)不應(yīng)當(dāng)過(guò)多(也就2職責(zé)分配現(xiàn)在已經(jīng)被普遍認(rèn)為是一個(gè)優(yōu)秀的軟件設(shè)計(jì)應(yīng)當(dāng)遵循的原則,它有以下好處:

    1這種通過(guò)考慮對(duì)象、職責(zé)、協(xié)作的對(duì)象設(shè)計(jì)及構(gòu)件方式,被稱為“職責(zé)驅(qū)動(dòng)設(shè)計(jì)(RDD

    二.GRASP模式挨個(gè)析

    GRASP(原創(chuàng))一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP(2)低耦合

    (原創(chuàng))一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP(3)高內(nèi)聚

    一個(gè)對(duì)象撕心裂肺的怒吼:誰(shuí)來(lái)創(chuàng)建我!GRASP(4)創(chuàng)建者模式

    (待續(xù))



    以下是原博客的討論:[建議到員博客閱讀]
    最后更新:2007-02-04 15:24
    14:11  |   永久鏈接  |   瀏覽 (5801)  |   評(píng)論 (13)  |    收藏  |   進(jìn)入論壇  |  
    評(píng)論    共 13 條 發(fā)表評(píng)論
    amigobot     2007-01-20 13:08

    沒(méi)有下文了? 期待中。GRASP和GoF是不同類型的模式, 出發(fā)點(diǎn)不同。 GRASP是解決類之間如何交互, 如何設(shè)計(jì)合理, 和具體問(wèn)題無(wú)關(guān)。

    galaxystar     2007-01-20 13:50

    感覺(jué)是一種綜合體!

    zuly     2007-01-20 14:08

    知道名字就可以!其他的可以google!

    what we need is the name , add others to google!

    fangang     2007-01-22 08:46

    zuly 寫(xiě)道
    知道名字就可以!其他的可以google!

     

    what we need is the name , add others to google!

    我寫(xiě)這篇文章的起因是因?yàn)槲遗既辉趃oogle或yahoo這樣的搜索引擎搜索GRASP發(fā)現(xiàn),除了國(guó)外的網(wǎng)站,國(guó)內(nèi)網(wǎng)站多介紹和討論GoF而很少介紹GRASP,即使這少量的文章也講解非常粗略。個(gè)人認(rèn)為作為優(yōu)秀的開(kāi)發(fā)人員,理解GRASP比GoF更重要,故寫(xiě)此文章。此文章后面的內(nèi)容我會(huì)不斷添上,謝謝支持

     

    fangang     2007-01-22 09:15

    amigobot 寫(xiě)道
    沒(méi)有下文了? 期待中。GRASP和GoF是不同類型的模式, 出發(fā)點(diǎn)不同。 GRASP是解決類之間如何交互, 如何設(shè)計(jì)合理, 和具體問(wèn)題無(wú)關(guān)。

    我同意。GRASP與GoF最大的區(qū)別,本人認(rèn)為GoF往往是解決一些具體的問(wèn)題,比如類的具體創(chuàng)建方式等等,而GRASP是解決對(duì)象分析的一些基本原則,即你如何去設(shè)計(jì)你的問(wèn)題空間中的類和它們的行為,是原則性的東西。后面我會(huì)一個(gè)一個(gè)分析GRASP的9個(gè)模式,也就是9個(gè)基本原則,謝謝支持

     

    newman     2007-01-24 10:36

    有點(diǎn)意思。不過(guò)從fangang朋友對(duì)grasp的介紹,我得到的印象是grasp跟gof作為比較有些不當(dāng),可能是我的理解有誤。希望能看到fangang朋友對(duì)grasp給出一個(gè)比較明確的定義,以及適用范圍,比如在軟件開(kāi)發(fā)生命周期中,grasp在什么階段用合適?有哪些效用。。。等等,期待中。

    fangang     2007-01-24 13:46

    謝謝指教,grasp和gof都是稱為軟件開(kāi)發(fā)模式,只是描述的內(nèi)容和角度不同,這相關(guān)的問(wèn)題Craig Larman在《UML和模式應(yīng)用》的第17章中有詳細(xì)描述

    fly_ever     2007-01-24 15:55

    有一本書(shū)闡述了GRASP,《深入淺出設(shè)計(jì)模式 C#/JAVA版》,06年出版的。
    感覺(jué)跟GOF相比,GRASP主要是用來(lái)指導(dǎo)面向?qū)ο蟮姆治龊驮O(shè)計(jì)。

    fangang     2007-01-24 16:23

    newman 寫(xiě)道
    有點(diǎn)意思。不過(guò)從fangang朋友對(duì)grasp的介紹,我得到的印象是grasp跟gof作為比較有些不當(dāng),可能是我的理解有誤。希望能看到fangang朋友對(duì)grasp給出一個(gè)比較明確的定義,以及適用范圍,比如在軟件開(kāi)發(fā)生命周期中,grasp在什么階段用合適?有哪些效用。。。等等,期待中。

    grasp(General Responsibility Assignment Software Patterns),它往往適用于對(duì)象分析和設(shè)計(jì)中,即在RUP的制作分析模型和設(shè)計(jì)模型階段。grasp有9種模式,是用于解決軟件設(shè)計(jì)中的9種常見(jiàn)的問(wèn)題,因此其效用各不一樣,不能一概而論。

     

    fangang     2007-01-25 09:51

    非常感謝newman給我提的數(shù)個(gè)問(wèn)題。GRASP雖好,GoF雖好,最關(guān)鍵是我們?cè)趺从煤蜕稌r(shí)候用,這兩個(gè)問(wèn)題一直是我反復(fù)思考的問(wèn)題。我正在籌劃寫(xiě)一篇關(guān)于軟件開(kāi)發(fā)過(guò)程,特別是分析和設(shè)計(jì)這個(gè)階段,如何運(yùn)用GRASP和GoF的一點(diǎn)兒認(rèn)識(shí),期望和大家切磋切磋

    posted on 2007-10-16 11:22 蘆葦 閱讀(1059) 評(píng)論(3)  編輯  收藏 所屬分類: 其他

    Feedback

    # re: [轉(zhuǎn)]一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP軟件開(kāi)發(fā)模式淺析 2007-10-16 11:27 蘆葦
    一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP(2)低耦合
    我偶然在google或yahoo這樣的搜索引擎搜索GRASP發(fā)現(xiàn),除了國(guó)外的網(wǎng)站,國(guó)內(nèi)網(wǎng)站多介紹和討論GoF而很少介紹GRASP,即使這少量的文章也講解非常粗略。個(gè)人認(rèn)為作為優(yōu)秀的開(kāi)發(fā)人員,理解GRASP比GoF更重要,故寫(xiě)此文章。前面我在《  1.           “低耦合”這個(gè)詞相信大家已經(jīng)耳熟能詳,我們?cè)诳?/span>spring哪些是耦合呢?

     

    1幸運(yùn)的是,目前已經(jīng)有大量的框架幫助我們降低我們系統(tǒng)的耦合度。比如,使用struts但是,作為優(yōu)秀的開(kāi)發(fā)人員,僅僅依靠框架提供的降低軟件耦合的方法是遠(yuǎn)遠(yuǎn)不夠的。根據(jù)我的經(jīng)驗(yàn),以下一些問(wèn)題我們應(yīng)當(dāng)引起注意:

    1)   根據(jù)可能的變化設(shè)計(jì)軟件

    我們采用職責(zé)驅(qū)動(dòng)設(shè)計(jì),設(shè)計(jì)中盡力做到“低耦合、高內(nèi)聚”的一個(gè)非常重要的前提是,我們的軟件是在不斷變化的。如果沒(méi)有變化我們當(dāng)然就不用這么費(fèi)勁了;但是如果有變化,我們希望通過(guò)以上的設(shè)計(jì),使我們?cè)谶m應(yīng)或者更改這樣的變化的時(shí)候,付出更小的代價(jià)。這里提供了一個(gè)非常重要的信息是,我們努力降低耦合的是那些可能發(fā)生變更的地方,因?yàn)榻档婉詈鲜怯写鷥r(jià)的,是以增加資源耗費(fèi)和代碼復(fù)雜度為代價(jià)的。如果系統(tǒng)中某些元素不太可能變更,或者降低耦合所付出的代價(jià)太大,我們當(dāng)然就應(yīng)當(dāng)選擇耦合。有一次我試圖將我的表現(xiàn)層不依賴于struts2)   合理的職責(zé)劃分

    合理的職責(zé)劃分,讓系統(tǒng)中的對(duì)象各司其職,不僅是提高內(nèi)聚的要求,同時(shí)也可以有效地降低耦合。比如評(píng)審計(jì)劃BUS

    3)   使用接口而不是繼承

    通過(guò)對(duì)耦合的分析,我們不難發(fā)現(xiàn),繼承就是一種耦合。如果子類A《如何在 struts + spring + hibernate
    aaa1.JPG
     描述:  
     文件大小:  21 KB
     看過(guò)的:  文件被下載或查看 676 次

    aaa1.JPG
    下載

    最后更新:2007-01-31 08:47
    14:51  |   永久鏈接  |   瀏覽 (4062)  |   評(píng)論 (8)  |    收藏  |   進(jìn)入論壇  |  
    評(píng)論    共 8 條 發(fā)表評(píng)論
    silentlakeside     2007-01-22 16:51

    支持一下,我也覺(jué)得GRASP很重要,我是在《應(yīng)用UML與模式》這一書(shū)中看到GRASP,從此后我的設(shè)計(jì)思路基本上就是參照這幾個(gè)原則了。我覺(jué)得很多設(shè)計(jì)模式都是從GRASP發(fā)展而來(lái)。

    fangang     2007-01-22 17:02

    是的,正因?yàn)樗闹匾蚁Mㄟ^(guò)這篇文章,提供一個(gè)話題,大家都談?wù)勥@方面的體會(huì),共同進(jìn)步

    daoger     2007-01-22 17:53

    文章很好,地方不對(duì)!
    發(fā)在敏捷開(kāi)發(fā)板塊才合適!

    fangang     2007-01-22 18:57

    daoger 寫(xiě)道
    文章很好,地方不對(duì)!
    發(fā)在敏捷開(kāi)發(fā)板塊才合適!
    謝謝指教
    Uranus     2007-05-11 09:28

    說(shuō)真的,我覺(jué)得你這篇文章才是寫(xiě)得最好的(和你的create模式相比,因?yàn)閏reate模式中,你可能腦子很清楚,但是寫(xiě)的語(yǔ)句讓初學(xué)者很摸不到頭腦),我個(gè)人感覺(jué)好像設(shè)計(jì)模式都是國(guó)外人的提出來(lái)我們用,我們就缺乏提出思想的人,我們好多同志都是看這個(gè)好就拿過(guò)來(lái)用,根本說(shuō)不出好在哪。你這個(gè)能力很強(qiáng),希望將來(lái)在你的文章里面能多看到這種模式這樣做的理由是什么

    Uranus     2007-05-11 18:00

    對(duì)了,我還想請(qǐng)教你一個(gè)問(wèn)題呢,我之前聽(tīng)一個(gè)人說(shuō)過(guò),不管是gof的設(shè)計(jì)模式還是GRASP設(shè)計(jì)模式,最終的目的就是解耦合,不知道你怎么看這句話的,是否可以據(jù)個(gè)例子?

    fangang     2007-05-14 10:06

    謝謝Uranus的支持,實(shí)際上我們學(xué)習(xí)設(shè)計(jì)模式就是要思考它為什么好,我們?yōu)槭裁匆盟€有沒(méi)有問(wèn)題需要修改。最近我正在著手寫(xiě)《“單例”改變了我們的設(shè)計(jì)模式》,詳細(xì)描述在單例模式大行其道的今天,GoF中的許多模式都需要改改了。至于你的那個(gè)問(wèn)題,我已經(jīng)寫(xiě)到我的博客《設(shè)計(jì)模式GRASP和GoF是怎樣解決耦合的問(wèn)題》中了。

    JavaVM     2007-05-14 11:54

    期待你的《“單例”改變了我們的設(shè)計(jì)模式》

      回復(fù)  更多評(píng)論
      

    # re: [轉(zhuǎn)]一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP軟件開(kāi)發(fā)模式淺析 2007-10-16 11:27 蘆葦

    關(guān)鍵字:   高內(nèi)聚 Java 軟件工程 軟件模式    
    在上一章(原創(chuàng))一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP(2)低耦合中我聊了聊低耦合,今天我想再聊聊與低耦合休戚相關(guān)、GRASP的另一個(gè)重要的模式:高內(nèi)聚。

    2.           高內(nèi)聚是另一個(gè)普遍用來(lái)評(píng)判軟件設(shè)計(jì)質(zhì)量的標(biāo)準(zhǔn)。內(nèi)聚,更為專業(yè)的說(shuō)法叫功能內(nèi)聚,是對(duì)軟件系統(tǒng)中元素職責(zé)相關(guān)性和集中度的度量。如果元素具有高度相關(guān)的職責(zé),除了這些職責(zé)內(nèi)的任務(wù),沒(méi)有其它過(guò)多的工作,那么該元素就具有高內(nèi)聚性,反之則為低內(nèi)聚性。高內(nèi)聚要求軟件系統(tǒng)中的各個(gè)元素具有較高的協(xié)作性,因?yàn)樵谖覀冊(cè)谕瓿绍浖枨笾械囊粋€(gè)功能,可能需要做各種事情,但是具有高內(nèi)聚性的一個(gè)元素,只完成它職責(zé)內(nèi)的事情,而把那些不在它職責(zé)內(nèi)的事情拿去請(qǐng)求別人來(lái)完成。這就好像,如果我是一個(gè)項(xiàng)目經(jīng)理,我的職責(zé)是監(jiān)控和協(xié)調(diào)我的項(xiàng)目各個(gè)階段的工作。當(dāng)我的項(xiàng)目進(jìn)入需求分析階段,我會(huì)請(qǐng)求需求分析員來(lái)完成;當(dāng)我的項(xiàng)目進(jìn)入開(kāi)發(fā)階段,我會(huì)請(qǐng)求軟件開(kāi)發(fā)人員來(lái)完成;當(dāng)我的項(xiàng)目需要測(cè)試的時(shí)候,我會(huì)請(qǐng)求測(cè)試人員。。。。。。如果我參與了開(kāi)發(fā),我就不是一個(gè)高內(nèi)聚的元素,因?yàn)殚_(kāi)發(fā)不是我的職責(zé)。

     

    我們的項(xiàng)目為什么要高內(nèi)聚呢?我覺(jué)得可以從可讀性、復(fù)用性、可維護(hù)性和易變更性四個(gè)方面來(lái)理解。

    1一個(gè)人寫(xiě)文章、講事情,條理清晰才能易于理解,這同樣發(fā)生在讀寫(xiě)軟件代碼上。如果一堆代碼寫(xiě)得一團(tuán)亂麻,東一個(gè)跳轉(zhuǎn)西一個(gè)調(diào)用,讀它的人會(huì)感覺(jué)非常頭疼。這種事情也許一直在寫(xiě)程序的你我都曾經(jīng)有過(guò)經(jīng)歷。如果一段程序條理非常清晰,每個(gè)類通過(guò)名稱或說(shuō)明都能清楚明白它的意義,類的每個(gè)屬性、函數(shù)也都是易于理解的它所應(yīng)當(dāng)完成的任務(wù)和行為,這段程序的可讀性必然提高。在軟件產(chǎn)業(yè)越來(lái)越密集,軟件產(chǎn)業(yè)中開(kāi)發(fā)人員協(xié)作越來(lái)越緊密、分工越來(lái)越細(xì)的今天,軟件可讀性的要求相信也越來(lái)越為人們所重視。

    2在軟件開(kāi)發(fā)中,最低等級(jí)的復(fù)用是代碼拷貝,然后是函數(shù)的復(fù)用、對(duì)象的復(fù)用、組件的復(fù)用。軟件開(kāi)發(fā)中最懶的人是最聰明的人,他們總是想到復(fù)用。在代碼編寫(xiě)的時(shí)候突然發(fā)現(xiàn)某個(gè)功能是曾經(jīng)實(shí)現(xiàn)過(guò)的功能,直接把它拷貝過(guò)來(lái)就ok在前面《如何在struts+spring+hibernate的框架下構(gòu)建低耦合高內(nèi)聚的軟件》中我提到,我們現(xiàn)在的軟件是在不斷變更的,這種變更不僅來(lái)自于我們的客戶,更來(lái)自于我們的市場(chǎng)。如果我們的軟件通過(guò)變更能及時(shí)適應(yīng)我們的市場(chǎng)需求,我們就可以在市場(chǎng)競(jìng)爭(zhēng)中獲勝。如何能及時(shí)變更以適應(yīng)我們的市場(chǎng)呢,就是通過(guò)調(diào)整軟件的結(jié)構(gòu),使我們每次的變更付出的代價(jià)最小,耗費(fèi)的人力最小,這種變更才最快最經(jīng)濟(jì)。高內(nèi)聚的軟件,每個(gè)系統(tǒng)、模塊、類的任務(wù)都高度相關(guān),就使每一次的變更涉及的范圍縮小到最小。比如評(píng)審表發(fā)生了變更,只會(huì)與評(píng)審表對(duì)象有關(guān),我們不會(huì)去更改其它的對(duì)象。如果我們能做到這一點(diǎn),我們的系統(tǒng)當(dāng)然是可維護(hù)性好、易變更性好的系統(tǒng)。

    那么,我們?nèi)绾巫龅礁邇?nèi)聚呢?就拿前面我提到的評(píng)審項(xiàng)目舉例。我現(xiàn)在要為“評(píng)審表”對(duì)象編寫(xiě)一段填寫(xiě)并保存評(píng)審表的代碼。評(píng)審表對(duì)象的職責(zé)是更新和查詢?cè)u(píng)審表的數(shù)據(jù),但是在顯示一個(gè)要填寫(xiě)的評(píng)審表的時(shí)候,我需要顯示該評(píng)審計(jì)劃的名稱、該評(píng)審計(jì)劃有哪些評(píng)審對(duì)象需要評(píng)審。現(xiàn)在我如何編寫(xiě)顯示一個(gè)要填寫(xiě)的評(píng)審表的代碼?我在評(píng)審表對(duì)象的這個(gè)相應(yīng)的函數(shù)中編寫(xiě)一段查詢?cè)u(píng)審計(jì)劃和評(píng)審對(duì)象的代碼嗎?假如你這樣做了,你的代碼就不是高內(nèi)聚的,因?yàn)椴樵冊(cè)u(píng)審計(jì)劃和評(píng)審對(duì)象的數(shù)據(jù)不是它的職責(zé)。正確的方法應(yīng)當(dāng)去請(qǐng)求“評(píng)審計(jì)劃”對(duì)象和“評(píng)審對(duì)象”對(duì)象來(lái)完成這些工作,而“評(píng)審表”對(duì)象只是獲取其結(jié)果。

    另外,如果一個(gè)對(duì)象要完成一個(gè)雖然在自己職責(zé)范圍內(nèi),但過(guò)程非常復(fù)雜的任務(wù)時(shí),也應(yīng)當(dāng)將該任務(wù)分解成數(shù)個(gè)功能相對(duì)獨(dú)立的子函數(shù)來(lái)完成。我曾經(jīng)看見(jiàn)一個(gè)朋友寫(xiě)的數(shù)百行的一個(gè)函數(shù),讓人讀起來(lái)非常費(fèi)勁。同時(shí)這樣的函數(shù)中一些相對(duì)獨(dú)立的代碼,本可以復(fù)用到其它代碼中,也變成了不可能。所以我給大家的建議是,不要寫(xiě)太長(zhǎng)的函數(shù),超過(guò)一百行就可以考慮將一些功能分解出去。

    與“低耦合”一樣,高內(nèi)聚也不是一個(gè)絕對(duì),而是一個(gè)相對(duì)的指標(biāo),應(yīng)當(dāng)適當(dāng)而不能過(guò)度。正如我們?cè)诂F(xiàn)實(shí)生活中,如果在一個(gè)十來(lái)人的小公司,每個(gè)人的分工可能會(huì)粗一些,所分配的職責(zé)會(huì)廣一些雜一些,因?yàn)槠淇傮w的任務(wù)少;而如果在一個(gè)一兩百人的大公司,每個(gè)人的分工會(huì)細(xì)一些,所分配的任務(wù)會(huì)更加專一些,因?yàn)榭傮w任務(wù)多,更需要專業(yè)化的分工來(lái)提高效率。軟件開(kāi)發(fā)也是一樣,如果“評(píng)審計(jì)劃”對(duì)象完成的業(yè)務(wù)功能少,并且不復(fù)雜,它完全可以代理它的子表“評(píng)審對(duì)象”和“評(píng)審者”的管理。但是“評(píng)審計(jì)劃”對(duì)象需要完成的“對(duì)評(píng)審計(jì)劃表的管理”這個(gè)基本職責(zé)包含的業(yè)務(wù)功能繁多或者復(fù)雜,它就應(yīng)當(dāng)將“對(duì)評(píng)審對(duì)象表的管理”交給“評(píng)審對(duì)象”對(duì)象,將“對(duì)評(píng)審者表的管理”交給“評(píng)審者”對(duì)象。同樣,高內(nèi)聚的可維護(hù)性好、易變更性好只能是一個(gè)相對(duì)的指標(biāo)。如果一個(gè)變更的確是大范圍的變更,你永遠(yuǎn)不可能通過(guò)內(nèi)聚就不進(jìn)行大范圍的變更了。同時(shí)內(nèi)聚也是要付出代價(jià)的,所以你也不必要去為了一個(gè)不太可能的變更去進(jìn)行過(guò)度設(shè)計(jì),應(yīng)當(dāng)掌握一個(gè)度。過(guò)度的內(nèi)聚必將增加系統(tǒng)中元素之間的依賴,提高耦合度。所以“高內(nèi)聚”與“低耦合”是矛盾的,必須權(quán)衡利弊,綜合地去處理。綜上所述,“高內(nèi)聚”給軟件項(xiàng)目帶來(lái)的優(yōu)點(diǎn)是:可讀性強(qiáng)、易維護(hù)和變更、支持低耦合、移植和重用性強(qiáng)。

      回復(fù)  更多評(píng)論
      

    # re: [轉(zhuǎn)]一個(gè)優(yōu)秀軟件開(kāi)發(fā)人員的必修課:GRASP軟件開(kāi)發(fā)模式淺析 2007-10-16 11:28 蘆葦

    關(guān)鍵字:   GRASP Java 軟件模式    
     

    當(dāng)我們分析清楚客戶需求設(shè)計(jì)出用例模型以后,當(dāng)我們分析清楚客戶的業(yè)務(wù)環(huán)境制作出領(lǐng)域模型以后,當(dāng)我們綜合用例模型、領(lǐng)域模型和我們的聰明才智設(shè)計(jì)出一個(gè)又一個(gè)的類和它們各自的方法以后,當(dāng)就在一切都準(zhǔn)備就緒只欠東風(fēng)的關(guān)鍵時(shí)刻,一個(gè)對(duì)象發(fā)出了撕心裂肺的怒吼——誰(shuí)來(lái)創(chuàng)建我?!!!一個(gè)對(duì)象,不管擁有多么強(qiáng)大的功能,不管進(jìn)行了多么精巧的設(shè)計(jì),如果不能被創(chuàng)建,就如同韓信不能做將軍,孫臏不能當(dāng)軍師,勾踐不能回越國(guó),劉備不能得荊州,一切一切的雄才武略都如廢紙一張。既然“創(chuàng)建”對(duì)于對(duì)象如此重要,我們就來(lái)好好探討一下GRASP3.           當(dāng)我們完成了用例模型、領(lǐng)域模型、對(duì)象分析的設(shè)計(jì),初步完成了對(duì)象設(shè)計(jì)和職責(zé)分配的工作,開(kāi)始進(jìn)一步細(xì)化的時(shí)候,一個(gè)我們不得不考慮的問(wèn)題就擺在我們的面前——誰(shuí)來(lái)創(chuàng)建這些對(duì)象?也許現(xiàn)在的你會(huì)覺(jué)得好笑,這也是問(wèn)題嗎?在軟件實(shí)際開(kāi)發(fā)過(guò)程中,誰(shuí)需要使用某個(gè)對(duì)象,就去創(chuàng)建它就行了,有什么好討論的。但是,我不得不說(shuō)的是,如果你只是漫不經(jīng)心地想要隨意開(kāi)發(fā)一套軟件系統(tǒng),僅僅是完成自己工作而已,你完全不用考慮創(chuàng)建對(duì)象的問(wèn)題。然而如果你希望開(kāi)發(fā)一套高質(zhì)量的、低耦合的、封裝性和復(fù)用性高的軟件系統(tǒng),你必須得認(rèn)真考慮這個(gè)問(wèn)題。為什么呢?因?yàn)橄到y(tǒng)中如果一個(gè)對(duì)象A那么為了降低系統(tǒng)耦合,提高系統(tǒng)的清晰度、封裝性和可復(fù)用性,應(yīng)該有一些通用的原則,以用于對(duì)象職責(zé)分配中,關(guān)于“創(chuàng)建對(duì)象”這類職責(zé)的分配。這些原則的描述就在GRASP1)   創(chuàng)建者模式的描述

    如果以下條件之一為真(越多越好),則將創(chuàng)建類A如果有以上多個(gè)選項(xiàng)適用,通常首先條件1

    2)   何時(shí)使用

    在理解創(chuàng)建者模式的時(shí)候,我認(rèn)為一個(gè)首先必須理解的問(wèn)題是,在軟件項(xiàng)目的整個(gè)過(guò)程中,它應(yīng)該是在什么階段使用。一個(gè)網(wǎng)友曾經(jīng)發(fā)帖問(wèn)我,他不清楚GRASP3)   為什么

    我們做事往往有個(gè)習(xí)慣,凡事問(wèn)個(gè)為什么。前面我提到,使用創(chuàng)建者模式的主要目的是可以降低系統(tǒng)的耦合。那么,我們?cè)谑褂脛?chuàng)建者模式的這幾個(gè)建議的時(shí)候是如何降低耦合的呢?這一直是困擾了我很久的一個(gè)疑問(wèn),Craig Larman創(chuàng)建者模式告訴我們,如果系統(tǒng)中存在包含者容納被包含者,或整體聚集部分,則包含者往往是被包含者的最佳創(chuàng)建者,整體往往是部分的最佳創(chuàng)建者。為什么呢?首先,這樣的設(shè)計(jì)易于理解,可讀性強(qiáng)。為什么這么說(shuō)呢,我們用我們常見(jiàn)的單據(jù)與單據(jù)明細(xì)來(lái)說(shuō)明吧。一張單據(jù)有多條單據(jù)明細(xì),這些單據(jù)明細(xì)聚集于單據(jù)中,是單據(jù)的一個(gè)部分。對(duì)于某張單據(jù),我們只有去填寫(xiě)這張單據(jù),才會(huì)去填寫(xiě)它的明細(xì)。同樣,我們要查看和修改這張單據(jù)的明細(xì),首先肯定是找到這張單據(jù)。以上這些是我們?cè)趯?shí)際生活中大家都認(rèn)同的管理單據(jù)的方式。GRASP盡管包含者往往是被包含者的最佳創(chuàng)建者,整體往往是部分的最佳創(chuàng)建者,但是在一個(gè)軟件系統(tǒng)中,并不是所有類都有它的包含者或者整體。如果沒(méi)有,誰(shuí)應(yīng)當(dāng)創(chuàng)建它呢?記錄者當(dāng)然是另一個(gè)可以考慮的人選。倉(cāng)庫(kù)管理員管理進(jìn)出庫(kù)是ERP如果我們正在設(shè)計(jì)的軟件類也沒(méi)有記錄者,這可如何是好?具有創(chuàng)建這個(gè)類所需數(shù)據(jù)的那個(gè)類可以考慮,那個(gè)類就是信息專家(什么是“信息專家”,我會(huì)在以后對(duì)信息專家模式的文章中詳細(xì)描述)。在我們的設(shè)計(jì)過(guò)程中,很多類的創(chuàng)建是需要一些初始化數(shù)據(jù)的。最典型的就是我們的vo如果以上方法還不行,那我們就只有找使用者了。尋找使用者是我們創(chuàng)建類最常用的一種方法,但它的缺點(diǎn)也非常明顯。正如前面我描述的,我們系統(tǒng)中對(duì)某個(gè)軟件類的使用可能分布到系統(tǒng)的各個(gè)角落。當(dāng)我們因?yàn)槟硞€(gè)需求需要修改這個(gè)類的時(shí)候,我們根本不知道誰(shuí)在使用它。正因?yàn)槿绱耍@樣的修改變得如夢(mèng)魘一般,不斷地搜索,不斷地修改。我們前面說(shuō)過(guò),合理的軟件構(gòu)造是為了使我們的變更代價(jià)最小,而這樣的變更將使我們的代價(jià)太大了,也許一個(gè)不經(jīng)意的變更錯(cuò)誤將造成我們的系統(tǒng)中一個(gè)意想不到的地方發(fā)生異常。故我們變更后測(cè)試的代價(jià)也就因此而增大。總之,尋找使用者作為創(chuàng)建者是我們業(yè)務(wù)分析階段最后的終極選擇。

    4)   創(chuàng)建者模式是原則,不是準(zhǔn)則

    “創(chuàng)建者模式是原則,不是準(zhǔn)則”難道“原則”和“準(zhǔn)則”還有不同嗎?當(dāng)然。創(chuàng)建者模式是原則,所以我們?cè)跇I(yè)務(wù)分析階段應(yīng)當(dāng)盡量遵守。但創(chuàng)建者模式不是準(zhǔn)則,因?yàn)椴⒎俏覀兊乃熊浖惗急仨氉袷亍槭裁催@么說(shuō)呢?隨著項(xiàng)目的進(jìn)行,我們的分析設(shè)計(jì)就不再停留在業(yè)務(wù)的分析上,各種具體的框架和技術(shù)將不斷引進(jìn)項(xiàng)目中,這時(shí)對(duì)象的創(chuàng)建就不一定符合創(chuàng)建者模式。比如,為了提高系統(tǒng)的性能和可維護(hù)性、更好地處理對(duì)象的創(chuàng)建與回收等復(fù)雜的問(wèn)題,我們常常把對(duì)象的創(chuàng)建交給工廠,如spring

    總之,合理地創(chuàng)建對(duì)象可以有效的提供可讀性、降低耦合度、提高系統(tǒng)的封裝性和可移植性,我們應(yīng)當(dāng)引起重視。

      回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 99免费在线观看视频| 亚洲一区二区无码偷拍| 亚洲国产小视频精品久久久三级| 18禁无遮挡无码国产免费网站| 日本中文字幕免费看| 亚洲综合色一区二区三区| 亚洲尹人九九大色香蕉网站| 久久久久久亚洲精品不卡| 国产又黄又爽又刺激的免费网址 | 亚洲一卡2卡4卡5卡6卡在线99 | 337p日本欧洲亚洲大胆色噜噜| 国产国拍亚洲精品福利| 四虎免费永久在线播放| 成人毛片18女人毛片免费96| 91精品成人免费国产片| 久久99精品免费视频| a毛片在线还看免费网站| 免费无码国产V片在线观看| 亚洲heyzo专区无码综合| 国产成人精品日本亚洲专| 久久久婷婷五月亚洲97号色| 亚洲av午夜福利精品一区| 亚洲精品高清无码视频| 在线A亚洲老鸭窝天堂| 亚洲中文无韩国r级电影| 亚洲av无码国产精品色在线看不卡| 日韩高清在线免费观看| 青青草国产免费久久久下载| 性感美女视频免费网站午夜| 性xxxxx免费视频播放| 99re热免费精品视频观看 | 女人被男人躁的女爽免费视频 | 国产亚洲午夜高清国产拍精品| 亚洲成a人片在线观看老师| 免费大黄网站在线看| 又黄又大又爽免费视频| 亚洲AV无码不卡在线观看下载 | 成年女人毛片免费播放人| 毛片免费在线视频| 日韩中文字幕在线免费观看| 日韩视频在线免费观看|