無所不能的重擊
作者:馬丁·福勒:1997 年 11/12 月《分散式運算》專欄
我與一位客戶聊到他們希望我進行的物件模型檢閱。「我們可以事先寄一些文件,這樣會有幫助嗎?」他們問。我肯定地回答,希望自己沒有說謊。兩天後,UPS 快遞員將包裹放在我家門外,發出很大的聲響。那是一疊厚達一吋半的文件。
我打開它,發現裡面是 CASE 工具列印出來的資料。它顯示了一些圖表,並詳盡描述每個類別,包括每個屬性和每個操作。所有這些都有定義。合約類別定義為「多方之間的合約」,其 dateSigned 屬性定義為「合約簽訂日期」。我通讀了這厚達一吋半的文件,但讀完後我還是不太明白。文件裡有許多關於物件是什麼的內容,但對於它們的用途卻很少說明。這不是第一次發生這種事,我敢肯定也不會是最後一次。
我們為什麼要費心製作模型或文件?它們不會執行,而且我們的客戶付錢給我們是要我們提供可執行的程式碼,而不是漂亮的圖片。我們費心製作模型是為了溝通。其想法是,圖形化物件模型可以比查看原始碼更清楚地顯示物件如何組合在一起,互動圖表可以比從多個類別定義中找出呼叫路徑更清楚地顯示協作。但設計文件常常在這方面失敗,讓我坐在沙發上百思不解。
部分問題出在人們用於這類工作的 CASE 工具。(CASE 工具有兩個用途,文件製作和程式碼產生,而我這裡只討論前者的角色。)CASE 工具鼓勵字典心態。你為每個類別建立一個條目,你在圖表上顯示每個類別和每個屬性,你為每個使用案例繪製一個互動圖表。它們透過協助你回答「我們是否已記錄所有內容?」的問題來鼓勵完整性。
但這個問題問錯了。如果你記錄所有內容,你就是給予所有內容同等的權重。對一個複雜的系統執行此操作,你會深陷在細節中。在任何系統中,有些面向比其他面向更重要,系統的關鍵面向一旦理解,將有助於某人進一步學習。文件編寫的藝術在於找出如何盡可能清楚地記錄這些面向。在此,你強調這些區域,並將細節留給程式碼。
最重要的是,此文件必須簡潔。只有簡潔,人們才會閱讀並理解它。只有簡潔,你才會費心讓它保持最新。你無法討論所有內容,也不應該這麼做。我的朋友告訴我一個專案,他們不願意變更類別名稱,不是因為變更程式碼需要太長的時間,而是變更文件需要太長的時間。當文件成為問題時,你應該處理它。至少丟棄一半。
你應該說什麼?
你應該如何選擇要顯示的內容?恐怕這取決於你的專業判斷。沒有規則可以指導你,只有你作為設計師和溝通者的技能。也許這就是為什麼人們試圖顯示所有內容,因為他們無法決定要省略什麼。因此,以下是我的方法,就像它目前所處的狀態。如果你的系統具有任何合理的規模,請將你的系統分為套件(類似 UML 或 Java)。每個套件都包含一組類別,這些類別共同為特定目的而工作。使用顯示套件及其相依性的圖表來記錄系統的整體結構。(在 UML 中,這是類別圖的特定用途,我經常使用它,所以我喜歡將它命名為套件圖,請參閱我的書 UML Distilled。)與你的設計合作以最小化這些相依性,這是最小化系統中耦合的關鍵。(關於如何執行此操作的文章不多,我所知道最好的文章是 Robert Martin 的使用 Booch 方法設計面向物件的 C++ 應用程式。)
針對每個套件撰寫一份簡要文件。文件的基礎是描述套件執行之主要事項及其執行方式的敘述性文字。UML 圖表可用於協助支援此目的。繪製類別圖表,顯示套件中重要的類別,但不必顯示所有類別。針對每個類別,僅顯示主要屬性和操作,絕對不要顯示所有屬性和操作。專注於介面而非實作。針對套件中每個重要的協作,顯示互動圖表。如果任何類別具有有趣的生命週期行為,請使用狀態圖表顯示。文件應小到足以讓您不覺得更新它很麻煩。我通常會盡量控制在不超過十二頁。
除了每個套件的文件之外,顯示協作如何跨越套件也很有用。為此,請找出系統中的主要使用案例,並使用互動圖表和敘述文件記錄它們。強調所涉及主要類別的類別圖表也很有用。許多人主張為系統中的每個使用案例繪製互動圖表。我覺得這可能會導致文件過多,但如果您覺得有用,而且不覺得更新它很麻煩,那就繼續做吧。即使如此,您也不應找出超過十二個主要使用案例來強調,讓所有人都需要了解。
溝通是關鍵
在整篇文章中,我都在強調溝通。我對 CASE 工具提出一些批評,但主要是想說使用工具本身並不表示您正在溝通。任何工具都能協助或阻礙溝通,您如何使用它會決定結果。
我認識的一個專案購買了一個多使用者 CASE 工具,任何開發人員都可以從其工作站存取。所有設計都必須放入 CASE 工具中。但僅僅因為任何開發人員都可以使用它,並不表示每個開發人員都會使用它。事實上,很少有開發人員會檢視 CASE 工具中的模型,更少的人會了解它們。專案的架構師了解到這一點,便佔據了辦公室的一面牆,並用一系列圖表覆蓋它,顯示系統中六個主要的協作。他使用物件圖表顯示它們,並使用色彩編碼來強調正在發生的事情。這並不表示所有開發人員都了解所有設計,但至少現在他們可以看到重要的元素是什麼。
當我開始撰寫這篇文章時,我可以討論的事情讓我不知所措。許多軼事和提示浮現在腦海中。但我知道,為了讓您閱讀並記住這篇文章,我只能討論其中一些。我必須選擇我必須提到的重點。溝通就是這樣。良好溝通的關鍵是強調重要的事情。說出所有事情並非溝通。那只是將重要事物的選擇權交給您的讀者,並用沉重的文件讓他們失去興趣。資訊的選擇是溝通中最重要的部分之一,而且是每個設計師的責任。