【问题标题】:Best practice when validating class properties in VBA?在 VBA 中验证类属性时的最佳实践?
【发布时间】:2015-01-06 23:07:48
【问题描述】:

我没有太多的课程,所以我认为这是一个初学者的问题。

我有一个具有以下属性的类:

Private pAvtalsslut As Date

''''''''''''''''''''''
' Avtalsslut property
''''''''''''''''''''''
Public Property Get Avtalsslut() As Date
    Avtalsslut = pAvtalsslut
End Property
Public Property Let Avtalsslut(Value As Date)
    pAvtalsslut = Value
End Property

当我为这个类的对象设置属性值时,我在我的 subs 中使用以下验证:

    If IsDate(exportWks.Cells(r, lColumnAvtalsslut)) Then
        avtal.Avtalsslut = exportWks.Cells(r, lColumnAvtalsslut)
    End If

我这样做是因为否则当我读取的单元格为空时会出错。

当我从这个类的对象中获取属性值时,我会在我的 subs 中使用以下验证:

    If avtal.Avtalsslut <> 0 Then
        wUnderlag.Cells(row, 3) = avtal.Avtalsslut
    End If

我这样做是因为我不想在没有日期的地方写零。在这种情况下,我想将单元格留空。

现在我的问题。这些类型的验证有哪些最佳实践?我应该让他们在我的课堂上还是在我的潜艇上?如果他们应该在我的班上,那应该怎么看?

(PS.验证是这类检查的正确词汇吗?)

【问题讨论】:

  • 一般来说,拥有类属性(getter 和 setter)的目的是对传入和传出数据进行数据验证。因此,任何数据验证大部分时间都应该在实际分配/返回值之前在属性主体内进行。您的实际问题是什么,因为最佳实践过于广泛 - 一切都取决于您面临的情况。
  • 除了从电子表格读取/写入之外,您是否打算将此类用于其他任何事情?答案实际上取决于了解预期用途。
  • @RubberDuck:我只想从一个文件中读取并写入另一个文件。当日期什么都不是时,我希望班级忽略阅读和写作。

标签: vba excel


【解决方案1】:

一般来说,最好让类在获取或设置属性之前验证数据,如果数据不符合规范则引发错误。这样,您就不必在任何时候使用您的类时在整个代码库中重复该验证代码。

但是,在这种情况下,您试图避免类型不匹配错误。因此,您需要将属性类型更改为Variant 而不是Date,然后您会惊讶和迷惑任何使用您的课程并期望提供/接收日期的人。这违反了最小意外原则,并且如果您需要将其用于任何读取/写入电子表格的内容,则该类将毫无用处。

所以,两者都不是。让我们选择选项 C。

创建第二个类(例如,MyClassReaderWriter),它的作用是充当现有类和电子表格之间的中介。这允许做两件事。

  1. 您不必对现有类进行任何更改,它在其他情况下仍然有用。
  2. 它通过将逻辑放在一个特定的位置来使您的代码枯竭。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多