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

J P*_*J P 3 vbscript class object

我在这个StackOverFlow问题,VBScript中的对象/类的字典中找到了这段代码.

我的问题是为什么这个"短"课与这个"长"课做同样的事情?为什么甚至打扰长码?短类版本可以与同一类中的其他方法一起使用吗?谢谢!

短班

Class employeeclass
    Public first, last, salary
End Class
Run Code Online (Sandbox Code Playgroud)

长班

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
Run Code Online (Sandbox Code Playgroud)

但是,使用短类的完整脚本,只需用long类替换短类就可以获得相同的结果.

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
Run Code Online (Sandbox Code Playgroud)

Ans*_*ers 6

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

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

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


Ekk*_*ner 6

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

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

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

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

你的第一个(短)类有数据,但没有方法.让我们添加一个init函数:

Public Function init(p_first, p_last, p_salary)
  Set init = Me
  first = p_first : last = p_last : salary = p_salary
End Function
Run Code Online (Sandbox Code Playgroud)

因此,要获得10名员工,您可以写10次

Set employeedict(nId) = new employeeclass.init("John", "Doe", 12345.67)
Run Code Online (Sandbox Code Playgroud)

而不是10次

Dim employee: Set employee = new employeeclass
With employee
    .first = "John"
    .last = "Doe"
    .salary = 50000
End With
employeedict.Add "1", employee
Run Code Online (Sandbox Code Playgroud)

现在让我们假设一个raiseSalary方法进行一些计算(基于美分而不是美元,以便后面的参数)

Sub raiseSalary()
  (m_)salary = x * (m_)salary / y ...
End Sub
Run Code Online (Sandbox Code Playgroud)

调用这种方法 - 并在某些法律发生变化时改变公式 - 当然要有40行像

employeeX.salary = x * (m_)salary / y ...
Run Code Online (Sandbox Code Playgroud)

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

你的第二个(长)类有 - 锅炉板 - 控制数据访问的方法(属性),但没有有效载荷功能(如raiseSalary).只要你不向设置者添加有趣的东西(输入验证,转换(例如美元到美分)和现实世界可用的方法,长类只是浪费编码时间.(当然,如果你得到报酬的话)代码行/小时,你的经理没有意识到这个课程,因为它不能防止不完整或错误的初始化,如果生病了,这很容易.)

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

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

总结一下:

  1. 类应具有有效负载方法
  2. 没有至少一些附加功能的Getters/Setters只是存储参数/返回成员数据是没用的
  3. 甚至在VBScript脚本上下文中(一个程序员,许多特定任务的特殊脚本,很少的可重用组件/模块,不完整的OOP功能支持)在"更好"的类中组织代码(使用init函数,输入验证,集中实现)核心功能)是一件好事.