直接使用私有属性vs使用Get和Let / Set

时间:2014-02-27 19:55:13

标签: class vba oop properties private

这里的初级VBA程序员(以及一般的编程初学者)希望了解有关OOP的有效性的更多信息。

有人可以解释或提供讨论使用的好处/目的的参考 - 在VBA中对类模块的内部Private Property Get和/或Let / Set语句直接访问属性虽然数据不需要操作吗?

示例:

我创建了一个cDimension类(在Excel中)。此类将行绘制为Shape个对象,以及其他一些不相关的内容。 DrawingScale变量允许根据需要缩放整个图形。一些属性在获取/设置时需要操作,而其他属性则不需要。

因此,例如,pWidth需要缩小进入:

'clsDimension
Private pWidth As Single    
Private Property Get Width() As Single
    Width = pWidth
End Property
Private Property Let Width(w As Single)
    pWidth = w / DrawingScale
End Property

但是pColor不需要任何操作,进出:

Private pColor As Integer
Private Property Get Color() As Integer
    Color = pColor
End Property
Private Property Let Color(c As Integer)
    pColor = c
End Property

pWidth属性是一个实例,其中使用私有属性Get和Let方法来处理类本身内部的过程对我来说是有意义的。但是,我的问题是:是否有任何理由也使用私有属性方法来获取和设置pColor属性,正如我在上面给出的那样?

Public Function Line(sht As Worksheet, L As tLine, Optional c = vbBlack) As Shape
    Width = DistanceBetweenTwoPoints(L.first.x, L.first.y, _
                                     L.second.x, L.second.y) '<-- pWidth is scaled
    Color = c '<-- Vs. just using pColor = c
    Set Line = sht.Shapes.AddLine(L.first.x, L.first.y, L.second.x, L.second.y)
End Function

提前致谢。

3 个答案:

答案 0 :(得分:1)

我看到的价值是简化的代码,您没有在示例代码中利用它。您可以替换为:

'clsDimension
Private pWidth As Single    
Private Property Get Width() As Single
    Width = pWidth
End Property
Private Property Let Width(w As Single)
    pWidth = w / DrawingScale
End Property

与此:

'clsDimension
Private Property Get Width() As Single
    Width = w / DrawingScale
End Property

这消除了访问pWidth或width属性的潜在歧义,因为pWidth不再存在。它还可以消除在编写Width之前被读取的潜在陷阱,尽管明智的做法是在读取Width之前添加一些代码来检查w和DrawingScale是否已设置为有效值。

答案 1 :(得分:0)

如果你没有在进出途中操纵值,只需使用公共变量即可。 VBA更像是Python而不是Java或C ++,因为从公共变量切换到“getter / setter”函数没有真正的惩罚

假设您从以下代码开始:

'clsCar
Public Speed As Double
Public Sub Drive()
    MsgBox "Driving at " & Speed & " MPH"
End Sub    


'Module1
Sub DriveCar()
    Set Car = New clsCar
    Car.Speed = 100
    Car.Drive  'shows msg:  "Driving at 100 MPH"
End Sub

然后你决定快速驾驶是危险的,所以你想为你的车辆添加一个“调速器”并需要更新你的班级:

'clsCar
Private mSpeed As Double
Private Const SpeedLimit As Double = 55

Public Property Get Speed()
    Speed = mSpeed
End Property
Public Property Let Speed(Val As Double)
    If Val > SpeedLimit Then
        mSpeed = SpeedLimit
    ElseIf Val < 0 Then
        mSpeed = 0
    Else
        mSpeed = Val
    End If
End Property
Public Sub Drive()
    MsgBox "Driving at " & Speed & " MPH"
End Sub    


'Module1
'Note that no changes to this code are necessary; the change
'   is entirely encapsulated within the class (as it should be)
Sub DriveCar()
    Set Car = New clsCar
    Car.Speed = 100
    Car.Drive  'shows msg:  "Driving at 55 MPH"
End Sub
蒂姆·威廉姆斯的评论是你经常听到的在VBA中不必要地使用Get / Let / Set的理由,但这是其他语言(特别是C ++和Java)错误应用于VBA / VB6的好建议的副产品。 / p>

答案 2 :(得分:0)

一如既往....这取决于。绝对应该通过字母访问您的x属性,因为该字母对输入执行计算。

'clsDimension
Private Let Width(w As Single)
    pWidth = w / DrawingScale
End Property

您应该直接访问pWidth变量。如果您这样做,则必须在模块中的其他位置复制pWidth = w / DrawingScale逻辑。

您的pColor属性可能是一个公共变量,因为获取或设置它没有逻辑。我不推荐它。如果以后你意识到你不想允许某些颜色怎么办?然后你需要它背后的逻辑,你还是需要切换到一个属性。该属性更易于维护,语义更正确。