通过类存储和检索 - 函数,子类和最佳实践
完成计算机科学学位后,我找到了一份软件开发人员的工作(呜!)。通过大学,我大量使用Web和Java编程(从程序的角度来看)。我现在也跳入Visual Basic .NET中的面向对象编程。通过类存储和检索 - 函数,子类和最佳实践
我想从最佳做法的右脚开始,而不是如此我有一个简单的场景我想知道什么是最好的方法来做到这一点。
假设我有一个名为'Config.vb'的类,它在创建'Sub Load'时从注册表中读取键。 关键字是:'Fname','Lname','address1','address2','city','shoesize'。
所以我想存储这些键和它们的值可以访问我的Main.vb。
第一种方法是申报6个变量对存储的值,从而
Dim firstName = regKey("firstname").value
Dim lastName = regKey("lastname").value...
然后有存取方法来检索这些值
Property ReadOnly getFirstname As String
Get
Return firstName
End Get
End Property
但写出6种get方法似乎太冗长。我很可能是错的,这就是我为什么要问的原因。这是访问这些变量的最佳方式吗?
另外,
我想也许聚拢在短短的一个解释变量的所有键和值,因此将包含与他们的价值观所有的键,然后只具有一个函数来接受密钥字符串和返回值如下:
Private Function getkey(key) As String
Return dictionary.Item(key)
End Function
这可能是我如何接近它。
任何指导或让我知道你做这件事的方式都会帮助我和其他人学得更好!
谢谢。
正如Plutonix所说。将数据存储在注册表中不是一个好主意。取决于你想如何访问数据。如果您只想一次性将所有关于(大概)人的所有数据读入您的程序,那么您可以查看object serialization,或者如果您正在处理大量数据,请查看数据库。使用基本的OOP可以很好地开始被发现here。它的一篇很老的文章,但应该仍然工作得很好。
就您的数据而言,您最好定义一个新班级。像这样
Friend Class Person
Dim _firstName As String
Dim _lastName As String
Public Property FirstName
Set(value)
_firstName = value
End Set
Get
Return _firstName
End Get
End Property
Public Property LastName
Set(value)
_lastName = value
End Set
Get
Return _lastName
End Get
End Property
End Class
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim p1 As New Person
p1.FirstName = regkey("firstname")
p1.LastName = regkey("lastname")
End Sub
当然,如果你与几个人打交道,那么你会更好地创建一个列表。而不是声明P1作为一个人的一个新的实例,decleare列表这样
Dim peopleList As New List(Of Person)
,并添加人列出此
Dim tempPerson As New Person
tempPerson.FirstName = regkey("firstname")
tempPerson.LastName = regkey("lastname")
peopleList.Add(tempPerson)
或
tempPerson.FirstName = "Fred"
tempPerson.LastName = "Perry"
peopleList.Add(tempPerson)
OOP的好处是,在一个类中,你可以声明例如在类的每个实例中处理数据的方法(过程)。说你有你的类名为DOB的属性 - 列出此
Dim _DateOfBirth As Date
Public Property DOB As Date
Set(value As Date)
_DateOfBirth = value
End Set
Get
Return _DateOfBirth
End Get
End Property
您可以创建这样一个返回的人的年龄而不必存储和更新的时代,随着时间的推移类的功能。就像这样:
Public Function Age() As Integer
Age = DateDiff(DateInterval.Year, _DateOfBirth, System.DateTime.Now)
Return Age
End Function
为了得到tempperson的年龄,只是用这个
Dim tempPerson As New Person
tempPerson.FirstName = "Fred"
tempPerson.LastName = "Perry"
tempPerson.DOB = CDate("8/12/1967")
MessageBox.Show("Age of the person is " & tempPerson.Age)
爱是爱OOP!
真棒的答案,谢谢你进入这么深的。我实际上是指保留这些数据的一个副本。真的很高兴知道我是否在跟踪多个人。 如果我要保留信息的一个副本,假设它是关于用户的信息,是否更好的做法是让所有私有变量通过多个Get Property方法访问? – MikeS
是的,我会这么说。使用附件方法,您可以在其中包含代码以在内部验证数据,并且如果该类在其他地方曾经使用过,则内置验证而不必再次编写它,或者如果您决定更改验证代码,则只需要在一个地方做。而不是在两个单独的项目中 –
您的'Age'函数不会在'Option Strict'下编译。由于日期没有格式(即转换为字符串),所以您只需'DateDiff(DateInterval.Year,_DateOfBirth,System.DateTime.Now)'。把它作为一个函数来构造是很常见的,但是你可以看看大多数.NET类方法,比如'Count',它们类似于它们的ReadOnly属性 – Plutonix
如果你想要最佳实践,不要将应用程序数据存储到注册表中。还有很多其他选项以My.Settings开头 – Plutonix
如果数据实际上类似Settings/Config,[此答案可能有帮助](http://stackoverflow.com/a/25319489/1070452)。 “showsize”推断应用程序数据,如果没有足够的数据库打扰,请参阅此答案(http://stackoverflow.com/a/33529974/1070452)(除了上下文之外,彼此非常相似) – Plutonix
啊我明白了,谢谢你的帮助,我没有意识到这是一种不好的做法!我想我现在要重写课程! – MikeS