Николина обнови решението на 12.10.2014 00:15 (преди около 10 години)
+def series(series_name, number)
+ if series_name == 'summed'
+ return series('fibonacci', number) + series('lucas', number)
+ end
+ get_number_at_position(get_series_array(series_name), number)
+end
+
+def get_number_at_position(array, number)
+ for i in 2...number do
+ array[i] = array[i - 1] + array[i - 2]
+ end
+ array[number - 1]
+end
+
+def get_series_array(series_name)
+ numbers_hash = {
+ fibonacci: [1, 1],
+ lucas: [2, 1]
+ }
+ numbers_hash[series_name.to_sym]
+end
- Опитай се да измислиш малко по-добри имена.
get_
префиксът не дава много допълнителна информация. В идеалния случай в имената не трябва да има намек за имплементацията (aka не би следвало да има думи като recursion, array и т.н.), а за семантиката им (какво значат в контекста на решавания проблем). Еднобуквени именена почти никога не са ok.array
e много общо. Изрази точно какво значи точно този масив в точно тази ситуация чрез името. Не слагай като префикс или суфикс типа на променливите (numbers_hash
). - Възможно е
for
да ти изглежда много интуитивен, ако идваш от други езици. В Ruby обаче се гледа много лошо на код сfor
-ове. Използвай#each
, ако имаш нужда от итериране на нещо само за странични ефекти. - Слагай един празен ред между главните изчисления и връщаната стойност или изключителните случаи и главната логика за по-добра четимост в методите.
- Експериментирай дали с
case
илиif
-else
кодът ти ще изглежда по-ясен. -
(x..y)
и(x...y)
обикновено се използват в комбинация сwhen
или===
. За дадената ситуация се предпочитаx.upto(y)
илиx.upto(y.pred)
. - Прилежно е да си подравняваш някои хомогенни конструкции, когато са употребени на съседни редове. Сред тях са
=
,then
и стойностите на hash-ове. - Също се смята за добра практика да слагаш
,
на последния ред в hash-овете. Изглежда по-консистентно с другите редове и дава възможността да разместваш свободно.