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
相关产品推荐
相关产品推荐

