Димитър обнови решението на 09.10.2015 00:15 (преди около 9 години)
На прав път си, но convert_to_bgn
не седи добре:
- счупено е, не закръгляш в bgn
- всичко се повтаря, можеш и по-добре. Числата висят във въздуха, запази ги в нещо с адекватно име. Разгледай набързо Hash-ове.
Хоп! Прилично е, но може да се подобри и затова сега ще ти pimp-нем решението!
Но преди това...
Тестове
Надявам се да си си пуснал примерните тестове. Ако не си, пусни ги! Увери се, че те минават успешно. След това, ако искаш, можеш да допишеш и още някой тест. Отваряш sample_spec.rb
и вътре ще намериш следното:
describe '#convert_to_bgn' do
it 'converts usd' do
expect(convert_to_bgn(1000, :usd)).to eq 1740.8
end
end
describe '#compare_prices' do
it 'compares prices of the same currency' do
expect(compare_prices(10, :usd, 13, :usd)).to be < 0
expect(compare_prices(10, :eur, 10, :eur)).to eq 0
expect(compare_prices(10, :gbp, 8, :gbp)).to be > 0
end
end
И добавяш, например, тест за конвертиране на GBP към BGN. Това става така:
describe '#convert_to_bgn' do
it 'converts usd' do
expect(convert_to_bgn(1000, :usd)).to eq 1740.8
end
it 'converts gbp' do
expect(convert_to_bgn(1000, :gbp)).to eq 2641.5
end
end
describe '#compare_prices' do
it 'compares prices of the same currency' do
expect(compare_prices(10, :usd, 13, :usd)).to be < 0
expect(compare_prices(10, :eur, 10, :eur)).to eq 0
expect(compare_prices(10, :gbp, 8, :gbp)).to be > 0
end
end
Доста е вербозно и шаблонно и вярвам, че ще успееш да добавиш тестове. Ако все пак не успяваш, не му мисли. Ще говорим за тестове по-нататък. Но задължително си пусни примерните тестове!
След като си пуснал примерните тестове и знаеш, че са минали успешно, можем да продължим напред.
Pimp-ване (ака рефакториране)
Да се фокусираме върху convert_to_bgn
на този етап. Имаш няколко проблема и сега ще решим един от тях.
Използваш if/elsif/else
, което е напълно ок. Обаче всичките ти проверки опират до валутата (currency
) и има едно постоянно повторение на код от типа currency == <нещо>
. За да не се повтаряме (DRY), може да използваме switch (предполагам ти е познато от други езици) по валутата. В Ruby това се нарича case
.
Сега си ти
- Потърси как се ползва
case
в Ruby. - Промени кода си така, че да ползваш
case
. - Пусни си примерните тестове.
- Ако минават успешно, качи pimp-натото решение и пиши, че си готов.
- Ако не минават успешно, поправи си кода и се върни на точка 3.
To be continued...
Ако си бърз и отзивчив, ще ти pimp-нем решението до понеделник и междувременно ще научиш как това да се случва на малки и инкрементални стъпки. И освен това, след всяка стъпка ще си сигурен, че не си счупил нещо, понеже знаеш, че тестовете ти минават успешно.
Ако имаш въпроси (каквито и да са), пиши смело тук и не се притеснявай!
Хайде, до скоро!