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)
所有编程范例(开发软件的不同方式)都努力以更少的努力构建更好的程序.然而,"更好"和"努力"的概念不太严格地定义为数学术语,并且它们的核心含义随时间而变化.
OOP的基本思想是将复杂数据(如处理员工所需的信息)与复杂功能(如操作此类信息所需的操作)捆绑在一起.在OOP之前,您可以使用员工结构/记录/类型和漂亮的功能/子/程序来提高员工的工资,但程序员负责以正确的方式将正确的功能应用于正确的数据.
在此基础上,OOP可以提供进一步的好处,提高软件质量,减少工作量和错误风险,特别是在大型团队创建和重用大型软件组件系统的情况下:
你的第一个(短)类有数据,但没有方法.让我们添加一个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方法中一次美元到美分 - 使用该类的代码没有变化.
是否应该防止用户将工资直接设置为书籍(私人会员和访问者)或书籍(记录的劝告)的愚蠢值取决于您的受众.
总结一下: