2013-05-26 52 views
0

我正在通過Chris Pine的'Learn to Program'學習Ruby。我試圖應付沒有全球變數。我有一個馬虎看起來命令提示符二十一點程序(不能拆分)我的前三個方法說明我遇到的問題。在Pascal中,我會使用全局變量,並使用方法來操作這些全局變量。它看起來像這樣(使用Ruby語言僞)我使用什麼策略來避免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 

,我會最終有一個洗牌的甲板,一個球員的手,和發牌手。

奪走了全局變量,前兩種方法現在看起來是這樣的:

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和dealer_hand。我可以將這兩個數組推入另一個數組並返回,但這看起來不像是簡化了任何事情。

是否有一個處理這個問題的一般策略,還是每種情況都有其獨特的解決方案?

想到的另一種情況是國際象棋程序。爲什麼把國際象棋棋盤變成全局變量是沒有意義的,因爲國際象棋程序中幾乎所有的方法都需要使用它的價值?

回答

3

簡短回答:對象。面向對象編程允許你封裝數據,以免污染全局名稱空間。隨着您的項目變得越來越大,將全部數據放在全局名稱空間中變得無法維護。對象允許您將數據和方法分組爲有意義的單位,然後可以更輕鬆地重新使用和維護。

因此,舉例來說,您提供的示例中我們可以製作甲板和手形物體。這允許我們輕鬆地創建多個套牌和雙手,因爲這些對象封裝和管理他們的數據。

由於你如何組織你的類/方法粗線條:

class Deck 
    def shuffle 
    end 

    def draw_hand 
    end 
end 

class Hand 
end 

class Card 
end 
1

在一般情況下,使用面向對象的編程技術,你會定義類,創建這些類的對象,然後繞過這些對象。你可以將對象看作是一種類似於數組的東西,因爲它們可以包含很多相關數據,但是比數組更好,因爲數據元素可以具有名稱並且可以是任何類型,並且不需要是相同的類型,並且它們隨附用於對數據進行操作的命名函數。 (實際上,在Ruby中,數組元素可以是任何類型,不需要是相同的類型,哈希元素加上哈希元素也是如此,但Ruby是特殊的,但很少有其他語言允許這樣做。)

保持簡單,不過,你可以繼續你的程序是這樣的:

def opening_deal deck_of_cards 
    player_hand = [] 
    dealer_hand = [] 
    2.times do 
     player_hand.push deck_of_cards.pop 
     dealer_hand.push deck_of_cards.pop 
    end 
    return player_hand, dealer_hand 
end 

player_hand, dealer_hand = opening_deal deck 
0

這是一個壞習慣有全局變量,但它是不壞有全局常量,或者換句話說,在主名稱空間中定義的常量。當需要一個全局變量時,你總是可以在主名稱空間中定義一個常量。像字符串,散列,數組這樣的可變對象即使是常量也可以修改。如果這還不夠,你需要更復雜的東西,那麼你可以定義一個模塊(這是一個常量的特例),並定義該模塊上的方法來訪問你想要做的事情,並封裝複雜的信息在該模塊內使用實例變量。