Решение на Първа задача - температура и химични елементи от Владимир Алексиев

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

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

Резултати

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

Код

def convert_between_temperature_units(value, from, to)
mapping = {
'CC' => ->(val) { val },
'FF' => ->(val) { val },
'KK' => ->(val) { val },
'CF' => ->(val) { (val * 1.8) + 32 },
'CK' => ->(val) { val + 273.15 },
'FK' => ->(val) { (val + 459.67) / 1.8 },
'FC' => ->(val) { (val - 32) / 1.8 },
'KF' => ->(val) { (val * 1.8) - 459.67 },
'KC' => ->(val) { val - 273.15 }
}
mapping[from + to].call(value)

Бях тръгнал да го пиша като всичко минава през Целзий, но ми заприлича доста на черво и трябваше да пиша тестове, за което нямах време. Освен това пише че няма да подавате невалидни стойности за мерки, така че подходих straightforward.

end
def get_temperature(element, state = :melting)
mapping = {

Сама по себе си тази функция държи единствено този хеш и mapping ми се вижда ОК като име. Глобалните променливи са лоши а да пиша модул с една константа или Struct за това ми се видя overkill. Не обичам не namespace-нати константи. Като цяло тази функция съществува за да не стои хеш-а извън нея.

water: { melting: 0, boiling: 100 },
ethanol: { melting: -114, boiling: 78.37 },
gold: { melting: 1_064, boiling: 2_700 },
silver: { melting: 961.8, boiling: 2_162 },
copper: { melting: 1_085, boiling: 2_567 }
}
mapping[element.to_sym][state]

Не си заслужава ключовете на хеша да са символи ако ще правиш to_sym навсякъде. Подаваме стринг - логично е да пазиш и самите имена на елементи като стрингове. Не печелиш нищо от това, че са хешове.

end
def melting_point_of_substance(element, unit)
convert_between_temperature_units(get_temperature(element), 'C', unit)
end
def boiling_point_of_substance(element, unit)
convert_between_temperature_units(get_temperature(element, :boiling), 'C', unit)

Чакай сега. Идеята не е аз да ти кажа направи това, ти да си помислиш това е безсмислено и да го промениш само, защото съм го коментирал.

Идеята е да стане дискусия, в която да стигнем до по-добър вариант на кода и да си извадим някакви изводи, които да са полезни по-натам.

end

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

.................

Finished in 0.00901 seconds
17 examples, 0 failures

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

Владимир обнови решението на 11.10.2016 22:40 (преди около 8 години)

+def convert_between_temperature_units(value, from, to)
+ mapping = {
+ 'CC' => ->(val) { val },
+ 'FF' => ->(val) { val },
+ 'KK' => ->(val) { val },
+ 'CF' => ->(val) { (val * 1.8) + 32 },
+ 'CK' => ->(val) { val + 273.15 },
+ 'FK' => ->(val) { (val + 459.67) / 1.8 },
+ 'FC' => ->(val) { (val - 32) / 1.8 },
+ 'KF' => ->(val) { (val * 1.8) - 459.67 },
+ 'KC' => ->(val) { val - 273.15 }
+ }
+ mapping[from + to].call(value)

Бях тръгнал да го пиша като всичко минава през Целзий, но ми заприлича доста на черво и трябваше да пиша тестове, за което нямах време. Освен това пише че няма да подавате невалидни стойности за мерки, така че подходих straightforward.

+end
+
+def get_temperature(element, state = :melting)
+ mapping = {

Сама по себе си тази функция държи единствено този хеш и mapping ми се вижда ОК като име. Глобалните променливи са лоши а да пиша модул с една константа или Struct за това ми се видя overkill. Не обичам не namespace-нати константи. Като цяло тази функция съществува за да не стои хеш-а извън нея.

+ water: { melting: 0, boiling: 100 },
+ ethanol: { melting: -114, boiling: 78.37 },
+ gold: { melting: 1_064, boiling: 2_700 },
+ silver: { melting: 961.8, boiling: 2_162 },
+ copper: { melting: 1_085, boiling: 2_567 }
+ }
+ mapping[element.to_sym][state]

Не си заслужава ключовете на хеша да са символи ако ще правиш to_sym навсякъде. Подаваме стринг - логично е да пазиш и самите имена на елементи като стрингове. Не печелиш нищо от това, че са хешове.

+end
+
+def melting_point_of_substance(element, unit)
+ convert_between_temperature_units(get_temperature(element), 'C', unit)
+end
+
+def boiling_point_of_substance(element, unit)
+ convert_between_temperature_units(get_temperature(element, :boiling), 'C', unit)

Чакай сега. Идеята не е аз да ти кажа направи това, ти да си помислиш това е безсмислено и да го промениш само, защото съм го коментирал.

Идеята е да стане дискусия, в която да стигнем до по-добър вариант на кода и да си извадим някакви изводи, които да са полезни по-натам.

+end