0

请看下面的sample1:

Public Class LocalVariable

    Public Sub Run()
        Dim TestVariable As Integer
        TestVariable = Method1(TestVariable)
        TestVariable = Method2(TestVariable)
        TestVariable = Method3(TestVariable)
    End Sub

    Private Function Method1(ByVal x As Integer) As Integer
        Return x + 1
    End Function

    Private Function Method2(ByVal x As Integer) As Integer
        Return x + 2
    End Function

    Private Function Method3(ByVal x As Integer) As Integer
        Return x + 3
    End Function

End Class

和下面的示例 2:

Public Class InstanceVariable

    Dim TestVariable As Integer

    Public Sub Run()
        Method1()
        Method2()
        Method3()
    End Sub

    Private Sub Method1()
        TestVariable = TestVariable + 1
    End Sub

    Private Sub Method2()
        TestVariable = TestVariable + 2
    End Sub

    Private Sub Method3()
        TestVariable = TestVariable + 3
    End Sub

End Class

每个程序运行后的结果显然是相同的,即TestVariable=6。我在网上和工作中找到的每个示例都使用示例 1。这肯定是对实例变量的滥用,因为 TestVariable 应该跨函数共享?因此应该使用实例变量。

4

1 回答 1

4

这两个样本的意思不一样。

不同之处在于如果在程序的生命周期内多次调用 Run() 会发生什么。示例 2 中的 Run() 方法从不重置 TestVariable,因此它会继续变得越来越大。在示例 1 中,结果将始终为 6,因为 TestVariable 是每次调用函数时的新变量。哪个更正确完全取决于您要做什么。

还有第三种选择

在其他条件相同的情况下,我还推荐这两个选项中的示例 1 方法。但是,实例与局部变量不是区别。样本 1 没有理由不能将实例变量与这些方法定义一起使用。所以我们的第三个选项看起来像这样:

Public Class InstanceVariableWithSampleOneFunctions

    Dim TestVariable As Integer

    Public Sub Run()
        TestVariable = Method1(TestVariable)
        TestVariable = Method2(TestVariable)
        TestVariable = Method3(TestVariable)
    End Sub

    Private Function Method1(ByVal x As Integer) As Integer
        Return x + 1
    End Function

    Private Function Method2(ByVal x As Integer) As Integer
        Return x + 2
    End Function

    Private Function Method3(ByVal x As Integer) As Integer
        Return x + 3
    End Function
End Class

这将示例 2 中的实例变量与示例 1 中的方法一起使用。我将其称为示例 3。

这更好地切入了您问题的核心,因为现在样本 3 与样本 2 具有相同的行为。您应该选择 1 还是 2 取决于您需要哪种行为。但是应该选择 2 还是 3 取决于编码风格的优劣。2 和 3 都依赖 Run() 方法中的实例变量,但 2 在附加方法中也使用实例变量,而 3 使用局部变量。

我可以说,在这一点上,比较 ​​2 和 3,我肯定更喜欢示例 3。示例 3 中的方法具有更多的功能风格:接受输入,返回输出。这为它们提供了更高级别的抽象,这使得重构示例 3 以执行诸如将这些方法移至其他地方之类的操作变得更容易......例如,到一个实用程序类,其中一组方法可以与示例 1 和 3 共享。因为您提到了线程,通常这种风格使正确地执行多线程变得更容易,而不是更难。

这种方法风格更好的一个具体例子是它是可组合的。这个属性允许我像这样重写示例 3 的 Run() 方法,并有信心获得相同的结果:

Public Sub Run()
    TestVariable = Method3(Method2(Method1(TestVariable)))
End Sub
于 2013-05-09T18:57:39.183 回答