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

4

2 回答 2

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 这样的工具在这类事情上非常有帮助。

于 2013-06-26T01:42:24.347 回答
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
于 2013-06-26T01:56:43.127 回答