我在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
答案 0 :(得分:6)
“short”和“long”类之间的区别是,正如@Garath已经提到的那样,前者暴露了存储实际值的成员变量,而后者将这些变量封装在属性中。
VBScript中的属性基本上有两个优点,尽管它们需要更多代码:
ip_addr
采用四点表示法的IP地址,则可以检查它是否由4个以点分隔的数字组成,每个数字在0到255之间,如果是,则引发错误检查失败。答案 1 :(得分:6)
所有编程范例(开发软件的不同方式)都努力以更少的努力构建更好的程序。然而,“更好”和“努力”的概念不太严格地定义为数学术语,其核心含义随时间而变化。
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
因此,要获得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方法中将美元兑换成美分一次 - 使用该类的代码没有变化。
是否应该防止用户将工资直接设置为书籍(私人会员和访问者)或书籍(记录的劝告)的愚蠢值取决于您的受众。
总结一下:
答案 2 :(得分:0)
他们看起来和做的差不多。但第一个使用字段,第二个使用属性。在这里查看好的解释http://blogs.msdn.com/b/vbteam/archive/2009/09/04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx