使用不同的集合作为参考,没有不同的代码集

时间:2013-06-26 01:36:33

标签: .net vb.net listview reference

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执行相同的操作,如果我的用户使用Checkbox,我会使用Selected项目。如何在不丢失对这些项的引用的情况下创建集合变量,以便我仍然可以向它们写入属性?

2 个答案:

答案 0 :(得分: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. 如果您对两个代码块几乎完全相同是正确的,那么您将能够进行一系列小改动以使它们实际相同。这可能涉及重命名参数,更改参数顺序,添加参数等等。一旦它们相同,将第二种方法的引用更改为对第一种方法的引用,然后删除第二种方法。

    < / LI>

    现在,您将拥有一个适用于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这样的工具在这类事情上非常有用。

答案 1 :(得分: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