2

我在 vb.net 中有一个 winform 应用程序,并且正在开发一个石头剪刀布游戏。

我在一个地方使用枚举,在另一个地方使用字符串来表示某种武器类型,如下所示:

枚举示例:

    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

字符串示例:

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 和编码的新手,所以我只想知道这种方法的问题是什么,更好的方法是什么?

任何帮助将不胜感激。

非常感谢,

4

1 回答 1

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”或“Hey Look, I'm a String!”。只要代码中的任何地方都使用该常量,它仍然可以工作。因此,如果是这种情况,那么与仅在枚举中使用整数值相比,使用字符串确实没有任何优势。

有时字符串常量确实更有意义。例如,如果您将值保存到数据库,并且数据库中的值作为人类可读的值更有用,则使用“Rock”而不是 0 可能是有意义的。但只要你不有任何情有可原的情况下您需要将其作为字符串,出于上述所有原因,我绝对建议您坚持使用枚举。

于 2012-12-22T16:32:26.370 回答