tdd etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
tdd etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

9 Ekim 2013 Çarşamba

Odev Yapiyorum "Harry Potter Kata" adim adim

Tekrar Merhaba

Simdi kurs sirasinda verilen odevlerden "Harry Potter Kata"yi yapacagim. Senaryo su sekilde

Harry Potter Kata 
To try and encourage more sales of the 5 different Harry Potter books they sell, a bookshop has decided to offer discounts of multiple­ book purchases.

One copy of any of the five books costs 8 EUR.

If, however, you buy two different books, you get a 5% discount on those two books.

If you buy 3 different books, you get a 10% discount.

If you buy 4 different books, you get a 20% discount.

If you go the whole hog, and buy all 5, you get a huge 25% discount.

Note that if you buy, say, four books, of which 3 are different titles, you get a 10% discount on the 3 that form part of a set, but the fourth book still costs 8 EUR.

Your mission is to write a piece of code to calculate the price of any conceivable shopping basket (containing only Harry Potter books), giving as big a discount as possible.

For example, how much does this basket of books cost?

2 copies of the first book 2 copies of the second book 2 copies of the third book 1 copy of the fourth book 1 copy of the fifth book

Answer: 51.20 EUR
Once github'da repository olusturarak basliyorum. Daha yeteri kadar tecrubem olmadigi icin gorsel araclari kullanmak daha kolay geliyor.

Repository olusturuyoruz
Altta isaretlemis oldugum README dosyasi olusturma secenegi sayesinde projenin tanimini yazacagim bir dosyayi otomatik olarak olusmasini sagladim.

Sonraki ekranda basta yazdigim tanimi icine yazarak proje hakkinda on bilgi olusturdum.

Bu repository'nin adresi bana birazdan lazim olacak o yuzden repository sayfasina gecip harry_potter_kata repository'sini seciyor ve url'ini kopyaliyorum. (https kismi dahil) yani simdi elimde
https://github.com/Aliiybar/harry_potter_kata
gibi bir url var ve clippoard'da bekliyor.

command prompt'a gecip projeyi koyacagim klasoru olusturuyor ve icine giriyorum.

mkdir harry_potter_kata
cd harry_potter_kata

simdi git ile baglantisini kuracagim
git init 
git remote add harry_potter_kata https://github.com/Aliiybar/harry_potter_kata
git pull https://github.com/Aliiybar/harry_potter_kata

simdi program dosyalarimi olusturabilirim
touch hpk.rb
touch hpk_spec.rb

her iki komutla bos birer metin dosyasi olusturdum 
hpk_spec.rb dosyasini editor ile acip yazmaya basliyorum 


hpk_spek.rb
require './hpk.rb'

describe Hpk do
describe 'bookSet' do
it 'Returns with empty set array' do
hpk = Hpk.new
expect(hpk.bookset).to eq([0, 0, 0, 0, 0])
end
end
end


hpk.rb
class Hpk
bookset = []
def initialize ()
@bookset = []
5.times do |book_nr|
@bookset << 0
end
end

def bookset
return @bookset
end
end

simdi ilk testimize haziriz.
terminal penceresinde (command prompt) asagidaki komutu yaziyoruz.
rspec hpk_spec.rb
cevap olarak
Finished in 0.00051 seconds 1 example, 0 failures

veya bir hata varsa hata ile donuyor.

Simdi gelistirelim (renklerle ugrasamadim bu sefer)


hpk_spek.rb
require './hpk.rb'

describe Hpk do  
describe 'bookSet' do
it 'Returns with empty set array' do
hpk = Hpk.new
expect(hpk.bookset).to eq([0, 0, 0, 0, 0])
end
end

describe 'calculate' do
it 'Returns total amount' do
hpk = Hpk.new
expect(hpk.calculate_books_in_cart([2,2,1,0,0])).to eq(36.8)
end
end


describe 'calculate' do
it 'Returns total amount' do
hpk = Hpk.new
expect(hpk.calculate_books_in_cart([2,2,2,1,1])).to eq(51.2)
end
end
end


