0

Chris Pine の「Learn to Program」で Ruby を学んでいます。グローバル変数なしで対処しようとしています。見栄えの悪いコマンド プロンプト ブラックジャック プログラムがあります (まだ分割できません) 最初の 3 つの方法は、私が抱えている問題を示しています。Pascal では、グローバル変数を使用し、それらのグローバル変数を操作するメソッドを使用していました。こんな感じになります(Ruby疑似言語使用)

$deck_of_cards = []
$player_hand   = []
$dealer_hand   = []

def create_deck
    $deck_of_cards = #numbers 1-52
end

def shuffle_deck
    $deck_of_cards = #shuffled up deck of cards
end

def opening_deal
    2.times do
        $player_hand.push $deck_of_cards.pop
        $dealer_hand.push $deck_of_cards.pop
    end
end

create_deck
shuffle_deck
opening_deal

シャッフルされたデッキ、プレイヤーの手、ディーラーの手になります。

グローバル変数を取り除くと、最初の 2 つのメソッドは次のようになります。

def create_deck deck_of_cards
    deck_of_cards = #numbers 1-52
    return deck_of_cards
end

def shuffle_deck deck_of_cards
    deck_of_cards = #shuffled up deck of cards
    return deck_of_cards
end

deck = create_deck([])
deck = shuffle_deck(deck)

少し奇妙に感じますが、慣れることができました。

しかし、player_hand と deal_hand という 2 つの変数を返す必要がある最後のメソッドには完全に行き詰まっています。これらの 2 つの配列を別の配列にプッシュして返すこともできますが、それは何も単純化していないようです。

これに対処するための一般的な戦略はありますか、それとも状況ごとに独自の解決策がありますか?

頭に浮かぶ別の状況は、チェスのプログラムです。チェス プログラムのほぼすべてのメソッドがその値を使用する必要があるため、チェス盤をグローバル変数にするのはなぜ意味がないのでしょうか?

4

3 に答える 3

1

グローバル変数を持つことは悪い習慣ですが、グローバル定数、つまりメインの名前空間で定義された定数を持つことは悪いことではありません。グローバル変数が必要な場合は、メインの名前空間でいつでも定数を定義できます。文字列、ハッシュ、配列などの可変オブジェクトは、定数であっても変更できます。それだけでは不十分で、より複雑なものが必要な場合は、モジュール (定数の特殊なケース) を定義し、そのモジュールにメソッドを定義して、やりたいことへのアクセスを許可し、複雑な情報をカプセル化することができます。インスタンス変数を使用してそのモジュール内で。

于 2013-05-26T08:47:05.640 に答える