使用枚举或字符串表示对象类型的好处和缺点

时间:2012-12-22 15:52:04

标签: vb.net string oop object enums

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

非常感谢任何帮助。

非常感谢,

1 个答案:

答案 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可能是有意义的。但是只要你不这样做有任何情有可原的情况,你需要它是一个字符串,我绝对建议坚持使用枚举出于上述所有原因。