轉:我眼中的Visual Studio 2010架構工具

來自:http://www.cnblogs.com/wayfarer/archive/2010/07/30/1788398.html

我眼中的Visual Studio 2010架構工具

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

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

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

我們需要先思考一下,作為架構師,最希望看到的架構工具是什么?我認為,理想的工具應該具備如下特點:?
1、易用性:可以非常容易和快速地構建與設計模型;?
2、可驗證性:構建的模型是可以驗證的;?
3、標準化:利于設計人員和開發人員的溝通;?
4、工程化:支持正向工程與逆向工程;?
5、可文檔化:能夠較好的支持文檔化;?
6、可度量性:有助于對架構模型進行分析與度量;?
7、模板化:支持通用的架構標準與原則,便于快速生成模型;?
8、方法學支持:支持通用的軟件方法學(尤其是架構方法學);?
9、可集成性:能夠結合在軟件開發生命周期過程中;

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

image

圖1:組件圖示例

又或對時序圖的支持:

image

圖2:時序圖示例

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

作為架構師,如果希望完成UML建模,我不會選擇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的擴展功能。我不明白微軟為何不直接在菜單項中提供對正向工程的支持,因為它本身可以非常完美地做到 。

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

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

image

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

圖4為該依賴圖的局部:image

圖4:依賴圖的局部

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

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

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

image

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

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

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

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

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

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

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

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

現在的Visual Studio 2010已經不是單純的IDE這么簡單,它是一個全方位作戰的快速工作平臺,通過它可以完成設計 、開發、測試、重構以及團隊的管理與協作。這種涵蓋軟件開發生命周期各個階段的綜合工具 ,是開發人員和管理者夢寐以求,因為我們不用再考慮各種不同工具之間的集成與部署,何況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作為基本的敏捷開發模型。

注:原文發表于InfoQ《架構師》月刊2010年7月,鏈接地址為:http://www.infoq.com/cn/articles/visual-studio-2010-architecture-tool?

轉載于:https://www.cnblogs.com/songsh96/archive/2010/10/27/1862191.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VMware創建Ubuntu操作系統到網絡配置詳細流程

一、創建虛擬機 Ubuntu下載鏈接 1,看個人需求了,有更高的版本,下載Ubuntu鏡像 2,VMware官網隨便下載即可 3,創建新的虛擬機 4,自定義 5,默認即可 6,稍后安裝操作系統 7&#xf…

djiango配置mysql_數據庫MySQL相關環境配置以及數據庫與Go的連接

Linux下安裝好MySQL后,Windows安裝可視化工具navicatLinux下MySQL與Windows下navicat進行連接:安裝的過程很是揪心,各種查網站、大致把坑都寫了出來:1、在Linux下的mysql語句中,mysql> select host,user,authentication_string…

緩沖文件系統(fopen/fread/fwrite)和非緩沖文件系統(open/read/write)

open:系統調用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。 fopen:C語言庫函數,返回的是一個指向文件結構的指針。fopen是ANSI C標準中的C語言庫函數,在不同的操作系統中應…

java 繼承示例_Java中的繼承類型以及示例

java 繼承示例Prerequisite: Inheritance and its implementation in Java 先決條件: 繼承及其在Java中的實現 Java中的繼承類型 (Type of inheritance in Java) In Java programming, there are following types of the inheritances, 在Java編程中,有…

基于HtmlParser的網絡爬蟲

一、 目標 獲取網頁中的超鏈接及鏈接名,如從http://www.hao123.com/開始,抓取所有hao123鏈接到的超鏈接,再以獲取到的鏈接網頁為目標,獲取它所鏈接到的網頁。 二、環境及開發工具 環境:Java 工具:MyEclip…

VMware下Ubuntu無法全屏顯示問題

一、運行Ubuntu的時候無法全屏顯示,如圖所示下載VMware Tools 二、之后將下載的文件拷貝到home文件夾下 三、解壓該壓縮包 由于該壓縮包是.tar.gz結尾的故壓縮命令:tar -zxvf VMwareTools-10.2.5-8068393.tar.gz,當然各版本有可能不一樣&am…

