Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          新的項目要求使用C#,對于習慣了Java開發模式和環境的朋友來說,一開始總會有些不適應。

          拿我自己的體驗來說,VS2005跟Eclipse SDK相比,當然畫GUI和調試的直觀性方面給我留下的印象很深,不過也有些我認為缺少了的東西:增量編譯(很多時候只有F6以后,編譯錯誤提示才會消失,有些引用和IntelliSense才生效,不像Eclipse,保存后自動增量編譯)、代碼排版(很懷念Ctrl-Shift-F)、引用整理(很懷念Ctrl-Shift-O)、很多有用的重構(可以說VS里面代碼級的重構相比很多Java IDE差遠了)、單元測試的集成(NUnit理論上應該可以很好的集成到VS2005,不過還是花了我一些功夫)、CVS客戶端(很懷念Eclipse SDK)。當然,一些IDE當中相對小的差異一開始也很難適應,不過這些也可以理解,屬于正常范疇。

          最近為了把項目的一些基調和開發模式定下來,做了一些嘗試,我想也許對大家還有些用,整理一下放在這里。

          一個好的.NET項目,我相信有些東西事先定義好,對項目整個過程是有很大好處的,這些東西至少應該包括:開發工具選擇和配置、代碼模板、單元測試、代碼自動化review工具、自動編譯和測試、缺陷跟蹤、文檔管理等。當然如果不計成本,那么有很多重量級的SDLC框架可以用,如VSTS(MSF)、Rational(RUP)和Borland的集成工具,以上這些環節的問題相應的框架也大都給出了很好的解決方案,但是畢竟不是所有的項目都會購買和采用那么"重"的方法和過程,很多時候就算有那個預算,對于特定的項目,實施起來也不見得就會收到好的效果。于是我們接觸到的很多項目,其實都還是需要自己去尋找適合的工具來把整個周期串起來。以下是我在嘗試找到一套合適方案時遇到的一些特定問題以及解決辦法:

          首先是單元測試工具以及和IDE的集成。在Eclipse SDK中,我們不必太過關心這個問題,因為Eclipse已經很好的集成了JUnit。但是在.NET的世界,人們是怎么做的呢?答案是NUnit,一個跟JUnit非常類似的東西。和JUnit一樣,NUnit也提供了命令行版本和GUI版本,但是VS里面并沒有直接提供集成,你更多的時候需要從外部運行NUnit,當然這樣很不爽啦。VS號稱是自己也提供了單元測試工具,但是那僅僅在高端VSTS中才有。如何解決這個集成的問題呢?可以到http://www.testdriven.net/ 上下載一個TestDriven.NET的VS add-in。安裝以后,就可以在VS中調用我們可能經常需要調用的NUnit來跑自己的單元測試了。

          其次是代碼模板。一個項目,不管大小,總會涉及到相當數量的源代碼文件,我們希望這些源代碼都包括一些共有的東西和特定的注釋,怎么辦?在Eclipse里面有code template的概念,那么在VS里呢?答案是Project Template和Item Template。一開始我根本摸不著頭腦,只看到MSDN上正在說Code Snippet,于是我實現的1.0版代碼模板就是基于Code Snippet的,用起來很不方便,有關Code Snippet,我等下還會提到,這里先看Templates。我Google了一下相關的Project Template和Item Template的說明,基本都是VS 2003的,不過它們給了我很好的提示,至少可以知道VS在生成默認的代碼時是怎樣一個思路。所有的VS 2005代碼模板都可以在%VS_2005_INSTALL_PATH%\Common7\IDE\ProjectTemplates和%VS_2005_INSTALL_PATH%\Common7\IDE\ItemTemplates目錄下面找到,Project Template和Item Template不同的是Project Templates是在你新建一個項目時使用的模板,而Item Templates是在你往一個現有項目中添加item,如Form、Class等的時候使用。這里需要注意兩點:一是VS 2005跟VS 2003不同,templates不再是直接的.cs文件等,而是打包在了.zip中,需要修改的話,需要把新的文件重新壓到.zip中;二是除了template目錄,還有一個TemplateCache目錄,為了立即看到模板的效果,這里面的相應.cs文件等也需要修改。模板改起來相當直接,一看便知,比如新建Form的模板:

          using?System;
          using?System.Collections.Generic;
          using?System.ComponentModel;
          using?System.Data;
          using?System.Drawing;
          using?System.Text;
          using?System.Windows.Forms;

          namespace?$rootnamespace$
          {
          ????
          public?partial?class?$safeitemrootname$:?Form
          ????
          {
          ????????
          public?$safeitemrootname$()
          ????????
          {
          ????????????InitializeComponent();
          ????????}

          ????}

          }


          接下來說說Code Snippet,這個東東被MSDN吹得有點大,不過用起來實在有些不順手,你雖然可以定義一大塊代碼片斷,然后填一些參數,就能得到一個定制的代碼段,但是畢竟你還是需要自己寫很多東西,然后使用的話需要在代碼編輯器里面點很多下才出來,又沒有很好的快捷方式。不客氣地說我覺得用Code Snippet來模擬Eclipse的很多現成的重構功能實在不能夠體現出優勢。退一萬步講,有總比沒有強,至少你還是可以做一些東西的。使用現成的Code Snippet很簡單,只要把VS指向你存放Code Snippets的目錄即可,新的Code Snippets會被自動掃描到。方法是:Tools -> Code Snippets Manager或者Ctrl-K Ctrl-B然后添加目錄名。所有的Code Snippets文件都以.snippet后綴結尾,其實內部是個XML,像這個樣子:

          <?xml?version="1.0"?encoding="utf-8"??>
          <CodeSnippets?xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
          ??
          <CodeSnippet?Format="1.0.0">
          ????
          <Header>
          ??????
          <Title>Insert?a?simple?set?of?getter?and?setter?pair</Title>
          ??????
          <Author>Sean?GAO</Author>
          ??????
          <Description></Description>
          ??????
          <Shortcut>simplisticGetterSetter</Shortcut>
          ??????
          <SnippetTypes>
          ????????
          <SnippetType>Expansion</SnippetType>
          ??????
          </SnippetTypes>
          ????
          </Header>
          ????
          <Snippet>
          ??????
          <Declarations>
          ????????
          <Literal>
          ??????????
          <ID>AccessLevel</ID>
          ??????????
          <ToolTip></ToolTip>
          ??????????
          <Default>public</Default>
          ????????
          </Literal>
          ????????
          <Literal>
          ??????????
          <ID>PropertyType</ID>
          ??????????
          <ToolTip></ToolTip>
          ??????????
          <Default>string</Default>
          ????????
          </Literal>
          ????????
          <Literal>
          ??????????
          <ID>PropertyName</ID>
          ??????????
          <ToolTip></ToolTip>
          ??????????
          <Default>name</Default>
          ????????
          </Literal>
          ????????
          <Literal>
          ??????????
          <ID>LocalVarName</ID>
          ??????????
          <ToolTip></ToolTip>
          ??????????
          <Default>localVar</Default>
          ????????
          </Literal>
          ??????
          </Declarations>
          ??????
          <Code?Language="csharp">
          <![CDATA[????????$AccessLevel$?$PropertyType$?$PropertyName$
          ????????{
          ????????????get?{?return?$LocalVarName$;?}
          ????????????set?{?$LocalVarName$?=?value;?}
          ????????}
          ]]>
          ??????
          </Code>
          ????
          </Snippet>
          ??
          </CodeSnippet>
          </CodeSnippets>

          我們可以看到,首先在.snippet中我定義了一些變量,然后在<Code/>段加入了<![CDATA[...]]>,就這么簡單。

          最后,還剩一些具體的工具,選擇面比較廣,我只列舉一下我都選了哪些:
          - 代碼review和分析工具:FxCop,可以在GotDotNet網站上下載:http://www.gotdotnet.com/team/fxcop/?。
          - 自動編譯管理:NANT和CruiseControl.NET:http://nant.sourceforge.net/?和 http://ccnet.thoughtworks.com/?。
          - 缺陷跟蹤:mantis:http://www.mantisbt.org/?。
          - 文檔管理: jLibrary:http://jlibrary.sourceforge.net/?。
          - 版本控制:CVSNT和Eclipse SDK:http://www.cvsnt.org/?和 http://eclipse.org/

          暫時就是這么多,如果你和我一樣從Java轉向.NET,然后正在犯愁如何做一個.NET項目的前期準備,希望能給你一些參考。

          Feedback

          # re: [VS2005起步]一些實用的工具和配置指南  回復  更多評論   

          2006-04-01 17:33 by 大胃
          補充一點:
          http://blogs.msdn.com/csharpfaq/archive/2004/10/20/245411.aspx

          多余的/未被使用的using語句在C#源碼編譯的時候會被忽略,所以在C#中其實不用太在意冗余的using會到來性能影響,但是有好的習慣總是不錯的。
          主站蜘蛛池模板: 封开县| 含山县| 迁西县| 噶尔县| 准格尔旗| 五寨县| 舟曲县| 邵武市| 延边| 德清县| 都安| 仲巴县| 时尚| 山阴县| 河南省| 潮安县| 华蓥市| 仁寿县| 灵宝市| 黄石市| 井冈山市| 孙吴县| 宁夏| 杭锦旗| 临清市| 衡山县| 常熟市| 当雄县| 华坪县| 贵溪市| 剑河县| 厦门市| 韩城市| 大丰市| 新安县| 潞西市| 玛沁县| 阿拉善左旗| 棋牌| 高碑店市| 栾川县|