Pažintis su Ruby

Įrašyta 2007-06-28, 10:42 | 0 Komentarų

Vakar apturėjau dar vieną kasdvisavaitine (ar išvis yra toks žodis?) tapusio Brighton Coding Dojo sesiją. Šios sesijos metu programavome Ruby kalba. Kūrėme Klondike Solitaire žaidimą, pagal CodeKata scenarijų. Visa tvarka kaip ir sesijos vykusios festivalio metu. Prie kompo vienu metu sėdi du programuotojai - "vairuotojas" ir "rašytojas", keičiamasi kas ~5 minutes (nors realiai gal ir po daugiau prasėdėjom :)).

Iš visos 8 žmonių grupės turėjome tik du programuojančius Ruby (tai tik dar kartą patvirtina teiginį, kad kodo rašymas yra lengviausia programavimo dalis ;)). Jie pradėjo sesiją ir kartu pravedė trumpą sintaksės pamokėlę. Pradžia buvo sunkiausia, vyko apmąstymai apie duomenų tipus, šiaip strategiją. Po kiek laiko viskas įsibėgėjo, pradėjom rašyti metodus, po to vienas žmogus pasiūlė susikurti testavimo klasę, kas padarė mūsų darbą lengvesnį ir įdomesnį.

Pirmiausia susikūrėm kortų kaladės klasę:

class Deck
    attr_accessor :cards
    #suitHash = { 0 => "Spades", 1 => "Hearts", 2 => "Diamonds", 3 => "Clubs"}
    def initialize
        @cards = []
        @suits = [:spades, :hearts, :diamonds, :clubs]
        puts @cards
        @suits.each do |suit|
            13.times do |number|
                card = Card.new(number+1,suit)
                @cards.push(card)
            end
        end
    end

    def to_s
        @cards.to_s
    end

    def shuffle
    #Exclamation mark used to modify in place, not create a new version.
        @cards.sort! {rand(52) <=> rand(52)}
    end

    def deal
        @cards.pop
    end
end

Viskas vyko "trial and error" metodu - dedame žingsnį, žiūrime ar veikia, jei ne - taisome klaidas. Man labai įdomi dalis buvo testavimo klasės rašymas ir vykdymas. Sukūrę metodą turėjom jį pratestuoti. Reikėjo sugalvoti kaip patikrinti ar sukurtos visos kortos, ar jos išmaišytos, ar teisingai vyksta dalinimas ir t.t. Darėme begales klaidų (aš sugebėjau gauti net <false> is not true klaidą :D) tad skirtos 2 valandos prabėgo akimirksniu. Kadangi žaidimo nebaigėme, o darbas buvo tikrai įdomus, nusprendėme pratęsti jo kūrimą per ateinančias sesijas.

Beje, kas nežino - aš Ruby neprogramuoju ir pradėti nežadu (renkuosi Python ;)). Kaip ten bebūtų, tokios sesijos yra labai geras dalykas. Tiek gilinti programavimo žinias, mokytis iš labiau patyrusių, tiek gerai praleisti laiką.

Pabaigai dar papostinu testavimo failą, o kitkas liks ateičiai.

require 'test/unit'
require 'Klondike'

class TestKlondike < Test::Unit::TestCase
    # def setup
    # end

    # def teardown
    # end

    def test_deck
        deck = Deck.new
        assert_equal(47, deck.cards.length)
    end

    def test_shuffle
        deck = Deck.new
        anotherDeck = Deck.new
        anotherDeck.shuffle
        assert_not_equal(deck.to_s, anotherDeck.to_s)
    end

    def test_deal
        deck = Deck.new
        deck.deal

        assert_equal(46, deck.cards.length)
    end

    def test_game_deal
        game = Game.new
        length = game.deal.length
        game.deal_cards

        assert(game.deal.length < length)
        assert(game.discard.length > 0)
    end

    def test_add_to_foundation
        f_1, f_2, f_3, f_4 = Foundation.new
        ace_spades = Card.new(1, :spades)
        assert(f_1.add(ace_spades))
        #assert(f_1.length == 1)
    end
end

Laukite tesinio ;)

Gairės: Geek, Programavimas, Ruby