面向對象與領域建模板橋里人 http://www. 2006/12/6(轉載請保留) 多變且復雜的需求 如果沒有多變的需求,也許就沒有今天的面向對象軟件,我們曾經試圖通過需求管理、需求跟蹤等等管理方式約束和減少需求頻繁更新帶給軟件的沖擊,可是這樣下去的結果只有一個:使得軟件更加僵化;或者程序員更加 勞累。 需求不但多變,而且經常是不可能第一次就能掌握,需求反映了某個領域的專業(yè)知識,例如數學、管理、財務或 電子商務等等,每個特定案例需求又有其特別復雜之處,幾乎沒有人能夠第一次接觸就可以深入掌握這些專業(yè)領域的 需求本質,就是專門的建模專家也不例外。 既然需求是多變而且復雜的,所以,就不能使用“堵”式方法對其進行控制和管理,只能順勢而為,通過靈活多變的 以及迭代反復的方式逐步抓住需求,并且作為需求的實現軟件系統(tǒng)必須能夠迅速應對需求變化,需求變化有多快,軟件 變化就有多快。 因此,對于多變的需求,我們的解決之道是:引入靈活多變的架構,面向對象OO架構正是應對多變需求而生,強調軟件的可維護性 和拓展性,OO可能不是最好方式,但是目前是最合適的;對于復雜的需求,我們的解決之道是:委派專門的建模專家跟蹤理解需求, 在需求和需求實現之間搭建橋梁,項目方法上采取多次迭代的敏捷軟件開發(fā)方式,逐步了解學習掌握需求。 在這里稍微說明一下,很多人總是將軟件和數學、管理、財務混為一談,其實軟件本身就是一門獨立的專業(yè),是為 數學、管理。財務等專業(yè)領域服務的,不能期望軟件人員也是其他領域專業(yè)人員,可是在中國現實中,很多人總是 無法分辨,例如某局長將整個機關考核信息化的任務交給電腦中心,這就是將考核管理專業(yè)和軟件專業(yè)混同的例子, 在考核管理和軟件之間需要一個領域建模專家,由他來理解或者設計考核管理體系,然后通過模型,表達成 軟件人員能夠看懂的符號,軟件人員通過模型了解領域。 曾經有需求專家呼吁:最好將需求給所有軟件人員都了解,需求專家和一般軟件人員一起工作,這些想法的本質是 好的,但是不可能實現的,不可能每個軟件人員不但了解軟件架構和OO思想;還能夠掌握另外一個專業(yè)領域的艱深知識, 所以,現在我們提出:將領域專家建立的統(tǒng)一領域模型讓所有軟件人員都了解,讓一般軟件人員圍繞領域模型工作,這樣 的方式才切實可行。 需求分析方法演變 歷史上,對需求分析方法可以說經過三個階段: 在這個階段,雖然有UML幫助,但是UML不是思想,打個比喻:會CAD的繪圖員就是建筑師嗎?很顯然,UML就是CAD圖符號,UML不等于分析設計思想。 所以,有人說UML不是銀彈,這些就象說中醫(yī)不是科學一樣繞人(中醫(yī)就不是西醫(yī),當然就不是科學)。 第三階段:融合了分析階段和設計階段的領域驅動設計(Evans: DDD)。2004年Eric Evans 發(fā)表Domain-Driven Design –Tackling Complexity in the Heart of Software (領域驅動設計 )簡稱Evans DDD, 領域建模是一種藝術的技術,它是用來解決復雜軟件快速應付變化的解決之道,所以,從Evans DDD通篇文章中,你找不到科學象征的定理和公式,當然如果 你試圖尋找這樣尋找,你也就陷入了“中醫(yī)是不是科學”怪圈了。 Evans DDD拋棄了分裂分析模型與設計的做法,使用單一的模型來滿足這兩方面的要求。這就是領域模型。 單一的領域模型同時滿足分析原型和軟件設計 ,如果一個模型實現時不實用,重新尋找新模型。如果模型沒有忠實表達領域關鍵概念時,也必須重新尋找新的模型。 建模和設計成為單個迭代循環(huán)。將領域模型和設計緊密聯系。因此,建模專家必須懂設計。 領域建模的重要性 如果你說一個軟件開發(fā)需要經過需求、分析和設計三個階段的話,那么可能反映你的思想已經落伍,軟件開發(fā)現在是 經過需求、建模階段,混合了分析和設計階段,可以更激進地說:我們國家的系統(tǒng)分析員和系統(tǒng)設計員考試也許應該合并了, 合并成建模專家的考試,否則,這些都是中國軟件落后世界十年的證據,可悲的是:我們自己可能都不知道。 沒有面向對象的分析設計,哪里面向對象的構件或組件?過去經驗不是證明:我們使用大量的構件組件,卻在編制面向過程的體系? 領域建模屬于與具體.NET或Java技術無關的設計思想,有人總是說:.NET比Java簡單,其實這又是一個大誤區(qū),如果都達到同樣設計水準,無論使用.NET或Java,都需要付出同樣的努力;那為什么有人覺得.NET簡單,那是因為設計要求降低了,參見這篇.NET的DDD文章。 分層架構是現代OO軟件企業(yè)系統(tǒng)的基本架構,只有分層才能達到良好的可拓展性和維護性?;救龑樱罕憩F層、業(yè)務層和持久層 ;J2EE中表現層和持久層有成熟框架支持,應用重點在業(yè)務層。 業(yè)務層根據Evans DDD,可以再細分為應用層和領域層兩種,在業(yè)務層設計編碼中,大量應用OO設計原則和設計模式。領域層定義:負責表達業(yè)務領域概念、業(yè)務狀態(tài)以及業(yè)務規(guī)則,是整個業(yè)務軟件核心和重點。 應用層定義:負責完成功能,并且協(xié)調豐富的領域對象來實現功能,不能包括業(yè)務規(guī)則,無業(yè)務狀態(tài); 每個層都是內聚的,并且只依賴它的下層,為了實現各層的最大解耦,IOC/DI容器是當前Java業(yè)務層的最好選擇 。 沒有分層架構的快速開發(fā)基本是旁門左道,不如返回Foxpro和Delphi/VB兩層時代。將本屬于業(yè)務層的邏輯交由表現層來處理的快速UI方式也是一種旁門左道??焖匍_發(fā)必須基于良好的質量,雖然良好的分層架構帶來開發(fā)效率的降低,但是這些也是可以有方法解決。 建模與項目管理 Evans DDD領域驅動建模的誕生,對過去傳統(tǒng)的項目管理都提出挑戰(zhàn),當我們還在爭論RUP好還是敏捷好的時候, 誰會想到我們應該采取圍繞統(tǒng)一領域模型的迭代驅動開發(fā)呢? 有人可能還在疑惑?我接到一個大項目,那么我的建模和架構設計時間應該是5個月還是5年呢?當然應該回答他:都不行,需求是多變且復雜的,計劃趕不上變化,現在就應該開始DDD建模。 |
|
|