實戰(zhàn)項目分析_第1頁
實戰(zhàn)項目分析_第2頁
實戰(zhàn)項目分析_第3頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實戰(zhàn)項目分析最近接到一個臨時任務:幫外國某知名公司分析一個項目架構。這個項目是兩年前開發(fā)的,并且經過了幾次升級。主 要功能是管理客戶、合作伙伴資料,提供在線業(yè)務等等,具體細節(jié)不用多說。據(jù)客戶說,他們在使用本系統(tǒng)的過程中發(fā)現(xiàn)了很多的問題,覺得已經不再滿足他們的需求,希望我們能幫助他們評估 一下當前的系統(tǒng)有哪些架構上的問題,并幫助他們發(fā)現(xiàn)未來可能發(fā)生的問題,從而決定是否需要開發(fā)新的系統(tǒng)客戶提供了很詳細的文檔,包括業(yè)務說明,系統(tǒng)架構,技術要點,部署方案等等??赐晡臋n,對系統(tǒng)和客戶期望有了 一定的了解之后,開始干活兒!系統(tǒng)是采用.Net技術構建的,基于.Net Framework 2.0,使用了 AS

2、P.NET, WinForm, WebService 等技術,并使用了 Enterprise Library 中的 Data Access, Cache, Log 等功能。我本人負責的是架構的分析。結合文檔和源代碼,沒用1個小時,系統(tǒng)架構就很清晰了。其中發(fā)現(xiàn)了一些很普遍的問題,在這里跟大家分享一下:1. 分層架構分層架構是絕大部分企業(yè)軟件都普遍采用的方案,但由于架構師水平的參差不齊,導致很簡單的一個分層,出現(xiàn)了很 大的差異。大家都知道“3層架構”或者多層架構”。有點理論里分3層,有點理論里分 5層,還有分7層的。其實,在我看來分 幾層不重要,重要的是分層的目的。分層是為了什么的?簡單的說就一句

