Александър обнови решението на 11.10.2014 13:12 (преди около 10 години)
+class SumOfPreviousTwoRecursiveSeries
+ def initialize(first_element, second_element)
+ @series_holder = Hash.new {
+ |hash,key| hash[key] = hash[key - 1] + hash[key - 2]
+ }
+ @series_holder[1], @series_holder[2] = first_element, second_element
+ end
+ def get_by_index(n)
+ @series_holder[n]
+ end
+end
+
+class Fibonacci
+ def get_by_index(n)
+ SumOfPreviousTwoRecursiveSeries.new(1, 1).get_by_index(n)
+ end
+end
+
+class Lucas
+ def get_by_index(n)
+ SumOfPreviousTwoRecursiveSeries.new(2, 1).get_by_index(n)
+ end
+end
+
+class Summed
+ def get_by_index(n)
+ Fibonacci.new.get_by_index(n) + Lucas.new.get_by_index(n)
+ end
+end
+
+def series(name, n)
+ Object.const_get(name.capitalize).new.get_by_index(n)
+end
Доколко добра практика е ред 32 (получаване на име на клас от стринг) и според вас SumOfPreviousTwoRecursiveSeries трябва ли да се смени? Благодаря. :)
Очевидно си разгледал доста неща в езика, което е супер!
- Малко е спорно дали е overkill да използваш класове толкова грануларно. Поне по мое лично мнение. Ако ще го правиш поне се възползвай от възможността да пазиш състояние. Можеше всяка редица да има инстанционна променлива
SumOfPreviousTwoRecursiveSeries
и да вика нейния#get_by_index
, за да не преизчисляваш два пъти едни и същи стойности. Не че настояваме за оптималност на кода, но така и така имаш гъска, защо да не снася яйца. :) -
Object.const_get(name.capitalize).new.get_by_index(n)
със сигурност обаче е overkill. Като цяло очаквахме просто решение на проста задача, отишъл си доста meta. Използвайif
-elsif
-else
илиcase
. Нарочно сме ви дали по 5 реда на метод. :) -
get_by_index
предполага, че има и някакви други неща, по които може да се "get"-не. В момента си в случая, в който човек би предефинирал[]
, разгледай как става ако още имаш хъс. :) -
SumOfPreviousTwoRecursiveSeries
може би не е най-доброто име. Да, не трябва да жертваш яснота за сметка на брой символи, но ако стане много конкретно и вербозно е време за ново име. В дадената ситуация нещо от сорта наSeriesMemberGenerator
би било good enough. - За предпочитане е в общия случай да присвояваш на два отделни реда. По-лесно се чете. Също за едноредово присвояване Ruby създава скрити масиви.
- Вероятно си го copy - paste-нал, но можеше да смениш със смислени имена
hash
иkey
и да поставиш разстояние след запетайката. - Слагай празни редове между методите.
Още веднъж - много ти се радвам, че си поровил повечко в езика. Определено идеята на решението ти е уникална на фона на другите.