Решение на Първа задача от Алекс Николов

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

Към профила на Алекс Николов

Резултати

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

Код

def convert_to_bgn(price, currency)
price_in_bgn = case currency
when :usd then price * 1.7408
when :eur then price * 1.9557
when :gbp then price * 2.6415
else price
end
price_in_bgn.round(2)
end
def compare_prices(price_one, currency_one, price_two, currency_two)
price_one_in_bgn = convert_to_bgn(price_one, currency_one)
price_two_in_bgn = convert_to_bgn(price_two, currency_two)
price_one_in_bgn <=> price_two_in_bgn
end

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

........

Finished in 0.00638 seconds
8 examples, 0 failures

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

Алекс обнови решението на 10.10.2015 13:03 (преди около 9 години)

+def convert_to_bgn(price, currency)
+ if currency == :usd
+ (price * 1.7408).round(2)
+ elsif currency == :eur
+ (price * 1.9557).round(2)
+ elsif currency == :gbp
+ (price * 2.6415).round(2)
+ elsif currency == :bgn
+ price
+ end
+end
+
+def compare_prices(price_one, currency_one, price_two, currency_two)
+ expression_one = convert_to_bgn(price_one, currency_one)
+ expression_two = convert_to_bgn(price_two, currency_two)
+ if expression_one < expression_two
+ -42
+ elsif expression_one > expression_two
+ 42
+ else
+ 0
+ end
+end

Здравей :)

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

  • Помисли дали няма да е по-добре ако използваш case ... when ...? Не сме ви го показвали, така че е напълно пожелателно.
  • В момента имаш доста дублиране на (price * ...).round(2). Подсещам, че всичко е израз и връща резултат - дори if и case. Този резултат може да бъде присвоен на променлива.
  • Последната проверка elsif currency == :bgn е излишна. Защо не просто else? Няма да подаваме невалидни аргументи, пък и в двата случая не се случва нещо очаквано ако се подаде такъв.
  • expression_one и expression_two не са добри имена на променливи. Не дават никаква информация за стойностите си, освен че са някакви изрази. Защо не например price_one_in_bgn и price_two_in_bgn? Всъщност според мен first_price звучи по-добре от price_one, но ще оставя на теб да прецениш. :)
  • if-а за сравнението в compare_prices не ти трябва и ще е много по-прегледно без него. Прочети за оператора <=>.
  • Въпреки, че е забавно да връщаш -42 и 42, предполагам това не е нещо, което би написал наистина ако трябваше да направиш подобна функция в реален проект. Защо тогава да е тук? :) Нямам против да е 42 от функционална гледна точка, но това в случая те спира да напишеш по-добро решение.

Все още имаш възможност да подобриш кода и да ни изпратиш ново решение :)

Алекс обнови решението на 10.10.2015 18:48 (преди около 9 години)

def convert_to_bgn(price, currency)
- if currency == :usd
- (price * 1.7408).round(2)
- elsif currency == :eur
- (price * 1.9557).round(2)
- elsif currency == :gbp
- (price * 2.6415).round(2)
- elsif currency == :bgn
- price
+ result = price
+ case currency
+ when :usd
+ result *= 1.7408
+ when :eur
+ result *= 1.9557
+ when :gbp
+ result *= 2.6415
end
+ result.round(2)
end
def compare_prices(price_one, currency_one, price_two, currency_two)
- expression_one = convert_to_bgn(price_one, currency_one)
- expression_two = convert_to_bgn(price_two, currency_two)
- if expression_one < expression_two
- -42
- elsif expression_one > expression_two
- 42
- else
- 0
- end
+ price_one_in_bgn = convert_to_bgn(price_one, currency_one)
+ price_two_in_bgn = convert_to_bgn(price_two, currency_two)
+ price_one_in_bgn <=> price_two_in_bgn
end

На прав път си, само още малко промени и ще стане супер :)

Имах предвид следното:

action = case state
           when :hungry then :eat
           when :sleepy then :sleep
           else :code_in_ruby
         end

perform(action)

В променливата action ще се запише :eat, :sleep или :code_in_ruby, в зависимост от условието. Така няма да ти се налага предварително да пишеш result = price и после да модифицираш. Можеш в case-а направо да напишеш price * числото, като числото зависи от това в кое условие си.

Между другото result е лошо име за променлива, защото е прекалено общо и не подсказва какво се съдържа в променливата. Защо не нещо от рода на price_in_bgn? :)

Алекс обнови решението на 10.10.2015 21:50 (преди около 9 години)

def convert_to_bgn(price, currency)
- result = price
- case currency
- when :usd
- result *= 1.7408
- when :eur
- result *= 1.9557
- when :gbp
- result *= 2.6415
- end
- result.round(2)
+ price_in_bgn = case currency
+ when :usd then price * 1.7408
+ when :eur then price * 1.9557
+ when :gbp then price * 2.6415
+ else price
+ end
+ price_in_bgn.round(2)
end
def compare_prices(price_one, currency_one, price_two, currency_two)
price_one_in_bgn = convert_to_bgn(price_one, currency_one)
price_two_in_bgn = convert_to_bgn(price_two, currency_two)
price_one_in_bgn <=> price_two_in_bgn
end