You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA中不使用Getters和Setters的实现正确性确认问询

关于VBA中避免传统Getters/Setters的实现确认

我完全理解你认同Yegor这个理念的点——与其把对象内部状态赤裸裸地暴露给外部随意修改,不如让对象自己掌控状态变化的逻辑,对吧?咱们直接来确认你对这个概念的理解和VBA实现方向是否正确:

传统VBA属性写法(你提到的标准示例)

先把你说的典型Getter/Setter写法放出来做对比:

Private userName As String

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

Public Property Let Name(newName As String)
    userName = newName
End Property

这种写法就是典型的被动暴露内部状态,外部代码可以直接通过obj.Name = "NewName"修改属性,对象本身没法对这个修改做任何校验、日志或关联逻辑处理。

符合Yegor理念的VBA实现思路

按照“不要用Getters/Setters”的核心——让对象行为驱动状态变化,而非直接暴露状态,VBA里可以这么落地:

  • 去掉单纯的Property Get/Let,转而提供带有业务意义的方法
  • 对象内部自行维护状态,外部只能通过调用方法触发状态变更,同时对象可以在方法内处理校验、日志、关联操作等逻辑

举个实际的用户对象例子:

Private userName As String

' 不是直接暴露Name的Setter,而是提供"修改用户名"的业务方法
Public Sub UpdateUserName(newName As String)
    ' 这里可以加校验逻辑,比如限制用户名长度
    If Len(newName) < 3 Then
        Err.Raise vbObjectError + 1001, , "用户名长度不能少于3个字符"
    End If
    ' 还可以添加日志或其他关联操作
    Debug.Print "用户名从【" & userName & "】修改为【" & newName & "】"
    userName = newName
End Sub

' 如果需要获取用户名,也不是单纯的Getter,而是提供带业务逻辑的获取方法
Public Function GetFormattedUserName() As String
    ' 比如给用户名统一加前缀
    GetFormattedUserName = "用户:" & userName
End Function

这样一来,外部代码无法直接修改userName,必须通过UpdateUserName方法操作,对象完全掌控了状态变更的全过程,这就精准贴合了Yegor的理念。

理解确认总结

你对这个概念的核心理解应该是:不要把对象的内部状态当成“公共变量”暴露,而是让对象通过行为方法自主管理状态——这个理解完全正确。在VBA里的实现就是用业务方法替代单纯的Getters/Setters,把状态变更的控制权收回到对象内部。

内容的提问来源于stack exchange,提问作者Alfa Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:25:30