VBScript中的类:为什么这两个例子做同样的事情?

时间:2013-04-07 05:18:02

标签: class object vbscript

我在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

使用short类的完整脚本,只需用long类替换short类就可以获得相同的结果。

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

3 个答案:

答案 0 :(得分:6)

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

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

  • 您可以将属性设置为只读(或只写),这对于成员变量是不可能的。
  • 您可以在将值存储在相应的成员变量中之前验证该值。例如,如果您的属性ip_addr采用四点表示法的IP地址,则可以检查它是否由4个以点分隔的数字组成,每个数字在0到255之间,如果是,则引发错误检查失败。

答案 1 :(得分:6)

所有编程范例(开发软件的不同方式)都努力以更少的努力构建更好的程序。然而,“更好”和“努力”的概念不太严格地定义为数学术语,其核心含义随时间而变化。

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

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

  1. 通过自动调用析构函数来管理内存(例如C ++;其他语言 - 包括VBScript - 使用垃圾收集)
  2. 通过继承重用代码(例如Java; VBScript对象不能继承,你必须将对象嵌入到对象中以获得类似的效果)
  3. 信息隐藏/控制访问以降低错误风险并改进实现
  4. 你的第一个(短)课有数据,但没有方法。让我们添加一个init函数:

    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. Getters / Setters没有至少一些附加功能,只是存储参数/返回成员数据是没用的
    3. 即使在VBScript脚本编写环境中(一个程序员,许多特定任务的特殊脚本,很少的可重用组件/模块,对OOP功能的不完整支持)在“更好”的类中组织代码(使用init函数,输入验证) ,集中实施核心功能)是一件好事。

答案 2 :(得分:0)

他们看起来和做的差不多。但第一个使用字段,第二个使用属性。在这里查看好的解释http://blogs.msdn.com/b/vbteam/archive/2009/09/04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx