2

私はvb.netにwinformアプリケーションを持っており、じゃんけんゲームを開発しています。

以下に示すように、ある場所で列挙型を使用し、別の場所で文字列を使用して、いくつかの武器タイプを表します。

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とコーディングは初めてなので、このアプローチの問題点と、より良いアプローチは何でしょうか。

どんな助けでも大歓迎です。

どうもありがとう、

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したがって、明確にするために、クラス 内の定数の1つを渡す必要があることを説明するコメントを追加する必要があります。

可能であれば、コードを自己文書化することをお勧めします。列挙型を要求すると、メソッドが期待する可能な値がすぐにわかるため、その影響にコメントを追加する必要はありません。

さらに、値を設定または比較するすべての場所で、リテラルの代わりに定数を使用するため、コードの他の部分と実際の値に違いはありません。Rockは、「Rock」、「ROCK」、または「Hey Look、I'm aString!」と同じである可能性があります。コード内のどこでも定数を使用している限り、それは引き続き機能します。したがって、その場合、列挙型で整数値を使用するよりも文字列を使用することに利点はありません。

文字列定数の方が理にかなっている場合があります。たとえば、値をデータベースに保存していて、データベース内の値が人間が読める形式の値としてより役立つ場合は、0ではなく「Rock」を使用するのが理にかなっています。ただし、そうでない場合は文字列である必要があるような酌量すべき状況がある場合は、上記のすべての理由から、列挙型を使用することを強くお勧めします。

于 2012-12-22T16:32:26.370 に答える