使用“提取方法”重构。这是一个简单的示例,假设这两个代码块已经是微不足道的:
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 这样的工具在这类事情上非常有帮助。