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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
     

    你是一個優秀軟件開發人員嗎?你知道GRASP 

    一.職責分配和職責驅動設計

    在一個軟件項目開始的時候,我們通常需要進行需求分析,了解客戶需要設計一個什么樣的軟件,這個軟件中應當有什么功能。需求分析了解到的是現實世界中客戶需求的業務功能,每個業務功能往往是一個業務流程,即客戶在日常工作中不斷在完成的業務流程。同時,在用戶的問題世界中,必然有一些東西或者說事物,它們之間存在著相互的關聯。

    拿一個軟件評審管理系統作為一個例子吧。評審管理系統的業務需求如下:

    1通過以上需求的描述,我們不難發現整個問題世界中的相關事物:評審組織者、評審計劃、評審者、評審對象、評審表、疑問、評審報告、評審結論、問題。我們也不難分析出這些事物相互關系,比如評審計劃與評審者是一對多,而評審報告與評審結論是一對一。

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

    1這種通過考慮對象、職責、協作的對象設計及構件方式,被稱為“職責驅動設計(RDD

    二.GRASP模式挨個析

    GRASP(原創)一個優秀軟件開發人員的必修課:GRASP(2)低耦合

    (原創)一個優秀軟件開發人員的必修課:GRASP(3)高內聚

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

    (待續)



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

    沒有下文了? 期待中。GRASP和GoF是不同類型的模式, 出發點不同。 GRASP是解決類之間如何交互, 如何設計合理, 和具體問題無關。

    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!

    我寫這篇文章的起因是因為我偶然在google或yahoo這樣的搜索引擎搜索GRASP發現,除了國外的網站,國內網站多介紹和討論GoF而很少介紹GRASP,即使這少量的文章也講解非常粗略。個人認為作為優秀的開發人員,理解GRASP比GoF更重要,故寫此文章。此文章后面的內容我會不斷添上,謝謝支持

     

    fangang     2007-01-22 09:15

    amigobot 寫道
    沒有下文了? 期待中。GRASP和GoF是不同類型的模式, 出發點不同。 GRASP是解決類之間如何交互, 如何設計合理, 和具體問題無關。

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

     

    newman     2007-01-24 10:36

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

    fangang     2007-01-24 13:46

    謝謝指教,grasp和gof都是稱為軟件開發模式,只是描述的內容和角度不同,這相關的問題Craig Larman在《UML和模式應用》的第17章中有詳細描述

    fly_ever     2007-01-24 15:55

    有一本書闡述了GRASP,《深入淺出設計模式 C#/JAVA版》,06年出版的。
    感覺跟GOF相比,GRASP主要是用來指導面向對象的分析和設計。

    fangang     2007-01-24 16:23

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

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

     

    fangang     2007-01-25 09:51

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

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

    Feedback

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

     

    1幸運的是,目前已經有大量的框架幫助我們降低我們系統的耦合度。比如,使用struts但是,作為優秀的開發人員,僅僅依靠框架提供的降低軟件耦合的方法是遠遠不夠的。根據我的經驗,以下一些問題我們應當引起注意:

    1)   根據可能的變化設計軟件

    我們采用職責驅動設計,設計中盡力做到“低耦合、高內聚”的一個非常重要的前提是,我們的軟件是在不斷變化的。如果沒有變化我們當然就不用這么費勁了;但是如果有變化,我們希望通過以上的設計,使我們在適應或者更改這樣的變化的時候,付出更小的代價。這里提供了一個非常重要的信息是,我們努力降低耦合的是那些可能發生變更的地方,因為降低耦合是有代價的,是以增加資源耗費和代碼復雜度為代價的。如果系統中某些元素不太可能變更,或者降低耦合所付出的代價太大,我們當然就應當選擇耦合。有一次我試圖將我的表現層不依賴于struts2)   合理的職責劃分

    合理的職責劃分,讓系統中的對象各司其職,不僅是提高內聚的要求,同時也可以有效地降低耦合。比如評審計劃BUS

    3)   使用接口而不是繼承

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

    aaa1.JPG
    下載

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

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

    fangang     2007-01-22 17:02

    是的,正因為它的重要,我希望通過這篇文章,提供一個話題,大家都談談這方面的體會,共同進步

    daoger     2007-01-22 17:53

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

    fangang     2007-01-22 18:57

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

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

    Uranus     2007-05-11 18:00

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

    fangang     2007-05-14 10:06

    謝謝Uranus的支持,實際上我們學習設計模式就是要思考它為什么好,我們為什么要用它,它還有沒有問題需要修改。最近我正在著手寫《“單例”改變了我們的設計模式》,詳細描述在單例模式大行其道的今天,GoF中的許多模式都需要改改了。至于你的那個問題,我已經寫到我的博客《設計模式GRASP和GoF是怎樣解決耦合的問題》中了。

    JavaVM     2007-05-14 11:54

    期待你的《“單例”改變了我們的設計模式》

      回復  更多評論
      

    # re: [轉]一個優秀軟件開發人員的必修課:GRASP軟件開發模式淺析 2007-10-16 11:27 蘆葦

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

    2.           高內聚是另一個普遍用來評判軟件設計質量的標準。內聚,更為專業的說法叫功能內聚,是對軟件系統中元素職責相關性和集中度的度量。如果元素具有高度相關的職責,除了這些職責內的任務,沒有其它過多的工作,那么該元素就具有高內聚性,反之則為低內聚性。高內聚要求軟件系統中的各個元素具有較高的協作性,因為在我們在完成軟件需求中的一個功能,可能需要做各種事情,但是具有高內聚性的一個元素,只完成它職責內的事情,而把那些不在它職責內的事情拿去請求別人來完成。這就好像,如果我是一個項目經理,我的職責是監控和協調我的項目各個階段的工作。當我的項目進入需求分析階段,我會請求需求分析員來完成;當我的項目進入開發階段,我會請求軟件開發人員來完成;當我的項目需要測試的時候,我會請求測試人員。。。。。。如果我參與了開發,我就不是一個高內聚的元素,因為開發不是我的職責。

     

    我們的項目為什么要高內聚呢?我覺得可以從可讀性、復用性、可維護性和易變更性四個方面來理解。

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

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

    那么,我們如何做到高內聚呢?就拿前面我提到的評審項目舉例。我現在要為“評審表”對象編寫一段填寫并保存評審表的代碼。評審表對象的職責是更新和查詢評審表的數據,但是在顯示一個要填寫的評審表的時候,我需要顯示該評審計劃的名稱、該評審計劃有哪些評審對象需要評審?,F在我如何編寫顯示一個要填寫的評審表的代碼?我在評審表對象的這個相應的函數中編寫一段查詢評審計劃和評審對象的代碼嗎?假如你這樣做了,你的代碼就不是高內聚的,因為查詢評審計劃和評審對象的數據不是它的職責。正確的方法應當去請求“評審計劃”對象和“評審對象”對象來完成這些工作,而“評審表”對象只是獲取其結果。

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

    與“低耦合”一樣,高內聚也不是一個絕對,而是一個相對的指標,應當適當而不能過度。正如我們在現實生活中,如果在一個十來人的小公司,每個人的分工可能會粗一些,所分配的職責會廣一些雜一些,因為其總體的任務少;而如果在一個一兩百人的大公司,每個人的分工會細一些,所分配的任務會更加專一些,因為總體任務多,更需要專業化的分工來提高效率。軟件開發也是一樣,如果“評審計劃”對象完成的業務功能少,并且不復雜,它完全可以代理它的子表“評審對象”和“評審者”的管理。但是“評審計劃”對象需要完成的“對評審計劃表的管理”這個基本職責包含的業務功能繁多或者復雜,它就應當將“對評審對象表的管理”交給“評審對象”對象,將“對評審者表的管理”交給“評審者”對象。同樣,高內聚的可維護性好、易變更性好只能是一個相對的指標。如果一個變更的確是大范圍的變更,你永遠不可能通過內聚就不進行大范圍的變更了。同時內聚也是要付出代價的,所以你也不必要去為了一個不太可能的變更去進行過度設計,應當掌握一個度。過度的內聚必將增加系統中元素之間的依賴,提高耦合度。所以“高內聚”與“低耦合”是矛盾的,必須權衡利弊,綜合地去處理。綜上所述,“高內聚”給軟件項目帶來的優點是:可讀性強、易維護和變更、支持低耦合、移植和重用性強。

      回復  更多評論
      

    # re: [轉]一個優秀軟件開發人員的必修課:GRASP軟件開發模式淺析 2007-10-16 11:28 蘆葦

    關鍵字:   GRASP Java 軟件模式    
     

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

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

    2)   何時使用

    在理解創建者模式的時候,我認為一個首先必須理解的問題是,在軟件項目的整個過程中,它應該是在什么階段使用。一個網友曾經發帖問我,他不清楚GRASP3)   為什么

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

    4)   創建者模式是原則,不是準則

    “創建者模式是原則,不是準則”難道“原則”和“準則”還有不同嗎?當然。創建者模式是原則,所以我們在業務分析階段應當盡量遵守。但創建者模式不是準則,因為并非我們的所有軟件類都必須遵守。為什么這么說呢?隨著項目的進行,我們的分析設計就不再停留在業務的分析上,各種具體的框架和技術將不斷引進項目中,這時對象的創建就不一定符合創建者模式。比如,為了提高系統的性能和可維護性、更好地處理對象的創建與回收等復雜的問題,我們常常把對象的創建交給工廠,如spring

    總之,合理地創建對象可以有效的提供可讀性、降低耦合度、提高系統的封裝性和可移植性,我們應當引起重視。

      回復  更多評論
      

    主站蜘蛛池模板: 久久午夜夜伦鲁鲁片无码免费| 人成电影网在线观看免费| 无码免费一区二区三区免费播放 | 亚洲精品一级无码鲁丝片| 亚洲 欧洲 自拍 另类 校园| 啦啦啦中文在线观看电视剧免费版 | 久久精品国产亚洲Aⅴ香蕉| 伊人久久国产免费观看视频| 亚洲伊人久久成综合人影院| 五月婷婷免费视频| 国产亚洲av人片在线观看| 在线观看人成视频免费无遮挡| 亚洲国产精品无码专区影院 | 国产精品久久免费视频| 国产午夜亚洲精品不卡| 亚洲男女内射在线播放| 嫩草在线视频www免费看| 亚洲精品国产情侣av在线| 亚洲人成免费网站| 亚洲乱色伦图片区小说| 亚洲精品乱码久久久久久蜜桃| a毛片久久免费观看| 亚洲一级二级三级不卡| 最近2019中文字幕免费看最新 | 2021国内精品久久久久精免费| 亚洲精品综合在线影院| 日韩亚洲国产二区| 无码人妻久久一区二区三区免费| 亚洲w码欧洲s码免费| 亚洲AV无码不卡在线观看下载| 国色精品va在线观看免费视频| 亚洲春色在线观看| 亚洲 国产 图片| 97免费人妻在线视频| 香蕉视频免费在线播放| 在线a亚洲v天堂网2019无码| 狼群影院在线观看免费观看直播| 豆国产96在线|亚洲| 亚洲国产精品无码专区| 女人18毛片特级一级免费视频| 久久成人永久免费播放|