Исмаил обнови решението на 13.10.2016 17:11 (преди около 8 години)
О, уау! Имам картинка точно за случая:
Колкото и добър инструмент да е един танк, ако трябва да убиеш муха, по-добре да използаш вестник.
Харесва ми, че си се запознал с класовете, ламбди, ексепшъни и т.н. Обаче задачата е изключително проста. А щом нещо е направено по-сложно, отколкото е необходимо - със сигурност тази сложност само ще пречи.
Всъщност, бих бил по-склонен да се съглася с ООП решение, ако твоето нямаше следните проблеми:
-
F
,C
иK
се срещат на много места. Нали ООП трябваше да премахва дублиранията? - Ако трябва да добавиш нова единица, ще трябва да минеш през всички класове. Сега ще трябва да добавиш нов клас и да отидеш да едитнеш всички останали. Това не е добър ОО дизайн.
-
CONVERSION_LAMBDAS
е нещото, което трябва да те подсети, че нещо не е наред със структурата ти. Имаш класове и въпреки това ти се налага да сложиш списък с нещата. Задачата е написана като за простото решение с хеш, затова сложното решение има нужда от адаптер към простия интерфейс на функциите. Тоест, това, което преминава от прости данни към класовете. -
Substance
. Защо имаш нужда от клас? С този клас симулираш прост хеш.'water' => Substance.new('water', 0, 100)
=>'water' => {melting_point: 0, boiling_point: 100}
. По-кратко е (няма нужда от клас), спестяваш си дублиране на името на веществото, по-лесно се използва и е по-лесно за разбиране.
Още нещо. ArgumentError
грешките се вписват в ООП решението ти. Няма да се вписват толкова добре в по-простото решение, плюс това сме казали, че няма да подаваме невалидни данни, така че спокойно можеш да изпуснеш тези проверки.
И един съвет. Не се хвърляй веднага да строиш йерархии и да прилагаш практики от Java. Почни от простото решение и шлайфай докато се получи добре.
Предполагам, че си стигнал до това решение като си се опитал да разделиш вложения if, който се получава при преобразуванията. Ако промениш малко логиката ще постигнеш много по-голямо подобрение - можеш просто да смяташ на две стъпки. Трябват ти единствено две функции - from_celsius
и to_celsius
. Тогава винаги минаваш през C. F
-> K
няма да има нужда да специфицираш как се смята, тъй като можеш да направиш F
-> C
-> K
. Така като добавиш нова единица, вместо 6 нови случая ще имаш само 2.
Ех, пак изписах много. Какво мислиш за горните неща? Вероятно не си съгласен с нещо - кажи, нека го обсъдим.