程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 我眼中的Visual Studio 2010架構工具

我眼中的Visual Studio 2010架構工具

編輯:關於.NET

影響架構質量的是構建體系架構的思想、原則、實踐與架構師的經驗,絕不 是工具。即使是最優秀的架構工具,也不可能像倚天寶劍一般——倚天一出,誰 與爭鋒 ——似乎誰握住了這把利刃,就能夠成為武林盟主。架構工具可以改善 架構師的工作,卻不能替換架構的過程。軟件開發過程中,最重要的依舊是人。

我在嘗鮮Visual Studio 2010架構工具[i]時,偶然看到一篇文章,用誇張的 語言吹捧VS 2010架構工具,認為它是架構師最怕程序員知道的新工具。這讓我 有感而發,我想起數十年前甚囂塵上的一個理論,那就是CASE工具在未來可以取 代編碼工作的論斷。隨著DSL的逐漸流行,這個論斷似乎有了能夠實現的希望。 我們已經看到了很多優秀的代碼生成工具,通過建模,可以花很少的時間完成編 碼實現。然而,現實是CASE工具至今仍然無法完全取代編碼工作;而若要完全取 代架構與設計的工作,則近乎不可能,因為工具不可能取代人類的思想與經驗。 我們可以不斷地豐富最佳實踐,在知識庫中總結出架構的模式,利用工具來展現 這些規律與原則[ii]。這意味著我們可以從變化中尋找到不變,利用共性分析提 高復用的可能(包括架構的復用),但變化始終存在,針對的問題域會因項目而 異,即使是抽象,它也不可能無所不包,代表一切具體的實現。

理想架構工具的特點

“工欲善其事,必先利其器”。誠然,工具對我們的幫助不可低估,否則, 就是拒絕革新的保守思想;然而,盲目誇大工具的效力,忽視人的作用,帶來的 負面影響並不亞於故步自封對前進過程的阻撓。用正確的態度對待工具,工具才 能為我所用,這是我一貫堅持的態度。敏捷宣言認為:個體與交付重於過程和工 具。客戶滿意才是硬道理,架構與設計所使用的工具,與客戶滿意度沒有任何關 系。所以,我們評價工具,是要看它能否提高我們的工作效率,改善我們的工作 質量。那麼,VS 2010架構工具能夠做到這一點嗎?

我們需要先思考一下,作為架構師,最希望看到的架構工具是什麼?我認為 ,理想的工具應該具備如下特點:

易用性:可以非常容易和快速地構建與設計模型;

可驗證性:構建的模型是可以驗證的;

標准化:利於設計人員和開發人員的溝通;

工程化:支持正向工程與逆向工程;

可文檔化:能夠較好的支持文檔化;

可度量性:有助於對架構模型進行分析與度量;

模板化:支持通用的架構標准與原則,便於快速生成模型;

方法學支持:支持通用的軟件方法學(尤其是架構方法學);

可集成性:能夠結合在軟件開發生命周期過程中。

VS 2010的易用性

首先來看易用性。構建軟件系統的架構,一部分工作是與圖形在作戰。無論 是物理架構還是邏輯架構,用圖形表達整個系統錯綜復雜的關系,最為直觀。我 希望在繪制與架構相關的模型圖時,並不會因為繪圖的不便對我的設計思路產生 影響與阻撓,不會因為工具的無法表達或難以表達而影響我的工作質量,更不會 因為構建出來的架構模型圖被設計人員與開發人員所誤解。這意味著模型圖的繪 制要盡可能簡單與快捷,圖形的表達能力盡可能豐富,同時還要符合通用的標准 ,不會因為一套全新的標記而產生溝通上的分歧。以對UML的支持為例,我們在 構建架構的過程中,常用的UML模型涉及到包圖、組件圖、部署圖、活動圖以及 用例圖。 VS 2010克服了之前版本對UML支持不夠的弱點,充實了UML建模的能力 ,提供了包括組件圖、類圖、活動圖、時序圖、用例圖五種UML模型。例如,我 們可以繪制如下的組件圖:

圖1:組件圖示例

又或對時序圖的支持:

圖2:時序圖示例

整體來看,它對UML模型的支持差強人意,雖然可以繪制出異常漂亮的UML圖 ,但操作並不方便,無法提高建模的效率。例如:在組件圖中無法輕易地繪制接 口對組件的實現,對提供的接口與要求的接口之間的對應關系也較復雜;在時序 圖中,Actor的圖形既不符合UML通用標識,使用也不方便——它沒有將 Actor作 為一級公民,而是作為Lifeline的一項屬性提供。