AMQP RabbitMQ

轉載:http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/官方介紹:http://www.rabbitmq.com/erlang-client-user-guide.html開始吧AMQP當中有四個概念非常重要:虛擬主機(virtual host&#xff…

fsync與fflush的關系和區別

read/write/fsync與fread/fwrite/fflush的關系和區別 read/write/fsync: linux底層操作; 內核調用, 涉及到進程上下文的切換,即用戶態到核心態的轉換,這是個比較消耗性能的操作。 fread/fwrite/fflush:…

lumanager mysql密碼_LuManager單獨安裝mysqli

首先確定你正在使用的php版本以及php.ini的位置,LuManager自帶了幾個版本。如果是默認安裝,應該是5.2.17。php.ini的位置應該是在/usr/local/php_fcgi/lib/php.ini要確定這些信息,可以自己編寫一個 info.phpphpinfo();?>把文件存放到網站…

數據庫系統數據庫管理系統_數據庫管理系統介紹

數據庫系統數據庫管理系統數據庫 (Database) A database is a collection of related data. In database any user can efficiently access the data which users want to retrieve. It can be anything from a simple collection of roll numbers, names, addresses and phone…

vba將select的值直接賦給變量

strSql ""strSql strSql & " select max(number) from dbo.#DATA" & vbCrLfrss.Open strSql, cnn numb rss.Fields(0)rss.Close轉載于:https://www.cnblogs.com/zigewb/archive/2013/02/06/2900645.html

set_exception_handler 自定義異常處理

剛才已經說過了set_error_handler這個函數,作用就是自定義錯誤處理, 那么現在就來簡單的說一下set_exception_handler,看名字我們就能發現,這說的是自定義異常處理。 呵呵,我聰明吧?來,先看一下…

如何獲取ubuntu源碼包里面的源碼進行編譯

如何獲取ubuntu源碼包里面的源碼進行編譯 1、在獲取源碼包之前,確保在軟件源配置文件 /etc/apt/sources.list中添加了deb-src項 2、使用如下命令獲取xxx源碼包的詳細信息: sudo apt-cache showsrc xxx 這用來查詢當前鏡像站點中是否有該源碼包。 3、源碼包中通常…

python 示例_帶有示例的Python字典popitem()方法

python 示例字典popitem()方法 (Dictionary popitem() Method) popitem() method is used to remove random/last inserted item from the dictionary. popitem()方法用于從字典中刪除隨機/最后插入的項目。 Before the Python version 3.7, it removes random item and from …

優化算法的意義,之二。

前一篇分析了求質數的兩個算法,在代碼執行效率和系統開銷兩方面進行了比較。 這在通信系統的設計和實現中,是非常重要的兩點。因為需要同時面對的是巨大的用戶群,和復雜的業務應用,通信系統的設計經常要面臨魚與熊掌間的選擇。 用…

srs配置文件分析

配置文件中的每一項都是一個SrsConfDirective對象。 例子:vhost 1、 整個vhost 是一個SrsConfDirective對象。 1.1、名字:std::string name vhost 1.2、參數:std::vectorstd::string args第0個值 defaultVhost 1.3、子SrsConfDirective&a…

寄存器(CPU工作原理)03 - 零基礎入門學習匯編語言08

第二章:寄存器(CPU工作原理)03 讓編程改變世界 Change the world by program 物理地址 CPU訪問內存單元時要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間。 我們將這個唯一的地址稱為物理地址。 16位結構的CPU…

判別Linux是CentOs還是Ubuntu的最簡單方法

在終端執行以下兩條命令即可 CentOs:yum -help Ubuntu:apt-get -help

threadgroup_Java ThreadGroup toString()方法與示例

threadgroupThreadGroup類的toString()方法 (ThreadGroup Class toString() method) toString() method is available in java.lang package. toString()方法在java.lang包中可用。 toString() method is used to returns string denotation of this thread group (i.e. this m…