Кузман обнови решението на 27.01.2016 16:22 (преди около 9 години)
+REPOSITORY = 'https://github.com/Kuz-man/ruby-retrospective-2015-1'
+
+# Двадесет неща, които научих.
+#
+# 1. (possible_food = x_array.product(y_array) - food - snake).sample
+# Няма практическа полза от ненужни присвоявания, sample така или
+# иначе връща една от стойностите на масива, независимо дали е
+# присвоен на променлива или не.
+# 2. snake.include? вместо snake.member?
+# Доста по-приятно в случая е за четене с include?, вместо с member?,
+# а Руби код трябва да е четим, нали?
+# 3. #def out_of_bounds?(snake, dimensions)
+# Спазвайки разни single responsibility принципи, създаване на отделен
+# метод е подходящо решение, понеже #obstacle_ahead? не трябва да е
+# отговорен за това дали змията ще е извън полето.
+# 4. snake.map { |i| moved_snake << i }
+# От гледна точка на езикови средства, map няма смисъл да се ползва
+# вместо each.
+# 5. moved_snake = snake.dup
+# Вместо да се използва map или each за да се „пълни“ масив с
+# елементите на друг масив, доста по-практично е да се направи плитко
+# копие, което, на практика, прави същото.
+# 6. rat_cage.reduce(:+) <= nth_fibonacci
+# Използване на #reduce вместо да се създава допълнителна променлива,
+# която да пази сума.
+# 7. #.each { |item| all_rats << item } е еквивалентно на all_rats =
+# RationalSequence.new.to_a
+# Вместо да се „пълни“ масив с елементи един по един, използвайки
+# #each, може да се създаде нова поредица от елементи, която да се
+# „масивизира“ с to_a
+# 8. Понякога изглежда по-подредено и приятно за четене да се използва
+# do - end, вместо да се пише на един ред с { }.
+# 9. Вместо да се извиква инстанционна променлива с @, може да се
+# ползва attr_reader.
+# 10. FibonacciSequence.new(count).to_a.last вместо
+# nth_fibonacci = FibonacciSequence.new(count).to_a -
+# FibonacciSequence.new(count - 1).to_a)[0]
+# Вместо да се вади разлика от два идентични масива(различаващи се с
+# един елемент), може просто да се вземе нужният елемент от масива,
+# който го съдържа. Така или иначе този елемент не се съдържа във
+# втория масив, а е последен на първия.
+# 11 array#first по-приятно за четене от array[0], въпреки че заема
+# повече символи.
+# 12. all_primes.each_slice(2).map do |numerator, denominator|
+# Rational(numerator, denominator || 1 end.reduce(:+)
+# || може да се използва, когато нещо е nil или false. В случая,
+# когато липсва втора стойност в each_slice.
+# 13. RationalSequence.new(count * count).take_while do |rat| rat_cage
+# << rat; rat_cage.reduce(:+) <= nth_fibonacci
+# Няма нужда да се създава променлива да запазване на
+# RationalSequence, може директно да се работи с него.
+# 14. Методът capitalize на string не работи с fixnum, но fixnum може
+# да бъде кастнат към string и да бъде капитализиран. Реално научих,
+# че можем да кастваме вместо да правим проверки за тип и да имаме
+# различен output на база на тип.
+# 15. Методите могат да бъдат изкарани в модул. По този начин
+# класовете стават по-лесни за четене и разбиране.
+# 16. Клас може да бъде създаден като наследник на Struct. Така няма
+# нужда от initialize, което е доста приятно при минималистични
+# класове.
+# 17. return true if not_trump.any? do |set| forty?(set) end
+# Вместо да се повтаря с малки разлики един и същ метод, може да се
+# преизползва вече създаден такъв.
+# 18. Между методи, include-и и подобни трябва да се оставя
+# разстояние, иначе е трудно за четене.
+# 19. temp_array.flatten & temp_array.flatten
+# Вместо да се създават всички възможни кобинации от рационални числа,
+# включително такива, които вече са създадени (6/2 == 3/1), много по
+# добре е да се провери дали НОД на две числа е 1, което ще изключи
+# повтаряне и нужда от премахване на дубликати.
+# 20. Винаги ще има още какво да се доизкусури… и времето никога не
+# стига.