gpt4 book ai didi

vba - 我了解不正确使用getter和setter的方法吗?

转载 作者:行者123 更新时间:2023-12-04 16:28:17 25 4
gpt4 key购买 nike

阅读Yegor关于不使用getter和setter的this文章后,听起来对我来说很有意义。

请注意,仅当我正确实施此问题时,此问题才是关于它是否更好/最坏的问题

我想在VBA中的以下两个示例中了解我是否正确理解了这个概念,以及我是否正确地应用了它。

标准方法是:

Private userName As String

Public Property Get Name() As String
Name = userName
End Property
Public Property Let Name(rData As String)
userName = rData
End Property


在我看来,他的方式将是这样的:

Private userName As String

Public Function returnName() As String
returnName = userName
End Function

Public Function giveNewName(newName As String) As String
userName = newName
End Function


从上面的两个示例中可以理解,如果我想更改userName的格式(可以说以全大写形式返回),则可以使用第二种方法来完成此操作,而无需更改给出该名称的方法的名称。通过命名-我可以只让returnName指向userNameCaps属性。我的程序中的其余代码仍然可以保持不变,并指向方法userName。

但是,如果我想在第一个示例中执行此操作,则可以创建一个新属性,但随后又必须在程序中的任何地方更改我的代码,以指向该新属性...对吗?

换句话说,在第一个示例中,API从属性获取信息,而在第二个示例中,API从方法获取信息。

最佳答案

您的第二个片段既不是惯用语言也不是等效语言。您链接到的文章是关于Java的,该语言对对象属性没有任何概念-getFoo / setFoo在Java中只是一个约定。

在VBA中:


Private userName As String

Public Property Get Name() As String
Name = userName
End Property
Public Property Let Name(rData As String)
userName = rData
End Property



最终等于这样:

Public UserName As String


不服气吗?将这样的公共字段添加到类模块中,例如 Class1。然后添加一个新的类模块并添加以下内容:

Implements Class1


编译器将强制您实现 Property GetProperty Let成员,以便可以实现 Class1接口协定。

那么,为什么还要麻烦属性呢?属性是一种有助于封装的工具。

Option Explicit
Private Type TSomething
Foo As Long
End Type
Private this As TSomething

Public Property Get Foo() As Long
Foo = this.Foo
End Property

Public Property Let Foo(ByVal value As Long)
If value <= 0 Then Err.Raise 5
this.Foo = value
End Property


现在,如果您尝试为 Foo分配一个负值,则会遇到运行时错误:该属性封装了仅该类知道并能够突变的内部状态:调用代码看不到或不知道封装的值-它所知道的只是 Foo是一个读/写属性。 “设置者”中的验证逻辑可确保对象始终处于一致状态。

如果要将属性分解为方法,则需要使用 Function进行获取,并且分配将是 Sub而不是 Function。实际上, Rubberduck会告诉您,从未分配 giveNewName的返回值存在一个问题:这比“正在使用属性的OMG!”的代码味道差得多。

函数返回一个值。 Subs / method做某事-在对象/类的情况下,某事可能暗示内部状态发生了变化。

但是通过避免 Property Let只是因为某些Java家伙说getter和setter是邪恶的,您只是在使VBA API变得比所需的更加混乱-因为VBA理解属性,而Java却不了解。但是C#和VB.NET可以,因此,至少在属性方面,这些语言的原理比Java更适用于VBA。请参见 Property vs Method

按照惯例,VB中的FWIW公共成员名称为 PascalCasecamelCase公共成员名称是Java的东西。请注意,标准库中的所有内容如何以大写首字母开头?

关于vba - 我了解不正确使用getter和setter的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49812156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com