如何製作程式碼片段

前言

  有時候,如果分析一下曾經寫過的專案,或許會發現,因應某些功能所寫出來的程式碼,有很 多地方都非常相似,而如果能分析一下這些程式碼,把「變動」與「不變動」的地方整理出來,並製作成程式碼片段(Code Snippet),這樣在下次再使用時只要簡單幾個步驟就可以將常用的程式碼片段插入到程式編輯器中。

  接下來的文章會說明如何製作自己常用的程式碼片段,而範例會以上一篇文章「使用自訂程式碼片段」所使用的檔案來作說明。讀者若對程式碼片段尚無任何認知的話,請先參閱該篇文章。

分析程式碼片段

<Serializable()> _
Public Class ProductList
  Inherits NameValueListBase(Of Guid, String)

#Region " 工廠方法 "

  Private Shared mList As ProductList

  Public Shared Function GetList() As ProductList

    If mList Is Nothing Then
      mList = DataPortal.Fetch(Of ProductList)()
    End If
    Return mList

  End Function

  ''' <summary>
  ''' 清空在記憶體中的快取
  ''' 使其在下次有需求時會
  ''' 再次由資料庫中讀取。
  ''' </summary>
  Public Shared Sub InvalidateCache()

    mList = Nothing

  End Sub

  Private Sub New()
    ' 限制使用工廠方法,初始物件
  End Sub

#End Region

#Region " 資料存取 "

  Private Overloads Sub DataPortal_Fetch()
    Me.RaiseListChangedEvents = False
    Using ctx = ContextManager(Of DataAccess.ProductsDataContext).GetManager(Database.BeautySalonConnection)
      IsReadOnly = False
      Dim data = From p In ctx.DataContext.Products Select p.Id, p.Name
      For Each row In data
        Me.Add(New NameValuePair(row.Id, row.Name))
      Next
      IsReadOnly = True
    End Using
    Me.RaiseListChangedEvents = True
  End Sub

#End Region

End Class

   假設上述的程式碼是我們經常在使用,且經過分析只有反白部分的程式碼會因使用的場合有所變動,而其它的部分是不變的。因此我們即可將之製作為程式碼片段。程式碼片段可使用任何的文字編輯器(例:記事本)來編輯製作,並將之儲存成副檔名為:.snippet的檔案。

  接下來會以實際製作出來的程式碼片段,並配合上述的程式碼講解,聰明的讀者應該可舉一反三,製作出自己所要的程式碼片段。

<?xml version="1.0"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>插入NameValueList樣版</Title>
      <Author>啟源資訊日文工作室 王啟源</Author>
      <Description>插入NameValueList樣版</Description>
      <Shortcut>cslacrit</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
         <Literal>
          <ID>KeyType</ID>
          <ToolTip>置換為「值成員」型別</ToolTip>
          <Default>Guid</Default>
        </Literal>
        <Literal>
          <ID>ValueType</ID>
          <ToolTip>置換為「顯示成員」型別</ToolTip>
          <Default>String</Default>
        </Literal>       
        <Literal>
          <ID>ClassName</ID>
          <Type>String</Type>
          <ToolTip>置換為類別名稱</ToolTip>
          <Default>ObjectList</Default>
        </Literal>
        <Literal>
          <ID>DataContexName</ID>
          <Type>String</Type>
          <ToolTip>置換為LINQ DataContex類別名稱</ToolTip>
          <Default>DataAccess.ProductsDataContext</Default>
        </Literal>
        <Literal>
          <ID>ConnectionString</ID>
          <Type>String</Type>
          <ToolTip>置換為資料庫連線字串</ToolTip>
          <Default>Database.Connection</Default>
        </Literal>       
        <Literal>
          <ID>KeyFieldName</ID>
          <Type>String</Type>
          <ToolTip>置換為「值成員」之資料庫欄位名稱</ToolTip>
          <Default>Id</Default>
        </Literal>
        <Literal>
          <ID>ValueFieldName</ID>
          <Type>String</Type>
          <ToolTip>置換為「顯示成員」之資料庫欄位名稱</ToolTip>
          <Default>Name</Default>
        </Literal>       
      </Declarations>
      <Code Language="VB" Kind="type decl">
        <![CDATA[Inherits NameValueListBase(Of $KeyType$, $ValueType$)

#Region " 工廠方法 "

  Private Shared mList As $ClassName$

  Public Shared Function GetList() As $ClassName$

    If mList Is Nothing Then
      mList = DataPortal.Fetch(Of $ClassName$)()
    End If
    Return mList

  End Function

  ''' <summary>
  ''' 清空在記憶體中的快取
  ''' 使其在下次有需求時會
  ''' 再次由資料庫中讀取。
  ''' </summary>
  Public Shared Sub InvalidateCache()

    mList = Nothing

  End Sub

  Private Sub New()
    ' 限制使用工廠方法,初始物件
  End Sub

#End Region

#Region " 資料存取 "

  Private Overloads Sub DataPortal_Fetch()
    Me.RaiseListChangedEvents = False
    Using ctx = ContextManager(Of $DataContexName$).GetManager($ConnectionString$)
      IsReadOnly = False
      Dim data = From p In ctx.DataContext.Products Select p.$KeyFieldName$, p.$ValueFieldName$
      For Each row In data
        Me.Add(New NameValuePair(row.$KeyFieldName$, row.$ValueFieldName$))
      Next
      IsReadOnly = True
    End Using
    Me.RaiseListChangedEvents = True
  End Sub

#End Region
]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

  首先,<Title>插入NameValueList樣版</Title>是該程式碼片段的抬頭,可讓我們在程式編輯器中,方便我們分辨及找到所要使用的程在碼片段。接下來是一般既定的格式,重要的是:

       <Literal>
          <ID>ClassName</ID>
          <Type>String</Type>
          <ToolTip>置換為類別名稱</ToolTip>
          <Default>ObjectList</Default>
        </Literal>

  各個由<Literal>與</Literal>所包圍的區段,代表分析後在程式碼中會「變動」的部分,而<ID>與</ID>包圍的是,將來在程式編輯器中,使用者所輸入的文字將要取代位置的視別名稱,例:$ClassName$,而<ToolTip>與</ToolTip>包圍的是,將來在程式編輯器中給使用者的提示,<Default>與</Default>包圍的是內訂文字。

<![CDATA[..........]]>之間所包圍的就是將來要插入到程式碼編輯器中的程式碼片段,「不變動」的部分只要直接將所要的程式碼鍵入,而「變動」的部分,就對照之前的解說改成用$與$包圍住的視別子名稱。

  編輯完後即可給個檔名並儲存成副檔名為.snippet的檔案,而如何匯入IDE工具,及使用方法請參閱之前的文章「使用自訂程式碼片段」。

結語

  本篇文章,說明如何將自己常用的程式碼分析,並製成程式碼片段的方法,讀者可留意一下自己程式寫作習慣,並整理自己的程式碼片段,將能使自己程式設計工作更加輕鬆愉快。


posted on 2008/4/21 20:50 | 我要推薦 | 閱讀數 : 559 | 文章分類 [ 其他 ] 訂閱

Comments on this entry:

目前沒有回應.

回應:

標題:
姓名:
電子郵件: (將不會被顯示)
個人網頁:
 
 
Please add 6 and 8 and type the answer here: