2013-01-02 49 views
3

我正在重構一個非常大的項目,我有興趣搜索和減少代碼克隆以獲得更好的標準化以及易於開發。VB.NET「修復」代碼克隆

我有一段代碼片斷,它繼續出現在「精確匹配」中(使用Visual Studio 2012的 「查找代碼克隆」功能)。

這就是:

   End If 
      End Using 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End Using 
End Using 
Return Nothing 

基本上,我有類似的函數(在實際的功能在結構上類似,但並不)所有打開的像這樣的東西一大堆:

Const sql As String = ... 
Using cn As SqlConnection... 
    Using cmd As SqlCommand(sql,cn) 
     ... Maybe add some SqlParameters 
     cn.Open() 
     ... Something with cmd.Execute... 

現在,我認識到,第一個代碼塊是IDENTICAL跨越很多很多方法,但我無法找出一種方法來拉出代碼,寫一次,並簡單地調用它,每次我需要這個功能。在我看來,有太多的控制流量發生。因此,我很難理解如何解決這個問題(我只是假設我可以「解決」這個問題,因爲微軟已經將它確定爲「克隆代碼」)。

我正在考慮做一些東西沿着做一些功能,如類型的東西(如從表中返回一個計數,返回一個頂級值,等等),只有真正因執行的SQL而有所不同。不過,這可能有點棘手,因爲有時參數(類型和數量)不同。

有什麼想法?

回答

2

我不會與那些關心自己。你的常識第一印象是正確的。從技術上說,語法重複多次,但它不是邏輯或任何算法的重複。這並不是說沒有辦法減少這種重複,只是通過這樣做,你的代碼中可能會有更糟的設計。

例如,你可以創建一個完成所有的設置和拆除,然後只需調用中實際使用的連接做的工作中間的方法,比如一個方法:

Public Function PerformDbTask(task As IMyDbTask) 
    Using cn As SqlConnection... 
     Using cmd As SqlCommand = cn.CreateCommand() 
      Try 
       cn.Open() 
       task.Perform(cmd) 
      Catch ex As Exception 
       MsgBox(ex.Message) 
      End Try 
     End Using 
    End Using 
    Return Nothing 
End Function 

但是,你真的獲得了什麼?可能並不多,但你失去了很多靈活性。所以,除非是這種設計是爲了什麼你正在嘗試做的實際需要,我不會浪費時間去解決不存在的問題。

+0

再次,你的知識和智慧是無價的!謝謝! – mbm29414

1

您可以創建一個實現生成器模式的一類,蜿蜒看起來像

Dim list = 
    SqlBuilder.Query("SELECT ...") 
       .WithConnection("...connection string...") 
       .WithParameter(userName) 
       .WithParameter(lastTrackId) 
       .RetrieveTopRows(10) 
0

您的問題是使用的是一個匹配的令牌的序列的克隆檢測器(因此你表現出的端塊的序列相匹配),而不是克隆匹配代碼結構,檢測器。雖然令牌序列在技術上是一個克隆,但它不是一個有趣的克隆。令牌克隆檢測器會產生許多像這樣的「誤報」克隆,這隻會浪費您的時間。

這是比較容易建立令牌序列檢測,這就是爲什麼他們建成爲MS工作室。 如果你想要更好的探測器,你必須走出Studio。

您應該查看與抽象語法樹匹配的克隆檢測器。他們不會產生這種誤報,他們可以找到具有複雜參數的克隆(與單令牌參數相反)。

你也應該明白,只是因爲某些東西被認爲是一個克隆,它並不總是很容易或不可能重構它。您擁有的語言可能沒有足夠強的抽象機制來處理這種情況。