【问题标题】:Benefits and drawbacks of using enum or string to represent object type使用枚举或字符串表示对象类型的优缺点
【发布时间】:2012-12-22 15:52:03
【问题描述】:

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

任何帮助将不胜感激。

非常感谢,

【问题讨论】:

    标签: vb.net string oop object enums


    【解决方案1】:

    如果你要使用字符串,你至少应该使用常量。在任何地方都使用字符串文字只是一个坏主意,因为您很容易输入错误的内容。通过始终使用常量,至少可以避免该问题。其次,通过使用常量,如果需要,可以很容易地更改字符串值,或者在代码中找到使用常量的所有位置:

    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 可能是有意义的。但只要你不如果有任何情有可原的情况需要将其作为字符串,出于上述所有原因,我绝对建议您坚持使用枚举。

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 2010-09-18
      • 2010-09-30
      • 2020-09-11
      • 1970-01-01
      相关资源
      最近更新 更多