Решение на Първа задача от Бойко Караджов

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

Към профила на Бойко Караджов

Резултати

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

Код

def convert_to_bgn(price, currency)
rates = {usd: 1.7408, eur: 1.9557, gbp: 2.6415, bgn: 1}
converted_price = rates[currency] * price
converted_price.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
first_converted_price = convert_to_bgn(first_price, first_currency)
second_converted_price = convert_to_bgn(second_price, second_currency)
first_converted_price - second_converted_price
end

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

........

Finished in 0.00765 seconds
8 examples, 0 failures

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

Бойко обнови решението на 08.10.2015 02:00 (преди над 8 години)

+def convert_to_bgn(volume, symbol)
+ rates = {:usd => 1.7408, :eur => 1.9557, :gbp => 2.6415, :bgn => 1}
+ converted_value = rates[symbol] * volume
+ return converted_value.round(2)
+end
+
+def compare_prices(first_volume, first_symbol, second_volume, second_symbol)
+ if first_symbol == second_symbol
+ return first_volume - second_volume
+ else
+ first_converted_value = convert_to_bgn(first_volume, first_symbol)
+ second_converted_value = convert_to_bgn(second_volume, second_symbol)
+ return first_converted_value - second_converted_value
+ end
+end

Здравей :)

Решението ти е добро, но имам някои коментарчета:

  • Погледни слайдовете за функции от лекцията или потърси return в style guide-a.
  • Какво лошо може да се случи ако валутите са същите? Смятам, че няма нужда от тази проверка.
  • Има по-добър (и по-кратък) начин да направиш хеш със символи за ключове: {usd: 1.7308, ...}
  • Не съм сигурен, че volume и symbol са най-подходящите термини за цена и валута. Опитай да се сетиш за по-добри :)

Здравей,

Благодаря за коментара!

  • Значи за в бъдеще ще гледам да не пише return където няма нужда от него (предполагам, че това имаше предвид);
  • Реших, че ще е добре да се избегне конвертирането. Явно по-елегантния начин е за предпочитане. Ще го имам в предвид;
  • Ще гледам да го науча;
  • Това са термини от валутната търговия. Пример от API за работа с Forex: MQL4 OrderSend . Може и да бъркам и в този контекст да не са адекватни, но това ми беше идеята като ги съчинявах.

Поздрави,

Бойко

Бойко обнови решението на 09.10.2015 00:21 (преди над 8 години)

-def convert_to_bgn(volume, symbol)
- rates = {:usd => 1.7408, :eur => 1.9557, :gbp => 2.6415, :bgn => 1}
- converted_value = rates[symbol] * volume
- return converted_value.round(2)
+def convert_to_bgn(price, currency)
+ rates = {usd: 1.7408, eur: 1.9557, gbp: 2.6415, bgn: 1}
+ converted_price = rates[currency] * price
+ converted_price.round(2)
end
-def compare_prices(first_volume, first_symbol, second_volume, second_symbol)
- if first_symbol == second_symbol
- return first_volume - second_volume
- else
- first_converted_value = convert_to_bgn(first_volume, first_symbol)
- second_converted_value = convert_to_bgn(second_volume, second_symbol)
- return first_converted_value - second_converted_value
- end
+def compare_prices(first_price, first_currency, second_price, second_currency)
+ first_converted_price = convert_to_bgn(first_price, first_currency)
+ second_converted_price = convert_to_bgn(second_price, second_currency)
+ first_converted_price - second_converted_price
end

Бойко обнови решението на 09.10.2015 00:22 (преди над 8 години)

def convert_to_bgn(price, currency)
rates = {usd: 1.7408, eur: 1.9557, gbp: 2.6415, bgn: 1}
converted_price = rates[currency] * price
converted_price.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
- first_converted_price = convert_to_bgn(first_price, first_currency)
- second_converted_price = convert_to_bgn(second_price, second_currency)
- first_converted_price - second_converted_price
+ first_converted_price = convert_to_bgn(first_price, first_currency)
+ second_converted_price = convert_to_bgn(second_price, second_currency)
+ first_converted_price - second_converted_price
end
  • Да, излишния return имах предвид.
  • Проблемът на тези микрооптимизации е, че не получаваш почти никакво ускорение за сметка на усложняване на кода и на поддръжката му. Хубаво е да се придържаме към най-ясният начин за решение на даден проблем и, когато може, да има един логически път за всички данни.

Не успях да намеря описана терминология конкретно за volume и symbol извън документацията на това API. Ако единственото място, където се използва е там или в API-та, аз не бих му придал статут на термин. Възможно е и просто да не съм търсил достатъчно :)

Имената на променливи трябва ясно да описват съдържанието им. Но всеки има различно разбиране за "ясно".

Ако ме накараш да дефинирам "ясно описание на съдържанието" бих ти казал следното:

  • Трябва да описва смисъла на съдържанието, не типа. Например currencies или exchange_rates вместо hash, users вместо array или users_array и т.н. В някои случаи бих сложил и типа в името - например когато има две представяния на едно и също нещо и трябва да се преобразуват. По този критерий явно сме съгласни.
  • Използваните термини трябва да са максимално прости и от сферата, в която се използва кода.
  • Трябва да могат да бъдат разбрани лесно от хората, (евентуално) четящи кода.

В този случай за volume и symbol аргументите ми са следните:

  • Сферата, в която се намира кодът в момента не е валутната търговия, а "домашно използване". Ясно е, че този код няма място в какъвто и да е банков софтуер, като минимум заради закръглянията и използването на floating-point аритметика. Дори volume и symbol да са ясни термини във валутната търговия, тук аз бих използвал по-добре известни такива като price и currency. Още повече, че името на втората функция използва price.
  • Ако пишех софтуер за Forex и volume и symbol са термини - бих използвал тях. Тогава обаче всички, четящи кода ще ги знаят и ще са ясни. Хората там няма да се чудят защо при преобразуване на валути се използва обем.
  • symbol в кода има нежеланото свойство да означава три неща - типът Symbol, терминът от Forex и символ в контекста на низ. В случая много хора, които не са използвали Forex API, биха се замислили дали този аргумент трябва да приеме :usd или един символ - '$'.

Това, разбира се, е моето мнение и целта ми е да го дискутираме. Не аз да ти кажа "направи ги така" и ти, въпреки мнението си, да се съгласиш. Винаги можеш да оставиш кода така, ако прецениш. :) Няма да окаже влияние на точките за задачата.

Благодаря за ичерпателният отговор! Съгласен съм. Стана ми ясно, че само аз си ги разбирам така както ги бях написал и за това ъпдейтнах. Така както го каза напълно разбирам и как в този контекст имената бяха подвеждащи.

Уверявам те, че няма да ъпдейтвам без да разбера защо и промяната ми си е знак на съгласие и разбиране :) .