前日下午過了下班時間,看同事A還沒有回去。問A為什麼還不回?A說正在整理下午的內部設計評審的內容。
接著又詢問了下午他們內部設計評審,總有多少人蔘加並且提出了多少個問題(其實想通過這個問題瞭解到提出問題的效率以及能力)。從回答的資料上來看,我覺得對於項目的第一次技術評審,該資料還有很大提升的空間。
簡單看了一下他們項目組的模型設計,我給A幾點建議:
- 美觀上去改進,給人看起來舒服,特別不要出現斜線、斜線交叉、實體對齊以及大小自動調整;
- 多用Note表達一些設計者的意圖,特別是在一些不能按常規思維考慮的地方,即使在設計文檔裡有闡述,也必須在模型上使用Note來給讀者一個鑰匙或者“指路”;
- 剛好開啟某實體,其中有屬性命名為“狀態”,相信該狀態肯定有狀態遷移圖,詢問了說在設計文檔中有描述,OK,但是在模型中沒有該狀態屬性的預設值,是正確嗎?另外狀態的屬性用什麼字串來表達呢?是S代表開始,還是Start,還是直接存“開始”;
- 剛好開啟某實體,其中有屬性命名為“次序”,詢問了次序這個屬性怎麼記值,是1..n呢?還是10、20、30這麼記?並且告訴同事,“次序”往往還跟你的UI實現有一些關係,是只提供提供Up/Down調整呢?還是支援Drag方式來調整次序?方式不一樣,可能設計中要儲存的實現方式也不一樣。
雖然只是走馬觀花看了一下,我覺得有必要結合這幾年給大家進行設計評審的經驗,總結一些模型設計時大家經常忽略的問題,給大家參考,分幾個方面進行論述:
模型中表達實體和實體的關係圖,在全域、易懂、上手、美觀上的考慮;
- 全域性考慮,不要將系統的所有實體都組織在一張圖上;根據系統的主題域進行切分,主題域是可以分層級關係,不一定只有一層;
- 每個主題域的實體關聯圖,布局控制在一張A4紙以內,這樣的好處在於一看就能看到該主題域的所有實體,而且當你列印出來也方便閱讀;使用CASE工具,如PD或者Rose都預設展現了一張紙張的大小;
- 在實體關聯圖內,每個實體的大小預設使用自動調整大小,除非你在以下兩種情況刻意要將實體縮小:
在實體關聯圖內,實體之間的關係,盡量不要用斜線來表達,表達成一個“斜線交叉網”的實體關聯圖是設計者的大忌;盡量用水平或者豎直線來表達;CASE工具都支援在一個圖中出現允許一個實體多個執行個體,來更好地組織實體關聯圖;
在實體關聯圖中,不要用模型預設給你生產的名稱或者代碼,大家一般都能做到也一定能做到改預設屬性名稱attribute_1,但是用預設的relation1來表達關係或者用constraint1來表達約束,我卻經常發現,請用有意義的名稱來表達;
在實體關聯圖中,注意給上描述表達一些實體、屬性、關係的含義;在實體關聯圖中應當多用Note將自己一些思考過程、重點/關鍵點、容易混淆的地方標記出來,每個CASE Tools都提供了很好的Note功能,大家好像為了保證整潔,不像我在圖上貼滿了“膏藥”;
從具體的設計方法上看,從業務的主題域開始入手去設計才是正確的方法,需要考慮如下:
- 確認前期業務系統的主題域劃分是否合理;並且使用Package來表達不同的主題域;
- 確認整個業務系統需要用到的各種常用基礎中繼資料,使用Domain來表達中繼資料,譬如:Address來表達地址、URL表達網址、PhoneNumber表達電話號碼等、Available代表可不可用等;
- 在主題域中,先進行實體設計,切切不要先進行實體屬性設計;
- 根據設計者的業務理解,先在圖上放入一個實體,給實體起一個名稱;從名稱的角度,給他起一個沒有二義性的名稱;如果名稱有二義,那麼你就要考慮是否實體需要分拆了;
- 有沒有發現圖中實體的某幾個實體好像在表達相同的意思,有的話,需要合并嗎?
- 迴圈執行4-5步驟,不斷思考實體是否合理呢,檢驗標準:從業務上去評判是否滿足原子性、無二義性;
- 考慮實體之間的關係如何?是組合、還是依賴,有遞迴關係嗎?是繼承關係嗎?是兩個實體的關聯關係嗎?
- 考慮實體之間的基數關係如何?是1..n還是0..n?是1..0還是1..1?(能表達1..1嗎?請讀者回答)
- 有沒有發現實體在生命週期的前後關係,是先有雞,還是先有蛋啊?
- 有沒有發現實體之間有互斥關係啊,有他沒我啊?
- 迴圈執行7-10步驟,確認實體之間的關係是否合理?檢驗標準:找個不瞭解業務的同事看是否能夠快速理解你的意圖;從業務上去評判。
截至到目前為止,總結了實體的初步設計,還沒有詳細進行實體屬性設計,後面的還更加複雜。今天先總結到這裡,設計不容易,想當設計師就得下功夫。
歡迎給我提意見!架構師就不要給我意見了,我都談不上架構師。