3、話:為了便于維護。大家都知道,軟件開發(fā)中變化”才是永恒的。開發(fā)周期是死的(盡管可以一拖再拖,但總有一個發(fā)布的截至日期吧?。?,但后期的維護卻是很不變得。不管是發(fā)布補丁也好,更新版本也好,其實都是為了能適應軟件發(fā)布之后面臨的各種各樣 的變化”。好,我們回到分層上來。分層,就是為了使系統(tǒng)結構更清晰,系統(tǒng)耦合性變小,使修改一處代碼時,對其它的部分影 響最小,這樣就能以最小的代價應對變化帶來的麻煩!所以,分層的第一要素,就是各層之間屏蔽細節(jié),降低依賴,使 各層具體實現(xiàn)變得透明(這也是SOA的其中一個重要思想)。我們可以通過各種辦法來達到這個目的,面向接口編程,設計模式,架構模式等等,都可以幫助我們。而我

4、在此項目中看到的第一個重要的問題就是,系統(tǒng)分層不清楚。下面是分層的簡圖:展現(xiàn)層公共模塊強類型業(yè)#對象業(yè)務邏輯層數(shù)據(jù)存取層fl數(shù)據(jù)庫由上圖可見,系統(tǒng)共分了三層。但有一個問題,業(yè)務對象竟然貫穿了三層,這嚴重違反了分層的初衷。由于業(yè)務對象對數(shù)據(jù)存取層和展現(xiàn)層都可見,導致如果我們的業(yè)務對象發(fā)生了變化,就要修改從數(shù)據(jù)存取、業(yè)務邏輯到展現(xiàn)層,這三個層次的所有相關代碼。而且這個方案違反了分層的兩個設計原則:a. 下層對上層隱藏細節(jié),只暴露接口。再此,本應屬于業(yè)務邏輯層的業(yè)務對象被暴露到了展現(xiàn)層。b. 上層對下層不可見。即下層不知道上層的存在,只提供接口。這里業(yè)務邏輯層的業(yè)務對象被數(shù)據(jù)存取層操作,會導致兩個層

5、之間糾纏不清,以至于會出現(xiàn)改動業(yè)務邏輯會影響數(shù)據(jù)存取方式的荒謬現(xiàn)象。另外,強類型 DataSet也有同樣的問題(本應是屬于數(shù)據(jù)存取層的,卻被傳遞到業(yè)務邏輯層,甚至是展現(xiàn)層)軟件設計中有一個很重要的原則就是:依賴倒置原則(DIP)依賴倒置的意思是:調用者依賴被調用者的接口,而不是實現(xiàn)。具體到此處就是:業(yè)務邏輯層應該依賴數(shù)據(jù)存取層的接口,而不是具體實現(xiàn)(強類型DataSet)。由于被調用者編程了抽象,而調用者變成了實現(xiàn)”所以與普通的面向對象的觀念來說,依賴關系被倒置了,因此被稱作依賴倒置原則。依賴倒置在分層結構中是很重要的原則。希望每一個設計者都時刻把它記在心間吧,呵呵。2. 面向接口編程其實這跟

6、上一個問題有密切聯(lián)系。面向接口編程,是依賴于抽象,而不是實現(xiàn) ”的具體手段。不管是模塊內部,還是個層次之間,面向接口是消除依賴的基礎。舉一個簡單的例子:本系統(tǒng)中業(yè)務邏輯層會調用數(shù)據(jù)存取層的方法,得到一些數(shù)據(jù)。比如調用一個PartnerAccess類的GetPartner的方法。PartnerAccess是數(shù)據(jù)存取層的一個具體類,負責Patrner表的所有增刪改查操作。而業(yè)務邏輯層到處充斥著這樣的語法:PartnerAccess partnerac = new PartnerAccess (); partnerac.getPartner ();這就是一個典型的依賴于具體實現(xiàn)的方案。這樣的后果是,

7、業(yè)務邏輯層知道每一個數(shù)據(jù)表的數(shù)據(jù)結構,甚至是無需知 道的細節(jié),并且對數(shù)據(jù)層的每一個方法都了如指掌,到處都在使用。當我們開始修改PartnerAccess的其中一個方法的時候(比如增加一個參數(shù))都要修改業(yè)務邏輯層的相關代碼,但誰知道那些代碼都在哪呢?只好重新編譯吧,讓編譯器告 訴我們。而面向接口編程可以使我們避免這種問題。我們不再依賴于千千萬萬個PartnerAccess或者什么別的 Access類,而是依賴一個IDataAccess的接口。這樣,所有的數(shù)據(jù)存取都被標準化,我們的調用代碼便的更簡單,不會依賴任何數(shù)據(jù)庫的 結構,甚至不需要知道表的名字,有多少個字段等等。當我們增加一個 OrderA

8、ccess類時,只需在數(shù)據(jù)存取層增加一個文 件,一個類就好了,而不需要更改業(yè)務邏輯層的任何代碼。記住這個原則吧,它也可以說是面向對象的核心思想。會讓你受益匪淺的!3. 領域模型不清晰從上面的圖中可以看出來,本系統(tǒng)同時使用了兩種領域模型,一種是業(yè)務對象(Business Object),一種是強類型 DataSet(Strong Type DataSet),并且在每個層次中都使用了。舉個簡單的例子:強類型 DataSet被應用到ASP.NET的控件綁定上,用來顯示數(shù)據(jù)。而業(yè)務對象被WebService暴露給客戶端。如果有人看過馬丁 福勒的那本企業(yè)架構模式的話,應該會記得對領域模型的選擇上有幾種方

9、案。其中業(yè)務對象 和強類型DataSet都被提到了,并且說明了什么時候適用哪個模型。這里我不多說,感興趣的朋友可以去看看那本書。我想說的是,這里使用了兩個模型并存的方案。這樣就使得系統(tǒng)的領域模型不清晰,而且存在很多的冗余,例如出現(xiàn) 了 Partner業(yè)務對象和PartnerDS強類型DataSet并存的現(xiàn)象,盡管他們各有各的優(yōu)缺點,但這樣勢必會造成領域模型的 難于維護和代碼可讀性差的問題。其實,特殊情況下,也可以兩個同時使用,但要注意,由于業(yè)務對象是屬于業(yè)務邏輯層的,而強類型DataSet是數(shù)據(jù)存取層的,所以他們都要在自己的范圍內活動,不能被其它的層次存取。到這里,有人可能會發(fā)現(xiàn)一個矛盾就是:

10、使用單一業(yè)務對象的話,則會對數(shù)據(jù)存取層帶來額外的開銷,因為數(shù)據(jù)存取層不能知道業(yè)務對象的存在,就需要使用抽象,會帶來一些代價。但如果使用單一的強類型DataSet的話,就會對業(yè)務邏輯層和展現(xiàn)層保留很多的內部數(shù)據(jù)細節(jié),也會對系統(tǒng)架構造成一些影響,而且也不利于WebService的傳輸。其實,一個合格的設計師,需要對這兩種方案做各自的調整,都為自己所用,但只取他們的優(yōu)勢,而避免他們的劣勢 多帶來的麻煩。軟件設計,何嘗又不是一種取舍的藝術呢!4. 強類型DataSet上面講到了業(yè)務對象和強類型DataSet兩種領域模型的使用問題。其實強類型DataSet是.NET中很好的一種方案,它集成了數(shù)據(jù)庫和面向

11、對象兩種優(yōu)點,如果使用的好的話,會事半功倍,但使用不好的話,麻煩也很大。在本系統(tǒng)中,強類型 DataSet被賦予很多使命:從數(shù)據(jù)庫中獲取信息(數(shù)據(jù)存取層)、業(yè)務處理(業(yè)務邏輯層)和數(shù) 據(jù)展現(xiàn)(展現(xiàn)層),貫穿了整個系統(tǒng)。這樣就使得整個系統(tǒng)對強類型DataSet的數(shù)據(jù)結構非常依賴,一旦數(shù)據(jù)庫發(fā)生變化,所有的代碼(從數(shù)據(jù)存取到展現(xiàn)層)都要修改代碼來。 并且最要命的是強類型 DataSet可以自動感知數(shù)據(jù)庫的變化,自動更新同步。試想,如果你是這個系統(tǒng)的編碼人員,會不會時時都提心吊膽呢?很顯然,這是一種糟糕的設計。在分層結構中,任何數(shù)據(jù)結構都不能貫穿始終,特別是與數(shù)據(jù)庫結構。這回帶來難以 置信的麻煩。分

12、層,其實就是要隔離這種變化給系統(tǒng)帶來的連鎖反應。使底層的修改不影響到頂層,反之亦然。當然這是不是意味著強類型DataSet就不能使用了呢?當然不是的。強類型DataSet是非常好的連接數(shù)據(jù)存取層和業(yè)務邏輯層的紐帶,因為它既有數(shù)據(jù)庫結構又有對象特性。所以,只要我們能在兩個層次中各自屏蔽細節(jié),依賴于抽象而 不是實現(xiàn),強類型 DataSet就可以在系統(tǒng)中發(fā)揮重要的作用。5. 展現(xiàn)層太臃腫本系統(tǒng)的很大一部分 UI都是B/S的,采用ASP.NET構建。但我發(fā)現(xiàn)很多的 WebPage中包含有大量的界面邏輯和業(yè) 務邏輯,基本每個 WebPage的代碼都在幾百行,有點甚至上千行。試想,這樣的UI維護起來對于每

13、一個開發(fā)者來說,大概都經歷過這種痛苦,為了數(shù)據(jù)庫的一個字段的修改,要從底層到頂層,全部修改一便, 而且UI的修改是最麻煩的,往往是越改越煩!其實對于UI的設計模式已經很成熟了,大家都知道MVC模式吧。就是一個很成熟,很實用的UI設計模式。另外還有MVP模式,這個是 MVC的基礎之上提出來的,跟 MVC思想相同,但細節(jié)上有所不同而已。MVC模式網(wǎng)上有很多的資料,也有很多有名的應用案例。MVP則被廣泛應用在微軟 P&P團隊的很多項目中,諸如: Software Factory系列中都有應用。下面是MVC模式和MVP模式的對比:另外,關于兩種模式的詳細對比,可以參考另一位 MVP:TreeLee的文

14、章:ASP.NET MVC Framework 與 WCSF中MVP模式之小小比較。6. 自定義事務.Net framework 2.0中內置了對事務的支持,不但可以管理進程內的事務(包括SQLServer事務),還可以自動提升至MSDTC來管理分布式事務(包括 WCF事務)。所以我們無需再編寫任何事物的管理代碼。本系統(tǒng)中使用了 Enterprise Library中的Data Access Application Block 作為數(shù)據(jù)存取方案。但卻沒有很好地利用.Netframework 2.0的事務功能,而是自己寫了很多管理事務的代碼。例如使用一個 Transactioncontext類管理事務的執(zhí)行,在很多數(shù)據(jù)存取的方法上支持傳入 TransactionCont

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論