Никола обнови решението на 11.10.2016 18:55 (преди около 8 години)
Хм, как да го кажа... Задачата ти е да убиеш муха. С това решение си убил мухата. Покрай нея си разрушил стената, бутнал си си къщата... Всъщност, градът ти вече не съществува... Защото вместо да вземеш вестник си убил мухата с водородна бомба.
Метапрограмирането си има своите приложения, но тази задача определено не е едно от тях :) Целта на задачата е да я решиш по възможно най-чистия и ясен начин (подхождащ на задачата), не да покажеш сложни трикове. И такива задачи ще има, не се притеснявай. :)
Окей, имам няколко въпроса преди да пиша друго решение.
- boiling_points, melting_points vs константи, които правят същото, или просто да ги преименувам на default_boiling_points...? От SCREAMING CASE ме болят очите.
- Хвърлям някакъв ерор, ако не очаквам такъв юнит, в момента това не ме кефи особено, някакви други предположения?
- Понеже не ме кефи идеята да имам if-else statements, (най-много заради факта, че има още много други мерни единици за температура), си мислех какъв би бил добър начин да се напише това, с цел лесно да може да го разширявам за в бъдеще? Например да имам Temperatures#all, който връща масив от класове от температури (Celsius, Kelvin ...), които да наследяват от Temperature, така че да е нужно да имплементират някакъв даден метод, с който да си ги мачвам по буква? И след това да им викам #new.
Разбира се, мога да го изхакя на бързо на 20 реда с много ифове, но това не е забавно. Мерси предварително за фийдбака :)
-
От SCREAMING CASE ме болят очите.
- с това се свиква, освен това константите все пак трябва да се различават по нещо. А този случай е идеален за константи. - Не прави нищо при липса на unit. Нормалната практика в Ruby е да не правиш подобни проверки - ако не ти е подадено нещо смислено, човекът, който ти използва функцията ще разбере за това като гръмне. Или, ако трябва да се проверява - това ще бъде направено преди да ти се извика функцията - като валидация в потребителския интерфейс.
Освен това, тук сме казали изрично, че няма да подаваме невалидни данни. - Хеш с ламбда функции. Иначе if/elsif или един case/when за тази задача е напълно нормално нещо. Направи сметката на две стъпки - две конвертирания вместо едно директно. Така ще имаш два case-а с по 3 случая, не вложени if-ове.
Ако искаш да поддържаш нова мерна единица просто добавяш 2 реда - от нея в C и обратно. Ако го оставиш така ще трябва да добавиш N нови функции - колкото мерни единици е имало преди * 2.
Много сложно го мислиш - реши проблема просто и ако има нужда - тогава усложнявай и обобщавай.