淺談GRASP軟體開發模式
你是優秀軟體開發人員嗎?你知道GRASP嗎? GRASP軟體開發模式,全名為通用職責分配軟體模式(General Responsibility Assignment Software Patterns),是與著名的軟體模式GoF(Gang of Four,即我們常說的那23種軟體開發模式)齊名的另一種軟體開發模式。但與GoF不同的是,它並不是提出一些具體的軟體組織結構,而是提出,在將現實世界的業務功能抽象成軟體開發中具體對象的過程中,我們應當遵循的一些基本原則。遵循這些基本原則,我們才可以開發出高品質的軟體出來。對於我們要開發的軟體項目,我們可以不使用工廠模式、可以不使用單例模式、我們也可以不使用觀察者模式,但是我們不可能不將現實世界的業務功能抽象化成軟體開發中具體對象。從這個角度說,我們要提升自己的軟體開發質量,深入理解GRASP比深入理解GoF更重要。但我看到現在介紹GoF的文章多,介紹GRASP文章少。正因為如此,我現在把GRASP介紹給大家。
GRASP包含了9個模式,也就是9個基本原則。這在軟體設計大師Craig Larman的經典著作《UML與模式應用》中進行了深入地講解。 GRASP叫通用職責分配軟體模式,要理解GRASP,我們必須先理解的一個問題是,我們在物件分析和設計過程中為什麼要進行職責分配。
一.職責分配與職責驅動設計
在一個軟體專案開始的時候,我們通常需要進行需求分析,了解客戶需要設計一個什麼樣的軟體,這個軟體中應該有什麼功能。需求分析了解到的是現實世界中客戶需求的業務功能,每個業務功能往往是一個業務流程,即客戶在日常工作中不斷在完成的業務流程。同時,在使用者的問題世界中,必然有一些東西或說事物,它們之間存在著相互的關聯。
拿一個軟體評審管理系統作為一個例子吧。評審管理系統的業務需求如下:
1.評審組織者制訂評審計劃,提交領導審批,然後透過電子郵件通知評審者。
2.評審者接獲通知,分別對評審對象進行評審,填寫評審表,並可對評審對象提出疑問。
3.評審組織者總結評審者的疑問,召開評審會議討論這些疑問。在會上,有些疑問變成問題,有些疑問不是問題,有些則依然無法確認。
4.會後,評審主辦單位整理疑問,形成評審報告,然後由評審者分別表決評審是否通過。最後評審組織者總結表決結果,形成評審結論。
5.評審組織者追蹤問題的解決。
透過以上需求的描述,我們不難發現整個問題世界中的相關事物:評審組織者、評審計畫、評審者、評審對象、評審表、疑問、評審報告、評審結論、問題。我們也不難分析出這些事物相互關係,例如評審計畫與評審者是一對多,而評審報告與評審結論是一對一。
在RUP中,業務需求將形成用例模型及其描述文件中的用例,事物及其關係將形成領域模型中的對象,當然如何製作用例模型和領域模型超出了本文討論的範圍,有興趣的朋友可以看看相關文章。
領域模型中的物件將成為軟體開發中形成具體物件的基礎(軟體開發中形成什麼物件是根據軟體開發的具體需求而定的,不一定要與領域模型的物件一致)。用例模型中的用例,將透過賦予這些物件行為而得以實現。現在的問題就出來了,用例模型中的功能,或者說一系列行為,要如何分配給這些物件呢。也就是說,為了完成同一個任務,我可以將行為A交給物件X,也可以交給物件Y。雖然交給物件X與交給物件Y,我對行為A的具體實作不一樣,但都可以完成行為A的任務。那麼,我到底該交給對象X還是對象Y呢?有沒有一個基本原則呢?有,那就是依照職責分配任務。雖然從理論上來說,我可以任意定義對象,可以讓對象沒有任何意義,或者去完成任意的工作,但是通常我們不會這樣去設計。通常我們會將物件與現實世界的物件連結起來,例如設計一個評審計畫物件、評審者物件。且我們在設計物件的時候應做到「低表示差異」。低表示差異就是我們設計的物件應與現實世界的物件盡量一致。比如說我們設計一個物件叫“評審者”,是因為我們在現實世界中有評審。同時,我們為評審者對象賦予的行為也應當盡量與現實世界一致,例如增加評審者、修改評審者、得到評審者資訊。那麼哪些是這個物件該賦予的行為呢,這要由職責來決定。
我們透過對現實世界的分析,或者說對於領域模型的分析,設計出了軟體系統中的對象,這時候我們應為每一個對象分配職責。什麼是對象的職責呢,當然是透過對現實世界的分析,定義的這個對象應當完成的任務。例如評審者對象的職責是存取與評審者相關的資料。當然對象的職責不一定是一個,例如評審計畫包含了評審對象和評審者的子項,所以它在工作不繁忙的情況下可以代理處理評審對象和評審者的資訊存取。但是一個對象的職責不應當過多(也就2、3個就行了)並且高度相關。例如評審表對像如果分配職責處理評審表的同時,又去處理評審計畫的數據,這就叫職責無關。
職責分配現在已經被普遍認為是優秀的軟體設計應遵循的原則,它有以下好處:
1.低表示差異使軟體結構清晰,易於理解,因為軟體開發並不是一個人的事情。在多人共同開發的軟體專案中,一目了然的軟體結構可以避免開發人員因誤解而造成的不必要錯誤。
2.易於維護和變更。如果評審計畫出了問題或需要修改,我們就去找評審計劃,如果是評審者的問題我們就去找評審者,而絕對不會與其它對像有關。
這種透過考慮物件、職責、協作的物件設計及構件方式,稱為「職責驅動設計(RDD,Responsibility Drive Design)」。職責驅動設計是透過先設計使用案例模型、使用案例模型描述、操作契約、系統順序圖、領域模型、詞彙表,再一步步製作分析模型、設計模型,寫出每個功能的交互圖、類別圖的很複雜的過程,我在這裡就不再詳述了。但請大家注意一個非常重要的細節,前面我們說,軟體系統中的物件是根據現實世界抽象得到,物件職責的分配是根據物件的定義,分配一些不多且高度相關的任務。然而我們即使遵照這些原則,也有相當大的設計彈性空間,不同人根據自己的理解,對於同一個功能依然有各自不同的設計。 GRASP中文譯為“通用職責分配軟體模式”,就是對物件分析和設計中職責分配問題提出數個基本原則。同時,這幾個基本原則也應掌握一個度,即並不是所有情況下都適用,也不是一個絕對的指標。例如低耦合,並不是絕對的不耦合,不耦合軟體就沒辦法設計了;高內聚也不能無限度高內聚,否則系統就繁複異常了。
二.GRASP模式挨個析
GRASP軟體設計模式包含9個模式:創建者、資訊專家、低耦合、控制器、高內聚、多態性、純虛構、間接性、防止變異。
以上是淺談GRASP軟體開發模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