hpk.rb
class Hpk
BookPrice = 8

bookset = []
def initialize ()
@bookset = []
5.times do |book_nr|
@bookset << 0
end
end

def bookset
return @bookset
end

def calculate_books_in_cart(cart_arr)
looper = true
grand_total = 0.0
while looper
nr_of_books = 0 
5.times do |book_nr|
if cart_arr[book_nr] > 0 
nr_of_books += 1 
cart_arr[book_nr] = cart_arr[book_nr] - 1
end
end

case nr_of_books
when 5
grand_total += ((BookPrice * 5) * 0.75)
when 4
grand_total += ((BookPrice * 4) * 0.80)
when 3
grand_total += ((BookPrice * 3) * 0.90)
when 2
grand_total += ((BookPrice * 2) * 0.95)
when 1 
grand_total +=  BookPrice  
when 0 
looper = false
end

end
return grand_total
end

end


test yaptigimizda gorevden farkli bir sonuc elde ettik ama yine de verilen gorevi kismen yerine getirdik. o halde bu haliyle github'a gonderelim
git add .
git commit
git push harry_potter_kata
git commit'ten sonra commit mesajini yazmayi unutmuyoruz. Bu versiyonun neler icerdigini anlatan bir mesaj ileride faydali olacaktir.

bu odevdeki kodlara benim git adresimden ulasabilirsiniz.


https://github.com/Aliiybar


8 Ekim 2013 Salı

RSpec ve TDD

Derslere baslamadan once bazi konular hakkinda simdiye kadar ogrendiklerimi sizinle paylasirsam benim gibi zorluk cekmezsiniz diye dusunuyorum. Yani RSpec nedir bilmeden TDD olayini anlamadan baliklama konuya atlamak bazilarimiza biraz karisik gelebiliyor. 

TDD

Once Test Driven Development kavrami ile baslayalim. RSpec 2005 yilinda Steven Baker tarafindan olusturulmus. Bu kavramla benim gibi yeni karsilasanlariniz icin once tanimi vereyim. Temelde once testleri yazip, sonra bu testlerden basari ile gecek kodlari yazmak diyebiliriz. (size de ters geldi mi ?) 

