5

我在这个 StackOverFlow 问题上找到了这段代码,即 Dictionary of Objects/Classes in VBScript

我的问题是为什么这个“短”类和这个“长”类做同样的事情?为什么还要费心编写长班?短类版本可以与同一类中的其他方法一起使用吗?谢谢!

短班

Class employeeclass
    Public first, last, salary
End Class

长班

Class employeeclass
    Private m_first
    Private m_last
    Private m_salary

    Public Property Get first
        first = m_first
    End Property
    Public Property Let first(value)
        m_first = value
    End Property

    Public Property Get last
        last = m_last
    End Property
    Public Property Let last(value)
        m_last = value
    End Property

    Public Property Get salary
        salary = m_salary
    End Property
    Public Property Let salary(value)
        m_salary = value
    End Property
End Class

然而,短类的完整脚本,只需将短类替换为长类即可获得相同的结果。

Class employeeclass
    Public first, last, salary
End Class

Dim employeedict: Set employeedict = CreateObject("Scripting.Dictionary")

Dim employee: Set employee = new employeeclass
With employee
    .first = "John"
    .last = "Doe"
    .salary = 50000
End With
employeedict.Add "1", employee

Set employee = new employeeclass
With employee
    .first = "Mary"
    .last = "Jane"
    .salary = 50000
End With
employeedict.Add "3", employee

Dim employeedetails: Set employeedetails = employeedict.Item("1")
WScript.Echo "Name: " & employeedetails.first & " " & employeedetails.last & " $" & employeedetails.salary 
WScript.Echo employeedict.Item("3").first & " " & employeedict.Item("3").last & " makes $" & employeedict.Item("3").salary
4

3 回答 3

8

正如@Garath已经提到的, “short”和“long”类之间的区别在于,前者公开了存储实际值的成员变量,而后者将这些变量封装在属性中。

VBScript 中的属性基本上有两个优点,尽管它们需要更多代码:

  • 您可以将属性设置为只读(或只写),这对于成员变量是不可能的。
  • 您可以在将值存储到相应的成员变量之前对其进行验证。例如,如果您有一个ip_addr采用四点表示法的 IP 地址的属性,您可以检查它是否由 4 个用点分隔的数字组成,每个数字介于 0 和 255 之间,如果检查失败,则会引发错误。
于 2013-04-07T08:31:33.610 回答
7

所有编程范式(开发软件的不同方式)都力求以更少的努力构建更好的程序。然而,“更好”和“努力”的概念在数学术语中的定义不那么严格,它们的核心含义会随着时间而变化。

OOP 的基本思想是将复杂的数据(如处理员工所需的信息)与复杂的功能(如操作此类信息所需的操作)捆绑在一起。在 OOP 之前,您可以使用员工结构/记录/类型和漂亮的函数/子程序/程序来提高员工的薪水,但程序员负责以正确的方式将正确的函数应用于正确的数据。

在此基础上,OOP 可以提供进一步的好处,从而提高软件质量并减少工作量和错误风险,尤其是在大型团队创建和重用大型软件组件系统的情况下:

  1. 通过自动调用析构函数进行内存管理(例如 C++;其他语言 - 包括 VBScript - 改用垃圾收集)
  2. 通过继承重用代码(例如 Java;VBScript 对象不能继承,您必须将对象嵌入到对象中才能获得类似的效果)
  3. 信息隐藏/控制访问以降低错误风险并使实施改进成为可能

您的第一个(短)类有数据,但没有方法。让我们添加一个初始化函数:

Public Function init(p_first, p_last, p_salary)
  Set init = Me
  first = p_first : last = p_last : salary = p_salary
End Function

所以要得到 10 名员工,你可以写 10 次

Set employeedict(nId) = new employeeclass.init("John", "Doe", 12345.67)

而不是 10 次

Dim employee: Set employee = new employeeclass
With employee
    .first = "John"
    .last = "Doe"
    .salary = 50000
End With
employeedict.Add "1", employee

现在让我们想象一个做一些计算的 raiseSalary 方法(基于美分而不是美元,以便稍后讨论)

Sub raiseSalary()
  (m_)salary = x * (m_)salary / y ...
End Sub

调用此方法 - 并在某些法律发生变化时更改公式一次 - 当然胜过拥有 40 行之类的

employeeX.salary = x * (m_)salary / y ...

分散在你的脚本中。(这只是功能抽象,而不是 OOP;在 C++ 或 Java 中,当您处理一长串员工时,很容易/自动地通过不同的公式(多态函数)计算老板的薪水 - 在 VBScript 中,您将拥有诉诸涉及鸭子打字的肮脏/危险的技巧。)

您的第二个(长)类具有 - 样板 - 用于控制数据访问的方法(属性),但没有有效负载功能(如 raiseSalary)。只要您不向设置器(输入验证、转换(例如美元到美分)和现实世界可用的方法)添加有趣的东西,长类就只是浪费编码时间。(当然,如果您的报酬是代码行/小时并且您的经理没有意识到该类,因为它不能防止不完整或错误的初始化,如果不赚钱很容易。)

但是,如果您的 init 函数保证成员数据的完整初始化并验证输入(例如合理范围内的双数)并且您的加薪公式集中在一种方法中,您可以更改计算以使用长数字以获得更好的准确性转换在 init 方法中美元到美分一次 - 使用该类的代码没有变化。

您是否应该防止用户直接通过书籍(私人成员和访问者)或书籍(记录的警告)将工资设置为愚蠢的值,这取决于您的受众。

总结一下:

  1. 类应该有有效载荷方法
  2. 除了存储参数/返回成员数据之外,没有至少一些附加功能的 Getter/Setter 是无用的
  3. 即使在 VBScript 脚本上下文中(一个程序员,针对特定任务的许多临时脚本,很少有可重用的组件/模块,对 OOP 功能的不完全支持)在“更好”的类中组织代码(使用初始化函数、输入验证、集中实现核心功能)是一件好事。
于 2013-04-07T09:33:20.403 回答
0

它们看起来和做的几乎一样。但第一个使用领域,第二个使用属性。在这里寻找很好的解释http://blogs.msdn.com/b/vbteam/archive/2009/09/04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx

于 2013-04-07T06:12:06.337 回答