2013-06-26 27 views
0
If ListView1.CheckBoxes = True Then 
    'using check boxes 
    For Each lvi As ListViewItem In ListView1.CheckedItems 
     'whole bunch of code 
    Next 
Else 
    'not using check boxes 
    For Each lvi As ListViewItem In ListView1.SelectedItems 
     'the exact same whole bunch of code 
    Next 
End If 

如何在兩個不同的集合之間進行選擇而不必重複我的代碼?在我的程序中,我對CheckedItems做了同樣的事情,如果我的用戶正在使用複選框,我會對選定的項目進行處理。如何在不丟失對這些項目的引用的情況下創建集合變量,以便我可以爲它們編寫屬性?使用不同的集合作爲參考而無需使用不同的代碼集

回答

1

使用「提取方法」重構。下面是一個簡單的例子,假定的碼兩個塊是微不足道的已:

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 
  1. 旋轉「一大堆碼」到接受lvi作爲參數的方法。可能需要額外的參數,但要確保lvi就是其中之一。

    Private Sub ExtractedMethod1(lvi As ListViewItem) 
        MethodCall(lvi) 
    End Sub 
    
  2. 旋轉「完全相同的一大堆代碼」成需要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 
    
  3. 如果你關心代碼是幾乎相同的兩個街區正確的,那麼你就可以做出一系列的小改變,使他們實際上相同。這可能涉及重命名參數,更改參數順序,添加參數等等。一旦它們完全相同,請將對第二個方法的引用更改爲對第一個方法的引用,然後刪除第二個方法。

您現在將擁有一個適用於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這樣的工具對這類事情非常有幫助。

0

你只需要把類似的代碼在一個函數

If ListView1.CheckBoxes = True Then 
    'using check boxes 
    For Each lvi As ListViewItem In ListView1.CheckedItems 
     SimilarCode(lvi) 
    Next 
Else 
    'not using check boxes 
    For Each lvi As ListViewItem In ListView1.SelectedItems 
     SimilarCode(lvi) 
    Next 
End If 

Sub SimilarCode(ByVal lvi As ListViewItem) 
    'whole bunch of code 
End Sub 
相關問題