Решение на Първа задача от Георги Кожухаров

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

Към профила на Георги Кожухаров

Резултати

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

Код

def fibonacci(n)
if n<=2
1
else
fibonacci(n-1) + fibonacci(n-2)
end
end
def lucas(n)
if n<=2
n==2?1:2
else
lucas(n-1)+lucas(n-2)
end
end
def series(type,n)
temp = {'fibonacci' => lambda{|n| fibonacci n},
'lucas' => lambda {|n| lucas n},
'summed' => lambda{|n| fibonacci(n) + lucas(n)}}
temp[type].call n
end

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

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

Finished in 0.02458 seconds
12 examples, 0 failures

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

Георги обнови решението на 14.10.2014 22:55 (преди около 10 години)

+
+
+def fibonacci(n)
+ if n<=2
+ 1
+ else
+ fibonacci(n-1) + fibonacci(n-2)
+ end
+end
+
+
+def lucas(n)
+ if n<=2
+ n==2?1:2
+ else
+ lucas(n-1)+lucas(n-2)
+ end
+end
+
+
+def series(type,n)
+ temp = {'fibonacci' => lambda{|n| fibonacci n},
+ 'lucas' => lambda {|n| lucas n},
+ 'summed' => lambda{|n| fibonacci(n) + lucas(n)}}
+ temp[type].call n
+end

Малко бележки:

Не спазваш всички конвенции, които ръководството по стил препоръчва, като например:

  • Трябва да има интервали около "операторите" като <=, -, +, ?, ==, : и т.н.
  • Избягвай да използваш тернарния оператор; неговата употреба е уместна само в много малко, редки случаи; обикновено нарушава четимостта и простотата на кода.
  • Празните редове помагат за четимостта, но в кода си имаш няколко излишни – първият ред, десети ред, деветнайсти ред са излишни.
  • Форматирането ти на речника в series е лошо. За да спазиш ограничението за дължина на ред, си го подредил зле. Ето така се подреждат многоредови хешове, в твоя код:

      temp = {
        'fibonacci' => lambda { |n| fibonacci(n) },
        'lucas'     => lambda { |n| lucas(n) },
        'summed'    => lambda { |n| fibonacci(n) + lucas(n) },
      }
    

    Забележи следните неща:

    • Къде съм сложил интервали.
    • Как съм подравнил символа => за четимост.
    • Че съм сложил скоби около аргументите на методите в ламбдата.
    • Че съм сложил запетая след третия елемент в речника, което е практика.

Допълнително, няма нужда да използваш речник и lambda в series. Има как да се напише и по-семпло и ясно. Погледни внимателно този слайд от лекциите, за принципите за добър дизайн на Кент Бек. Принтирай си го и си го закачи до екрана.

Името temp е окей да се ползва сигурно в 0.001% от случаите. Във всички останали случаи, това име е много лоша идея. Полагай усилия да намериш правилните имена на променливите си, на методите си и на класовете си, защото това ти е основният инструмент за писане на ясен, прост и четим код, който лесно да се поддържа и развива впоследствие. Всички променливи са temp. Всички променливи са data. Всяка променлива, чиято стойност е речник, е hash. Това са все лоши имена. Лоши имена са и еднобуквените променливи, с много малки изключения. Тук n е едно изключение. В цикъл, i може да се приеме за изключение. Във всички останали случаи, еднобуковени променливи също са лоша идея.

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