Дарин обнови решението на 16.01.2017 16:15 (преди почти 8 години)
+REPOSITORY = 'https://github.com/alonso95/ruby-retrospective-2016'
+
+# Двадесет неща, които научих.
+#
+# 1. По-добре да бъдат използвани символи за ключове, отколкото String-ове, т.к.
+# те се интернират, т.е. при многократно извикване с аргумент ключът-символ се
+# създава само един обект.
+#
+# 2. Използването на константи, пазещи информация за обекти, които биват
+# използвани за еднакви цели е по-ефективно (в случая на първа задача - числата
+# използвани във формулите за конвертиране).
+#
+# 3. Употребата на Hash (вместо масив от някакви числа), като носител на
+# информация прави кода по-четим и ясен.
+#
+# 4. Типът Rational е ненужна синтактична захар.
+#
+# 5. Поставяйки запетая, след последният елемент на хеш, спомага за по-лесна
+# промяна в бъдеще (добавяне на елементи).
+#
+# 6. Може да извикаме метод върху резултатът от изпълнението на do/end блок без
+# да го присвояваме на отделна променлива, например:
+# do
+# some_code
+# end.to_a
+#
+# 7. self-ът може и е добра практика да бъде изпуснат, където е ненужен.
+#
+# 8. Не е нужно да присвояваме нещо на променлива (например self-а), като след
+# деклариране й дори не я използваме.
+#
+# 9. 'do_something if condition'
+# е много по-красиво и разбираемо от
+# 'if condition
+# do_something'
+# Kогато го четеш, все едно четеш логически свързано изречение/текст, а не
+# Руби код.
+#
+# 10. Можем да създаваме Enumerator-и (като викаме без блок някои методи на
+# Enumerable) и да ги навързваме, което е доста готино и лесно четимо като код.
+# (във втора задача - аrr.map.with_index { |x, i| [i, x]).
+#
+# 11. Добре е да пишем immutable код. Важно е да използваме #dup и #clone, когато
+# не искаме даден метод да променя обект. #clone е по-добрият избор, т.к. копира
+# и singleton методите на обекта и също така го freeze-ва копието,
+# ако оригиналът е бил freeze-нат.
+#
+# 12. Научих, че функции има различни имплементации на функции, като #select,
+# #reject и т.н.
+#
+# 13. Можем да запазим резултат от блок, чиято дефиниция не знаем, в променлива и
+# след това да използваме този резултат (@arguments[argument_name] = block).
+#
+# 14. Можем да пазим в #initilize някакви default-ни стойности на инстанционни
+# променливи, които пазят информация необходима за self-a:
+# @arguments = {}
+# @options = []
+# @parameter_options = []
+#
+# 15. Не трябва да тестваме private методи.
+#
+# 16. Препоръчително е да тестваме #initilize само, когато той съдържа някаква
+# логика.
+#
+# 17. Трябва да пишем възможно най-смислените тестове и да не правим излишни
+# такива. Често се случва един тест да бъде препокрит от друг и единият става
+# абсолютно излишен и безсмислен:
+# expect { Version.new('1.2') }.to_not raise_error
+# expect { Version.new('.1.2') }
+# .to raise_error(ArgumentError, /Invalid version string '.1.2'/)
+# Първият е излишен!
+#
+# 18. Не трябва да се притесняваме от повторения при тестване (в рамките на
+# нормалното), стига да покрива всички гранични ситуации, при които кода
+# ще гръмне.
+#
+# 19. Метапрограмирането е силен инструмент, но и труден. Трябва да се избягва!
+#
+# 20. Всеки обект в руби си има class и всеки клас си има class.