Once basit bir test yaziyoruz, testi calistiriyoruz ve dogal olarak test basarisiz oluyor. Sonra bu testin sonucunu dogru dondurecek kod parcasini yaziyoruz (ama fazlasini degil) sonra testi tekrarliyoruz ve bu sekilde kod sekilleniyor. Kodlar arttikca tekrarlanan bolumleri sadelestiriyoruz (method'lar yaparak) ve sonucta yazilan kodlar temel test asamasini gecmis olarak doguyor. 

BDD

Behaviour Driven Development ise bir sonraki adim gibi. Yani bu sefer kucuk parcalardan bir buyugune yani modul boyutundaki butun parcalari test ediyoruz. Bu testler bir bakima programci ile is sahibinin arasindaki tercuman gibi calisiyorlar.  Kullanilan dil konusma dili (ama Ingilizce) 
Given
When 
Then 
yapisinda yazilan cumlelerin test'e tabi olmasi ile calisiyor. 
 
BDD'ye daha sonra tekrar donecegim. Simdi basliga sadik kalarak TDD konusuna donelim. 

RSpec 

Asagida bir test blogu ornegi bulacaksiniz. 

describe MovieList do
   context "when first created" do
      it "is empty" do
         movie_list = MovieList.new
         movie_list.should be_empty
      end
   end
end

Test sonucunda yazan yazi su sekilde olacaktir

MovieList when first created is empty
 
Neyin nereden geldigini renkler ile vermeye calistim.

Eger test blogunda pending varsa sistem testi yapmayi pas geciyor. 

Bu yaziya devam edecegim ... 



Ruby Dersleri Basliyor

Ingiltere'de butun egitimler mi boyle yoksa bu kursa ozel mi boyle bir durum var tam cozemedim ama bizdeki egitim anlayisindan cok farkli. Fazlasiyla bocaladigimi soyleyebilirim.

Biz genelde bir konunun anlatilmasi ve o konu ile ilgili alistirmalar yaparak pekistirilmesi uzerine sistemi kurmusuz. Burada birden bire duvara tosladim. cunku derse girdik hic birsey anlatilmadan alistirmalara baslandi. Dogal olarak hic birsey anlatilmadigi icin ne yapacagimi bile anlamam 15 dakika surdu.

Biraz intibak sorunu yasasam da sorunu cabuk atlattim.

Ruby ogrenmek sandigimdan daha kompleks bir konu. Sadece bir programlama dilini ogrenmekle bitmiyor. .NET programcisi olarak uzak kaldigimiz bir cok konunun icine de mevburen soktugu icin ayni anda sunlari da ogrenmek gerekiyor

  •  UBUNTU Linux
  •  GitHub
  •  RSPEC (Unit Test)
  •  Cucumber (test)
  •  Ruby
  •  Ruby On Rails

Yani kisaca ayri bir disiplin diyebiliriz.

Simdi herseye baslamadan once kisaca bir GitHub konusuna girmekte fayda var.

GitHub


Neredeyse bundan sonraki her adimda github ile kolkola gidecegiz. .NET ile tek tabanca program gelistirirken ihtiyacini hic hissetmedigim ama ekip olarak calismaya baslar baslamaz sorunu yasadigim ve cozum olarak cok uzaklara gitmeden microsoft'a basvurdugum bir konu var "Kod Paylasimi" ve "versiyon kontrolu"

Onceleri yalniz basima proje gelistirdigim icin gunluk backup almak versiyon kontrolu acisindan yeterli oluyordu. Hatta bu konuda simdi adini bile hatirlamadigim ama diski istenilen tarih ve saate donduren programlar da kullanmistim. Ekip olarak proje yazarken de r4gl veya ASP gibi projelerde calistigimiz icin sinirlarimizi belirler ve birbirimizin koduna dokunmadan projeyi yazardik. Ancak ilk defa kod baylasimi ve ekip olarak bir proje gelistirmeye giristigimde daha kompleks bir yapiya ihtiyac duyduk. Microsoft Visual Source Safe kurulumu yaptigimizda herseyin cozuldugunu gordum ve daha da fazla arastirmaya girismeden bunun uzerinde yurumeye basladik. Basitce bir sunucuya yaptigimiz isleri gonderiyor ve versiyon kontrolu, cakisma kontrolu ve kod arsivini temin etmis oluyorduk. .NET ile tam uyumlu oldugu icin kullanmasi da cok rahatti.

Server gene sirkette olan bir baska PC idi. yaklasik 3 sene hic sorun yasamadan bu sekilde proje gelistirdik. Ama takim kucuktu ve gene aslinda birbirimizin ayagina basmamayi konusarak hallettigimiz icin butun fonksiyonlari kullanmamistik.

Sonra Ingiltere'ye ilk geldigimde SVN ile tanistim. Ayni isi baska bir program ile yapiyorduk. Yine Visual Studio ile entegre calistigindan sorun olmadi. nispeten hizla adapte oldum.

Daha sonra sirket politikasi geregi SVN yerine GIT ile calismam gerekti. Sirketin geri kalani zaten git uzerinde oldugu icin beni de kolayca aldilar. Ama bu sefer de butun projede tek basima calistigim icin GIT'in butun nimetlerinden faydalanmadim. Sadece kendi kendime isi biten kodlari gonderiyordum o kadar. Sonra bir arkadas geldi yanima ama 2 projeyi birer birer paylasinca yapisal olarak gene birsey degismedi. Ben de islerin yogunlugundan pek uzerine dusmedim GIT'in.

Ve simdi Ruby'de karsima tum fonksiyonlari ile birlikte cikti. Daha once farketmedigim bazi farklari kisaca soyle anlatabilirim.

Bir kere klasor yapilanmasi farkli. Diger yapilarda bir kod gelistirilen ortam ve bir de sunucu varken bunda durum biraz daha farkli. Arada bir katman daha var.

Offline calismaya imkan veriyor herhangi bir zamandaki herhangi birinin yaptigi katkiya hizla bakmak mumkun.

Web tabanli yapisi ile kodlari incelemek, kimin ne yaptigini bulmak mumkun.

O kadar cok fonksiyon var ki, hersey ciddi ciddi dusunulmus. Ne yapmak istiyorsaniz ona uygun bir komut mutlaka var.

Acik kaynak kodlu. Kodlari paylasmak sartiyla ucretsiz. (aylik ucretini odeyip kimsenin goremeyecegi projeler olusturabiliyorsunuz.)

Simdilik oncelikli yapmaniz gereken eger bir github hesabiniz yoksa onu olusturmak. www.github.com adresinden kayit ucretsiz  oluyorsunuz

Ilk calisma ortaminin hazirligi

GitHub'a uye oldunuz. web'de git uzerinde bir repository olusturuyoruz.
olusturulan repository icin sagdaki resimde gordugunuz gibi bir adres olusacak onu kopyalayin ileride yapistiracagiz.

Simdi "code" diye bir klasor olusturup komut satirindan cd ile icine giriyoruz.

touch readme
readme diye bos bir text dosyasi olusturduk

subl readme
readme dosyasini editor ile actik icine birseyler yazip save edip kapatiyoruz.

git init
ile bu klasorun git ile ilk iliskisini baslatiyoruz

git add .
klasordeki herseyin git'e yollanacagini soyluyoruz.  (evet su anda bos)

git commit
git'e gonderilmek uzere isaretliyoruz. bu asamada bu gonderime dair notlari kaydetmek uzere bir metin dosyasi acilir. Aciklamalari yazip kaydediyoruz.

git remote add origin https://github.com/GitUserName/RepositoryName.git
bilgisayardaki klasor ile github.com'daki klasoru iliskilendirdik.

git push -u origin master
klasordeki son commit edilmis olanlari git'e gonderiyoruz. (git kullanici adi ve parolanizi soracaktir)

temel islemler bunlar.. Klasore yeni kodlar ve alt klasorler ekledikce "gid add ."  ile  eklemeyi unutmayin. sonra gene git commit'den itibaren tekrar ederek yuklemeyi yapabilirsiniz.

Ilk Ders


ilk dersin icerigini size aktararak Ruby ile tanismaya ne dersiniz.

oncelikle koans.heroku.com adresine girerek onunuzdeki iki yoldan birini secmeniz gerekiyor. Koans bunca yildir bu iste olmama ragmen kacirmis oldugum konulardan biri.

Size bir dil ile ilgili cesitli konseptleri anlatan kodlar verilerek bosluklara komutlar, islemler, sonuclar yazarak hata veren kodu hatasiz hale getirme yontemi diyebiliriz.

Yukarida verdigim adresteki koanlari bilgisayariniza indirerek kodlar uzerinde calisabilir veya web uzerinden cozerek ilerleyebilirsiniz. (acikca soyleyeyim cok kisa surmuyor tamaminin bitmesi icin 2-3 gun harcayabiliyorsunuz dolayisiyla bilgisayariniza indirmekte fayda var.) indirmek icin link sayfanin en altinda veya bu adreste http://rubykoans.com/

Benim tavsiyem direk koda atlamadan once biraz okumak. O yuzden ruby-doc.org adresine bakabilir veya http://tutorials.jumpstartlab.com/projects/ruby_in_100_minutes.html adresinden 100 dakikada ruby konusunu okuyabilirsiniz. Gercekten 100 dakikada ana hatlari ile bazi konulari anlayabiliyorsunuz.

Biz indirdik o yuzden sizin de indireceginizi farzediyorum.. indirdiginiz zip dosyasini onceden hazirladigimiz klasore aciyoruz.

rake 
komutu ile indirilan koanlar calistirilip adim adim hatalarin ayiklanmasi saglanir.


boylece unit test olayina baliklama atlamis olduk.