我在vb.net上有一个winform应用程序,正在开发Rock Paper Scissor游戏。
我在一个地方使用枚举,在另一个地方使用字符串来表示某种武器类型,如下所示:
ENUM示例:
Imports RockPaperScissors.Weapon
Public Class PlayerComputerRandom
Inherits Player
Private Enum weaponsList
Rock
Paper
Scissors
End Enum
Public Overloads Sub pickWeapon()
Dim randomChoice = New Random()
Dim CompChoice As Integer = randomChoice.Next(0, [Enum].GetValues(GetType(weaponsList)).Length)
If CompChoice = "0" Then
pWeapon = New Rock()
ElseIf CompChoice = "1" Then
pWeapon = New Paper()
Else
pWeapon = New Scissors()
End If
End Sub
End Class
STRING示例:
Public Class Player
Public pWeapon As Weapon
Public Sub pickWeapon(ByVal WeaponType As String)
If WeaponType = "Rock" Then
pWeapon = New Rock()
ElseIf WeaponType = "Paper" Then
pWeapon = New Paper()
Else
pWeapon = New Scissors()
End If
End Sub
End Class
您能告诉我每种方法的优缺点吗?我是OOP和编码的新手,所以我只想知道这种方法的问题是什么,哪种方法更好?
非常感谢任何帮助。
非常感谢,
答案 0 :(得分:0)
如果要使用字符串,则至少应使用常量。在任何地方使用字符串文字只是一个坏主意,因为您可以轻松输入错误的内容。通过始终使用常量,至少可以避免这个问题。其次,通过使用常量,可以很容易地更改字符串值(如果需要),或者查找代码中使用常量的所有位置:
Global Const RockWeapon As String = "Rock"
Global Const PaperWeapon As String = "Paper"
Global Const ScissorsWeapon As String = "Scissors"
然而,问题仍然存在,在阅读代码时,所有可能的值都是显而易见的。这可以通过将所有字符串常量分组到一个类中来进一步减轻,以便它基本上像枚举一样工作,如下所示:
Public Class Weapons
Public Const RockWeapon As String = "Rock"
Public Const PaperWeapon As String = "Paper"
Public Const ScissorsWeapon As String = "Scissors"
End Class
然后,你可以使用这样的常量:
Public Sub pickWeapon(ByVal WeaponType As String)
If WeaponType = Weapons.Rock Then
pWeapon = New Rock()
ElseIf WeaponType = Weapons.Paper Then
pWeapon = New Paper()
Else
pWeapon = New Scissors()
End If
End Sub
然而,代码仍然比它需要的更令人困惑,因为当你调用pickWeapon
方法时,它告诉你的只是你需要传递一个字符串。因此,为了清楚起见,您需要添加一条注释,说明您必须传递Weapons
类中的一个常量。
在可能的情况下,让代码自我记录总是更好。当您要求枚举时,您立即知道该方法所期望的值,因此无需为该影响添加注释。
此外,由于您想要设置或比较值的所有位置,您希望使用常量而不是文字,因此它与代码的其余部分没有任何区别。 Rock可能等于“Rock”,或“ROCK”,或者“嘿看,我是一个字符串!”。只要代码中的每个地方都使用常量,它仍然可以工作。所以,如果是这种情况,那么在枚举中只使用一个整数值就没有优势了。
有时候字符串常量更有意义。例如,如果要将值保存到数据库,并且数据库中的值作为人类可读的值更有用,那么使用“Rock”而不是0可能是有意义的。但是只要你不这样做有任何情有可原的情况,你需要它是一个字符串,我绝对建议坚持使用枚举出于上述所有原因。