2013-06-26 14 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 
相关问题