请看下面的示例1:
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应该跨函数共享?因此,应该使用实例变量。
答案 0 :(得分:4)
这两个样本并不意味着相同。
如果在程序的整个生命周期中多次调用Run(),会发生什么不同。示例2中的Run()方法永远不会重置TestVariable,因此它将继续变得越来越大。在示例1中,结果将始终为6,因为TestVariable是每次调用函数的新变量。哪个更正确取决于完全你想要做什么。
还有第三个选项
在其他条件相同的情况下,我也建议从这两个选项中采用样本1方法。但是,实例vs局部变量不是区别。样本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