使用“提取方法”重构。下面是一个简单的例子,假定的码两个块是微不足道的已:
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
MethodCall(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
MethodCall(lvi)
Next
End If
旋转“一大堆码”到接受lvi
作为参数的方法。可能需要额外的参数,但要确保lvi
就是其中之一。
Private Sub ExtractedMethod1(lvi As ListViewItem)
MethodCall(lvi)
End Sub
旋转“完全相同的一大堆代码”成需要lvi
作为参数的另一方法。同样,可能需要额外的参数。
Private Sub ExtractedMethod2(lvi As ListViewItem)
MethodCall(lvi)
End Sub
调用代码现在看起来是这样的:
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
ExtractedMethod1(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
ExtractedMethod2(lvi)
Next
End If
如果你关心代码是几乎相同的两个街区正确的,那么你就可以做出一系列的小改变,使他们实际上相同。这可能涉及重命名参数,更改参数顺序,添加参数等等。一旦它们完全相同,请将对第二个方法的引用更改为对第一个方法的引用,然后删除第二个方法。
您现在将拥有一个适用于If
语句的两个分支的单一方法。
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
ExtractedMethod1(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
ExtractedMethod1(lvi)
Next
End If
像ReSharper这样的工具对这类事情非常有帮助。