C語言中通過轉義序列處理特殊字符,如:\n表示換行符。 \t表示製表符。使用轉義序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要轉義兩次。不同平台和編譯器可能有不同的轉義序列,請查閱文檔。

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

在 C 語言中,char 和 wchar_t 的主要區別在於字符編碼:char 使用 ASCII 或擴展 ASCII,wchar_t 使用 Unicode;char 佔用 1-2 個字節,wchar_t 佔用 2-4 個字節;char 適用於英語文本,wchar_t 適用於多語言文本;char 廣泛支持,wchar_t 依賴於編譯器和操作系統是否支持 Unicode;char 的字符範圍受限,wchar_t 的字符範圍更大,並使用專門的函數進行算術運算。

C 語言中符號的使用方法涵蓋算術、賦值、條件、邏輯、位運算符等。算術運算符用於基本數學運算,賦值運算符用於賦值和加減乘除賦值,條件運算符用於根據條件執行不同操作,邏輯運算符用於邏輯操作,位運算符用於位級操作,特殊常量用於表示空指針、文件結束標記和非數字值。

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

在 C 語言中,char 類型轉換可以通過:強制類型轉換:使用強制類型轉換符將一種類型的數據直接轉換為另一種類型。自動類型轉換:當一種類型的數據可以容納另一種類型的值時,編譯器自動進行轉換。

C語言中沒有內置求和函數,需自行編寫。可通過遍歷數組並累加元素實現求和:循環版本:使用for循環和數組長度計算求和。指針版本:使用指針指向數組元素,通過自增指針遍歷高效求和。動態分配數組版本:動態分配數組並自行管理內存,確保釋放已分配內存以防止內存洩漏。

char 數組在 C 語言中存儲字符序列,聲明為 char array_name[size]。訪問元素通過下標運算符,元素以空終止符 '\0' 結尾,用於表示字符串終點。 C 語言提供多種字符串操作函數,如 strlen()、strcpy()、strcat() 和 strcmp()。
