使用「提取方法」重構。下面是一個簡單的例子,假定的碼兩個塊是微不足道的已:
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這樣的工具對這類事情非常有幫助。