Решение на Първа задача от Георги Стефанов

Обратно към всички решения

Към профила на Георги Стефанов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

def convert_to_bgn(price, currency)
price = case currency
when :usd then price * 1.7408
when :eur then price * 1.9557
when :gbp then price * 2.6415
else price
end
price.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
first_price_bgn = convert_to_bgn(first_price, first_currency)
second_price_bgn = convert_to_bgn(second_price, second_currency)
first_price_bgn <=> second_price_bgn
end

Лог от изпълнението

........

Finished in 0.00712 seconds
8 examples, 0 failures

История (4 версии и 4 коментара)

Георги обнови решението на 10.10.2015 12:02 (преди над 8 години)

+def convert_to_bgn(price, currency)
+
+ price = price * 1.0000 if currency == :bgn
+ price = price * 1.7408 if currency == :usd
+ price = price * 1.9557 if currency == :eur
+ price = price * 2.6415 if currency == :gbp
+
+ price = price.round(2)
+
+end
+
+def compare_prices(price_1, currency_1, price_2, currency_2)
+
+ convert_to_bgn(price_1, currency_1) <=> convert_to_bgn(price_2,currency_2)
+
+end

Георги обнови решението на 10.10.2015 12:03 (преди над 8 години)

+
def convert_to_bgn(price, currency)
price = price * 1.0000 if currency == :bgn
price = price * 1.7408 if currency == :usd
price = price * 1.9557 if currency == :eur
price = price * 2.6415 if currency == :gbp
price = price.round(2)
end
def compare_prices(price_1, currency_1, price_2, currency_2)
- convert_to_bgn(price_1, currency_1) <=> convert_to_bgn(price_2,currency_2)
+ convert_to_bgn(price_1, currency_1) <=> convert_to_bgn(price_2, currency_2)
end

Здравей :)

Няколко бързи коментара:

  • Празните редове в началото и края на методите са излишни. Не помагат за прегледността на кода, а само го разширяват.
  • Помисли дали няма да е по-добре ако използваш case ... when ... или if ... elsif ... else .... Също така в момента имаш доста дублиране на price =. Подсещам, че всичко е израз и връща резултат - дори if и case. Краткото действие if условие обикновено се използва за единични проверки, когато има граничен случай за нещо. Не е особено прегледно за повече от една проверка от един вид.
  • Последното присвояване price = price.round(2) е излишно. Променливата price не я използваш след това. Защо не просто price.round(2)?
  • Умножението с 1.0000 също е излишно. Защо ти е изобщо този ред?
  • first_price и second_price според мен звучат по-добре от price_1 и price_2. Какво мислиш за това?

Можеш да предадеш колкото искаш решения, като ние ще оценяваме само последното. Все още имаш възможност да го подобриш :)

Георги обнови решението на 10.10.2015 19:02 (преди над 8 години)

-
def convert_to_bgn(price, currency)
+ price = case currency
+ when :usd then price * 1.7408
+ when :eur then price * 1.9557
+ when :gbp then price * 2.6415
+ else price
+ end
- price = price * 1.0000 if currency == :bgn
- price = price * 1.7408 if currency == :usd
- price = price * 1.9557 if currency == :eur
- price = price * 2.6415 if currency == :gbp
-
- price = price.round(2)
-
+ price.round(2)
end
def compare_prices(price_1, currency_1, price_2, currency_2)
-
convert_to_bgn(price_1, currency_1) <=> convert_to_bgn(price_2, currency_2)
-
end

Благодаря за важните забележки!

Смених if-а с case, като поправих и дублирането на "price =". Бял поставил случай, в който сме въвели bgn, но не се сетих, че всъщност няма проблем за метода ако няма дефинирано действие за тази стойност на параметъра. Сега с case съм го сложил на else - това е случаят, в който се въвежда bgn, защото иначе case ще върне nil, нали така?

Относно имената на параметрите в compare_prices - съгласен съм, че е доста по-четливо когато се ползва "first" и "second", но 13-ти ред става повече от 80 символа: мога да го пренеса, но не знам дали стилистично е по-добре.

Естествено ще помисля малко повече върху задачата.

Супер стана :)

Сега с case съм го сложил на else - това е случаят, в който се въвежда bgn, защото иначе case ще върне nil, нали така?

В момента с else ще върне просто цената, каквато е била ако е подадена невалидна валута. Иначе ако беше с проверка и без else щеше да върне nil, да. И двата варианта са ОК в случая, защото не сме дефинирали конкретно поведение за този случай => ползваме това, което е най-лесно и прегледно за решението.

Относно дължината на реда - може да го пренесеш

convert_to_bgn(price_1, currency_1) <=>
  convert_to_bgn(price_2, currency_2)

или (по-добре) - да си запазиш двата резултата в променливи и да ги сравниш след това :)

Георги обнови решението на 10.10.2015 22:12 (преди над 8 години)

+
def convert_to_bgn(price, currency)
price = case currency
when :usd then price * 1.7408
when :eur then price * 1.9557
when :gbp then price * 2.6415
else price
end
price.round(2)
end
-def compare_prices(price_1, currency_1, price_2, currency_2)
- convert_to_bgn(price_1, currency_1) <=> convert_to_bgn(price_2, currency_2)
+def compare_prices(first_price, first_currency, second_price, second_currency)
+ first_price_bgn = convert_to_bgn(first_price, first_currency)
+ second_price_bgn = convert_to_bgn(second_price, second_currency)
+ first_price_bgn <=> second_price_bgn
end