首先說明這裡的代碼復用指的是狹義的源代碼的復用
而不是廣義的黑盒復用和白合復用所指的代碼復用
所以文中所說的代碼復用都默認都是指前者所指的源代碼的復用
我們知道在程序設計中復用代碼並不是一件容易的事情
其實每段代碼的編寫
都是通過一定的思考的
當然考慮的程度與其解決的問題的難度有關
我們很忌諱在一個工程中重復使用相同的源代碼
如果出現這樣的情況很多時候就是程序結構設計本身的不合理了
可是對於一個developer或一個product team
源代碼的邏輯(主要是執行邏輯
而不是業務邏輯)在不同項目或同一項目不同版本中很可能需要復用
而這種復用很多時候又是很難抽象成廣義的代碼復用的
於是我們不得不ctrl+c & ctrl+v
這是一個好辦法
也確實能為我們節省很多的時間
可是這樣同時也會帶來很多的問題
如果被復用的代碼是近期所寫的
我們一般對其很熟悉
ctrl+v時心理也很有底
可是對於編寫了很久的代碼
我們在ctrl+v就不得不考慮一下代碼是不時完全合適被復用了
更多的時候我們還需要對復用代碼做一些小的修改
最簡單的修改莫過於把變量名改來適合當前代碼的上下文
如果有這樣復用過代碼的人可能會有一種感覺
我總是不知道哪個源碼文件裡的代碼snippet是我覺得解決這個邏輯最好的@_@
因為每次ctrl+v後或多或少又會把代碼做一些小的改動
或是修補不足或是增加功能
特別是修補了不足後如果能保留下來以做再次復用就好了
可是很多時候這些越來越優秀的代碼snippet卻仍然分布在某個項目的某個文件中
於是我們發現有些小工具可以用來幫助我們保存代碼snippet
比如前些天有人開發的類似CodeLib什麼的
今天在用VS
NET
的時候
發現tools菜單裡有一個Code Snippets Manager(或者用Ctrl+k
Ctrl+b呼出)
打開看了一下
第一感覺就是一個代碼模版管理嘛
看看了些預置的snippet
居然都是些很簡單的類似if語句結構
for語句結構
do語句結構
while語句結構等
覺得真是沒有意思
難道微軟要我們用鼠標來編程嗎?繼續往後翻
發現了幾個比較復雜的snippets
有的有一屏那麼多的代碼
其實代碼多少不是snippet的重要的問題了
而是這些snippet在插入IDE後
可以根據其在文件裡的命令定義
產生如下圖所示的自動添補提示功能
在圖中黃底黑字區域內編輯完後按Tab
其下面的虛線框裡的內容會同步的更新
這樣的功能為我們收集並復用源代碼提供了很便利的支持
這個snippet是以xml格式保存的
只是whidbey beta
裡面還沒沒有提供snippet文件的可視化編輯器
不過xml本身在VS
NET裡也不難寫
上圖示例的代碼文件如下
<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(System
IEnumerator)</Function
>
<Default>System
Collections
Generic
IEnumerator</Default>
</Literal>
<Literal Editable=
false
>
<ID>SystemNotImplementedException</ID>
<!
Function>ShortName(System
NotImplementedException)</Function
>
<Default>System
NotImplementedException</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 isn
t required
but it
s 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 System
NotImplementedException();
return default($type$);
}
}
public $SystemCollectionsGenericIEnumeratorG$<$type$> GetEnumerator()
{
// TODO: provide an appropriate implementation here
for (int i =
; i < this
Length; i++)
{
yield return this[i];
}
}
}]]>
</Code>
</Snippet>
</CodeSnippet>
有了這個snippet的管理支持和方便的使用方法後
基本就解決了我前面提到源代碼復用裡面版本控制和變量名修改的問題
其實這個snippet的使用還有一個積極的意義
我們知道編寫相同的邏輯過程是枯燥的
我們都喜歡編寫新的邏輯過程
即使新的邏輯更難更復雜
反而更有挑戰
但是我們又不能避開很多程序邏輯的復用
在我們以一種類似
厭惡
的情緒重復著那些程序邏輯時
保證代碼的正確性真是一場噩夢
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26684.html