作為架構師,如果希望完成UML建模,我不會選擇VS 2010,因為它沒有提供 包圖[iii]和部署圖,不過它所提供的層模型卻值得嘗試。如果我們需要對大型 生態系統的建模,或者繪制網絡拓撲圖,VS 2010更加難以勝任。從這一點來看 ,VS 2010若想成為架構師的首選,還有很長的路要走。

VS 2010對雙向工程的支持

根據我對VS 2010的分析,我認為,微軟的野心並沒有這麼大,它並沒有期待 VS 2010提供的架構工具完全涵蓋架構與設計的各個領域。它的傑出表現,尤其 對於UML建模而言,還是在於雙向工程(主要是逆向工程)的完美支持。

事實上,微軟對UML雙向工程的支持可以追溯到1997年與Rational合作開發的 Visual Modeler。在Rational被IBM收購之後,這一工具就銷聲匿跡了。從VS 2005開始,提供了對逆向工程的支持,但這種支持非常有限,僅限於對類圖的支 持。VS 2010完善了對UML主要模型的支持,因此雙向工程更具有普遍意義。VS 2010對正向工程的支持並不夠,它需要根據T4模板來創建,並充分利用了Visual Studio的擴展功能。我不明白微軟為何不直接在菜單項中提供對正向工程的支持 ,因為它本身可以非常完美地做到[iv]。

VS 2010對逆向工程的支持極為強大,除了支持之前版本已經提供的類圖外, 還支持生成依賴圖、時序圖以及層模型。依賴圖可以幫助我們了解程序的結構以 及類之間的關系,時序圖則有助於理解對象之間協作的方式,至於層模型則在更 高的層面上幫助我們了解分層架構。

VS 2010可以按照程序集、命名空間、類等建立依賴圖。以.NET提供的示例程 序StockTrader為例,我希望了解服務層中相關類之間的依賴關系,就可以通過 Architecture菜單的菜單項“Generate Dependency Graph”。我按照自定義的 方式生成依賴圖,如圖3所示:

圖3:根據自定義方式(公開的類)生成的依賴圖

圖4為該依賴圖的局部:

圖4:依賴圖的局部

我們可以看到Model對象被依賴的強度是最高的,其中ITradeSerivces接口幾 乎依賴所有的模型對象,這是因為該接口是服務層的主要服務,相當於外觀服務 ,負責協調和操作訂單、報價、賬戶信息等模型對象的消息處理。

就我的感受來看,這樣的依賴圖顯得有些華而不實,因為這樣一張蜘蛛網般 的圖形,實在讓人有些茫然,我們可能會在一張超級大型的依賴圖中迷路。不過 ,如果希望對依賴關系來一次鳥瞰,或者需要初步了解各個對象的依賴強度,該 依賴圖還是有一定的參考價值。此外,倘若系統規模不夠大,則可以選擇類型級 的依賴圖;如果系統規模太大,則可以根據程序集或命名空間生成依賴圖,這可 以在一定程度減小依賴圖的復雜程度。

時序圖的逆向工程實在太精彩了。靜態的類圖雖然有助於我們了解類的結構 ,但類之間的協作卻根本無法跟蹤。我們在做設計的時候,常常會借助時序圖來 幫助我們了解某個功能項的執行過程,追蹤它的消息傳遞方式,清晰把握類的協 作方式,並以此為基礎尋找到類的行為,以及不存在於真實世界的類對象。在閱 讀並理解代碼時,如果能夠有時序圖的幫助,會更容易理清設計的思路,明白設 計的目的。例如,同樣在StockTrader項目下,我需要了解服務層中 TradeService類的login()方法實現,就可以為其生成一個時序圖。在VS 2010中 ,生成時序圖只需要在方法上點擊右鍵,選擇“Generate Sequence Diagram… ”項即可。圖5是為login()方法生成的時序圖,我們可以清晰地看到 TradeService與Icustomer和 ConfigUtility之間的交互情況。

圖5:為login()方法生成的時序圖

在VS 2010中生成層模型和 驗證架構

層模型對架構師的幫助更大。VS 2010可以根據現有的解決方 案生成層模型。在打開現有解決方案後,添加一個新的Modeling Project,並創 建一個Layer Diagram,然後將解決方案的相關程序集拖拽到Layer Diagram的設 計器中。通過執行快捷菜單中的“Generate Dependencies”命令, 可以檢查並獲得各個程序集之間的依賴關系,並以圖形方式展現出來,如圖6所 示。

圖6:為服務層生成的層模型

通過圖6,我們可以 看到BusinessServiceImplementation依賴了StockTraderDALFactory、 StockTraderIDAL、BusinessServiceDataContract以及 BusinessServiceConfigurationSettings,同時它作為 BusinessServiceContract服務契約的實現,還要依賴BusinessServiceContract 。很明顯,BusinessServiceImplementation與具體的數據訪問層實現 StockTraderDALSQLServer之間沒有任何依賴關系,這就意味著服務層與數據訪 問層的具體實現是解耦的,這符合一般的架構原則。利用Layer Diagram,我們 就可以很好地了解各個模塊之間的依賴關系,幫助我們分析架構的合理性,是否 存在雙向依賴、循環依賴,或者模塊設計是否很好地遵循高內聚、松耦合原則。

VS 2010提供的“Validate Architecture”菜單項還可以對 架構進行驗證。我們可以直接對上面生成的Layer Diagram執行驗證。但這樣的 驗證並沒有價值,因為驗證的規則就是通過現有實現生成的。微軟推薦的做法是 架構師根據對層與模塊的理解,繪制一份符合架構原則的Layer Diagram,然後 將已經實現的程序集拖拽到相應層上,再執行驗證。如果實現違背了Layer Diagram要求的原則,就會提示錯誤[v]。這樣的驗證功能可以幫助架構師快速地 驗證團隊的開發人員在實現過程中是否遵循了自己的設計。

從上述分析可以看出,VS 2010架構工具充分利用了它與IDE集成的優勢,為 設計人員與開發人員提供了便利的工具,完成模型的轉換與輸出。這既有利於設 計人員對架構的驗證,幫助維護人員理清程序結構之間的關系,通過對依賴關系 的度量檢驗模塊和類之間的耦合關系,更有利於團隊在項目後期生成設計文檔。 可以說,VS 2010在可驗證性、標准化、工程化、可度量性方面都有閃光之處。 遺憾的是,VS 2010似乎並沒有提供自動將這些模型圖轉換到Word的功能[vi], 這不能不說是一種遺憾。

VS 2010的不足之處

VS 2010似乎並沒有足夠的功能支持我們快速生成架構,例如經典的三層架構 、管道-過濾器或MVC架構。這也正是我想表達的工具不能替代架構師的最大問題 。即使可以構造一些模板,就像提供項目計劃模板一般,支持這些經典架構的快 速生成,但始終無法替代架構師對領域知識以及質量屬性的分析與設計。

從方法學支持的角度來看,VS 2010仍然支持不夠。我很喜歡Enterprise Architect對ICONIX方法的支持方式,在VS 2010中沒有看到對相關方法學的支持 [vii]。即使是對UML的表達,VS 2010都顯得過於簡單(支持模型少)與復雜( 操作不方便),雖然它的圖形真的非常炫。當我需要構建一個架構時,VS 2010 絕對不會是我的首選;但當我需要為架構的實現進行驗證或者提供設計文檔時, 只要我工作在.NET平台下,我絕對會毫不猶豫地選擇它,它真的是一件具有超強 戰斗力的利器。

結語

現在的Visual Studio 2010已經不是單純的IDE這麼簡單,它是一個全方位作 戰的快速工作平台,通過它可以完成設計[viii]、開發、測試、重構以及團隊的 管理與協作。這種涵蓋軟件開發生命周期各個階段的綜合工具[ix],是開發人員 和管理者夢寐以求,因為我們不用再考慮各種不同工具之間的集成與部署,何況 VS 2010還提供了非常強大的擴展功能,使得我們能夠因項目或技術而異,實現 自己的定制。

不過,這種大一統的強權模式,很容易限制開發人員的自由與創新,抹殺人 的個性。“知其然而不知其所以然”,開發人員慢慢會產生一種惰性。由工具來 完成許多繁雜的工作,固然可以提高工作效率,卻失去了探究背後原理的機會, 正如當年的ASP.NET,造就了一幫不明HTTP工作機制的程序員一般。這就需要我 們進行取捨,回到開篇的話題上,那就是我們必須要明確自己對工具的態度,讓 工具為我所用,卻不會被其所制。

[i] 只在Visual Studio 2010 Ultimate版本中提供。

[ii] 就好似重構工具對重構原則的支持。

[iii] 在類圖中提供了Package,但沒有專門的包圖功能強大。

[iv]正向工程的做法請參見MSDN文檔:http://msdn.microsoft.com/en- us/library/ee329480.aspx#What

[v] 具體做法參見微軟的官方博客 http://blogs.technet.com/b/teamarchchina/archive/2009/08/31/vsts- 2010.aspx

[vi] 只能將模型圖粘貼到Word,而不提供直接導出Word文檔功能

[vii] 當然,VS 2010支持微軟解決方案框架,即MSF,可以實現概念設計、 邏輯設計與物理設計,但就現有的VS架構功能來看,對這些設計的支持顯然不夠 。

[viii] 對Modeling Project還支持版本控制功能。

[ix] VS 2010加大了對敏捷的支持,並將Scrum作為基本的敏捷開發模型。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved