VB.NET“修复”代码克隆

时间:2013-01-02 16:30:10

标签: vb.net optimization refactoring clone

我正在努力重构一个相当大的项目,我有兴趣搜索并减少Code Clone以实现更好的标准化以及易于开发。

我有一个代码片段,不断出现在“精确匹配”中(使用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才真正不同。然而,这可能有点棘手,因为有时参数(类型和数量)不同。

有什么想法吗?

3 个答案:

答案 0 :(得分: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

然而,你真正获得了什么?可能不是很多,但你失去了很多灵活性。所以,除非你想要做的事情真的需要那种设计,否则我不会浪费时间去解决一个不存在的问题。

答案 1 :(得分:1)

您可以创建一个实现构建器模式的类,它看起来像

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

答案 2 :(得分:0)

您的问题是您正在使用与令牌序列匹配的克隆检测器(因此它与您展示的块结束序列匹配),而不是与代码结构匹配的克隆检测器。虽然令牌序列在技术上是克隆,但它不是一个有趣的克隆。令牌克隆检测器产生许多这样的“假阳性”克隆,这只会浪费你的时间。

构建令牌序列检测器更容易,这就是他们将其构建到MS Studio中的原因。 如果您想要更好的探测器,您必须走出Studio。

您应该查看与抽象语法树匹配的克隆检测器。它们不会产生这种误报,并且可以找到具有复杂参数的克隆(与单标记参数相反)。

你也应该明白,仅仅因为某些东西已被确定为克隆,所以重构它并不总是容易或可能的。你所拥有的语言可能没有足够强大的抽象机制来处理这种情况。