我正在努力重构一个相当大的项目,我有兴趣搜索并减少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才真正不同。然而,这可能有点棘手,因为有时参数(类型和数量)不同。
有什么想法吗?
答案 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。
您应该查看与抽象语法树匹配的克隆检测器。它们不会产生这种误报,并且可以找到具有复杂参数的克隆(与单标记参数相反)。
你也应该明白,仅仅因为某些东西已被确定为克隆,所以重构它并不总是容易或可能的。你所拥有的语言可能没有足够强大的抽象机制来处理这种情况。