代價?
也許有人說,我的設計極為靈活,我已經(jīng)預計了客戶可能提出的要求,并設計幾種應對的方式,到時候客戶提出來,呵呵,我已經(jīng)解決了。這樣的想法不錯,至少比僵硬的設計強,但是誰可以保證設計者可以預知以后的需求變化?而同時為了達到這種靈活(萬能/多能?)的設計,設計將變得復雜,而且可能那些多余的設計從來不會被用到?復雜的設計將增加實現(xiàn)的難度和提高成本,并有可能帶來潛在的Bug ,使得系統(tǒng)難以維護。
設計的思想應該有一些小小的轉變,那就是,設計確實要靈活,但是要體現(xiàn)在可擴展性上面,也就是說,設計可以簡單,但是一定要易于轉變,需要給出便于改變的接口,這一點很重要。
例如,現(xiàn)在有一個類叫做TCPConnection ,來代表計算機網(wǎng)絡通信中典型的TCP 連接,對于這個連接而言,它可能處于以下幾種狀態(tài):Established (連接已建立),Listening (正在偵聽),Closed (連接關閉)。一個連接對象需要從其他的對象接受請求,至于它的反應則決定于連接對象所處的狀態(tài),對于(打開連接的請求),如果是在連接關閉狀態(tài),則進行Open (),處于其他狀態(tài)則不做反應;同樣,如果在連接建立和偵聽狀態(tài),可以進行Close (),在連接建立狀態(tài)可以進行Acknowledge (),即接收數(shù)據(jù)。
對于這樣的狀況,最不可取的設計應該是用一系列的Switch 語句(甚至If/else 語句)進行Hard 設計,對于以后每一次需求改變,都需要改變源代碼,接踵而來的系統(tǒng)一致性、文檔更新等工作將使開發(fā)人員不可避免地陷入一場災難,這樣的后果將導致原來就不合理的設計變得更加支離破碎,系統(tǒng)維護的代價將越來越大;就算沒有需求變更發(fā)生,這些設計的可重用性也會極差。稍好一些的設計是預先估計并設置TCPConnection 類所有可能的狀態(tài),并預先加入設計,這種需要付出更多的設計、開發(fā)、維護的代價,而且也很難達到完美的效果,所以不多說了。
下面介紹一種經(jīng)典的設計思路,這種設計可以充分體現(xiàn)“為(系統(tǒng))將來改變預留接口”的可擴展性(Extensible-Design )思想,并且很好的實現(xiàn)了這一思想。在這里,我們引入一個抽象類TCPState 來代表TCPConnection 類的狀態(tài),給出具體各種狀態(tài)的通用操作接口,并派生出不同的子類(實現(xiàn)具體的操作)
去實現(xiàn)TCPConnection 類的不同狀態(tài),例如派生出TCPEstablished 類來實現(xiàn)TCPConnection 類的連接建立狀態(tài)。結構圖示如下:
只需要在TCPConnection 類中包含一個TCPState 的狀態(tài)引用,并在TCPConnection 的狀態(tài)改變時更新為當前的狀態(tài)引用,例如在連接關閉時進行Open (),狀態(tài)引用就應該從TCPClosed 變成TCPEstablished ,這樣就實現(xiàn)了原來的要求。
但這個設計思路的意義遠不止于此。我們可以看到,抽象類TCPState 已經(jīng)為TCPConnection 類將來可能的狀態(tài)留出接口,只需要不斷派生具體的不同狀態(tài)子類就可以實現(xiàn)將來的狀態(tài)變更,并且無須影響原有的設計,也無須加入多余的代碼來實現(xiàn)現(xiàn)在還不需要的功能,所以這是一個優(yōu)美的、可擴展的設計思路,非常清晰,易于維護,相信可以給我們在做軟件設計時帶來一些啟發(fā)。
可見,在面對需求變更時,除了客觀上可以通過人員培訓、代價分析等管理方式進行有效的需求管理外,從分析和設計的角度可以通過采用合理的分析和設計方法,還有改變我們設計的意識,可以做到對需求變更的靈活應對,至少可以在一定程度上降低維護代價和提高用戶滿意度。
軟件需求的管理和控制是非常專業(yè)的學問,作者在這里結合自己的實踐提出一些粗淺的認識,只是想起到一個拋磚引玉的作用,希望大家可以一起來面對和想辦法解決我們在系統(tǒng)開發(fā)過程中的實際問題,我想那樣才是我真正想達到的目的。
項目經(jīng)理勝任力免費測評PMQ上線啦!快來測測你排多少名吧~
http://opto-elec.com.cn/pmqhd/index.html