空間站

          北極心空

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

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

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

          在一個(gè)軟件項(xiàng)目開始的時(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í),在用戶的問題世界中,必然有一些東西或者說事物,它們之間存在著相互的關(guān)聯(lián)。

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

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

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

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

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

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

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

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

          (待續(xù))



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

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

          galaxystar     2007-01-20 13:50

          感覺是一種綜合體!

          zuly     2007-01-20 14:08

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

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

          fangang     2007-01-22 08:46

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

           

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

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

           

          fangang     2007-01-22 09:15

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

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

           

          newman     2007-01-24 10:36

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

          fangang     2007-01-24 13:46

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

          fly_ever     2007-01-24 15:55

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

          fangang     2007-01-24 16:23

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

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

           

          fangang     2007-01-25 09:51

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

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

          Feedback

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

           

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

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

          我們采用職責(zé)驅(qū)動(dòng)設(shè)計(jì),設(shè)計(jì)中盡力做到“低耦合、高內(nèi)聚”的一個(gè)非常重要的前提是,我們的軟件是在不斷變化的。如果沒有變化我們當(dāng)然就不用這么費(fèi)勁了;但是如果有變化,我們希望通過以上的設(shè)計(jì),使我們在適應(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)中的對象各司其職,不僅是提高內(nèi)聚的要求,同時(shí)也可以有效地降低耦合。比如評審計(jì)劃BUS

          3)   使用接口而不是繼承

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

          aaa1.JPG
          下載

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

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

          fangang     2007-01-22 17:02

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

          daoger     2007-01-22 17:53

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

          fangang     2007-01-22 18:57

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

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

          Uranus     2007-05-11 18:00

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

          fangang     2007-05-14 10:06

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

          JavaVM     2007-05-14 11:54

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

            回復(fù)  更多評論
            

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

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

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

           

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

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

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

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

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

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

            回復(fù)  更多評論
            

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

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

          2)   何時(shí)使用

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

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

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

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

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

            回復(fù)  更多評論
            

          主站蜘蛛池模板: 稻城县| 礼泉县| 陆河县| 宁城县| 永兴县| 屏边| 阿瓦提县| 嘉兴市| 昌平区| 嫩江县| 新巴尔虎左旗| 高唐县| 礼泉县| 美姑县| 留坝县| 宁南县| 桂东县| 资溪县| 定州市| 保亭| 得荣县| 都江堰市| 洞头县| 临夏市| 遂平县| 清河县| 共和县| 安溪县| 刚察县| 扶余县| 开阳县| 岢岚县| 花垣县| 沁水县| 闵行区| 永嘉县| 南昌县| 克拉玛依市| 清流县| 浦江县| 东台市|