熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

.NET2005提供的Code Snippets看代碼復用

2013-11-23 19:20:17  來源: Java核心技術 

  首先說明這裡的代碼復用指的是狹義的源代碼的復用而不是廣義的黑盒復用和白合復用所指的代碼復用所以文中所說的代碼復用都默認都是指前者所指的源代碼的復用
  
  我們知道在程序設計中復用代碼並不是一件容易的事情其實每段代碼的編寫都是通過一定的思考的當然考慮的程度與其解決的問題的難度有關我們很忌諱在一個工程中重復使用相同的源代碼如果出現這樣的情況很多時候就是程序結構設計本身的不合理了可是對於一個developer或一個product team源代碼的邏輯(主要是執行邏輯而不是業務邏輯)在不同項目或同一項目不同版本中很可能需要復用而這種復用很多時候又是很難抽象成廣義的代碼復用的於是我們不得不ctrl+c & ctrl+v這是一個好辦法也確實能為我們節省很多的時間可是這樣同時也會帶來很多的問題如果被復用的代碼是近期所寫的我們一般對其很熟悉ctrl+v時心理也很有底可是對於編寫了很久的代碼我們在ctrl+v就不得不考慮一下代碼是不時完全合適被復用了更多的時候我們還需要對復用代碼做一些小的修改最簡單的修改莫過於把變量名改來適合當前代碼的上下文
  
  如果有這樣復用過代碼的人可能會有一種感覺我總是不知道哪個源碼文件裡的代碼snippet是我覺得解決這個邏輯最好的@_@因為每次ctrl+v後或多或少又會把代碼做一些小的改動或是修補不足或是增加功能特別是修補了不足後如果能保留下來以做再次復用就好了可是很多時候這些越來越優秀的代碼snippet卻仍然分布在某個項目的某個文件中於是我們發現有些小工具可以用來幫助我們保存代碼snippet比如前些天有人開發的類似CodeLib什麼的
  
  今天在用VSNET 的時候發現tools菜單裡有一個Code Snippets Manager(或者用Ctrl+kCtrl+b呼出)打開看了一下第一感覺就是一個代碼模版管理嘛看看了些預置的snippet居然都是些很簡單的類似if語句結構for語句結構do語句結構while語句結構等覺得真是沒有意思難道微軟要我們用鼠標來編程嗎?繼續往後翻發現了幾個比較復雜的snippets有的有一屏那麼多的代碼其實代碼多少不是snippet的重要的問題了而是這些snippet在插入IDE後可以根據其在文件裡的命令定義產生如下圖所示的自動添補提示功能
  

  在圖中黃底黑字區域內編輯完後按Tab其下面的虛線框裡的內容會同步的更新這樣的功能為我們收集並復用源代碼提供了很便利的支持這個snippet是以xml格式保存的只是whidbey beta裡面還沒沒有提供snippet文件的可視化編輯器不過xml本身在VSNET裡也不難寫上圖示例的代碼文件如下
  
  <CodeSnippet Format=>
  <Header>
    <Title>named iterator / indexer pair</Title>
    <Shortcut>iterindex</Shortcut>
    <Description>Implement a named iterator / indexer pair using a nested class</Description>
    <SnippetTypes>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>type</ID>
        <Default>ElementType</Default>
        <ToolTip>Type to return from iterator / indexer</ToolTip>
      </Literal>
      <Literal>
        <ID>name</ID>
        <Default>MyView</Default>
        <ToolTip>Name of the iterator/indexer pair</ToolTip>
      </Literal>
      <Literal Editable=false>
        <ID>outer</ID>
        <Default>MyOuterClass</Default>
        <Function>ClassName()</Function>
      </Literal>
      <Literal Editable=false>
        <ID>SystemCollectionsGenericIEnumeratorG</ID>
        <! Function>ShortName(SystemIEnumerator)</Function >
        <Default>SystemCollectionsGenericIEnumerator</Default>
      </Literal>
      <Literal Editable=false>
        <ID>SystemNotImplementedException</ID>
        <! Function>ShortName(SystemNotImplementedException)</Function >
        <Default>SystemNotImplementedException</Default>
      </Literal>
    </Declarations>
    <Code Language=csharp Format=CData><![CDATA[public $name$Impl $name$
    {
      get
      {
        return new $name$Impl(this);
      }
    }
  
    public class $name$Impl
    {
      readonly $outer$ _outer;
  
      internal $name$Impl($outer$ mc)
      {
        this_outer = mc;
      }
  
      // A Length property isnt required but its often useful
      public int Length { get { return ; } }
  
      public $type$ this[int index]
      {
        get
        {
          //
          // TODO: implement indexer here
          //
          // you have full access to $outer$ privates
          //
          $end$throw new SystemNotImplementedException();
          return default($type$);
        }
      }
  
      public $SystemCollectionsGenericIEnumeratorG$<$type$> GetEnumerator()
      {
        // TODO: provide an appropriate implementation here
        for (int i = ; i < thisLength; i++)
        {
          yield return this[i];
        }
      }
    }]]>
  </Code>
  </Snippet>
  </CodeSnippet>
  有了這個snippet的管理支持和方便的使用方法後基本就解決了我前面提到源代碼復用裡面版本控制和變量名修改的問題
  
  其實這個snippet的使用還有一個積極的意義我們知道編寫相同的邏輯過程是枯燥的我們都喜歡編寫新的邏輯過程即使新的邏輯更難更復雜反而更有挑戰但是我們又不能避開很多程序邏輯的復用在我們以一種類似厭惡的情緒重復著那些程序邏輯時保證代碼的正確性真是一場噩夢
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26684.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.