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