Петър обнови решението на 27.01.2016 22:20 (преди над 9 години)
+REPOSITORY = 'https://github.com/pepincho/ruby-retrospective-2015-1'
+
+# 1. Кодът на нашата програма да бъде разбираем и лесно четим. Това постигаме като слагаме добри имена на променливите си, ясно обосноваваме различните логически компоненти в програмата ни и подреждаме кода ни, за да бъде по-лесно четим и по-прегледен.
+
+# 2. Добра практика е когато използваме хешове и ги разписваме на няколко реда
+# да слагаме на последния ред ',', тъй като ако после искаме да добавяме нови
+# неща към него ще бъде по лесно и няма да допуснем грешката да забравим да я сложим.
+
+# 3. Използване на константи вместо hardcode-нати числа в кода ни. По този начин кодът ни е по-лесен за дебъгване и четене след време, когато сме забравили защо сме били сложили въпросното число.
+
+# 4. Използване на "not" вместо "!" при условните конструкции.
+
+# 5. Използване на "(a...b) вместо (a..b - 1)", когато искаме да създадем масив само в интервала [a, b).
+
+# 6. Използване на паралелно присвояне и разпакетирване на променливи, за по-ясен код и намаляване на излишните редове код.
+
+# 7. Разделяне на програмата на по-малки логически компоненти(задачки) и обособяването им в отделни функции, които вършат точно една определена мини задача.
+
+# 8. Използване на операторите "-, +" върху масиви, за да получим нов масив, който е резултат от прилагането на тези операции.
+
+# 9. Използване на "#between?", когато искаме да проверим дали дадено число е в определен интервал.
+
+# 10. Използване на "r#educe()" вместо "#inject()", за по-голяма яснота на кода, тъй като думата "#reduce()" по-ясно описва проблема, който се опитвам да реша, отколкото "#inject()".
+
+# 11. Използване на "Struct.new", за да създадем прости класове, които имат getters и setters, както и полетата на класа. По този начин си намаляваме писане на ненужен код и същевременно е по-четим.
+
+# 12. Използване на метода "#any?()", в чийто блок разписваме допълнителна логичка, чрез коята да проверим дали дадена колекция отговаря на определени условия.
+
+# 13. Изнасяне на повтаряще се логика от кода или парче код, което копираме в отделна функция, за да може да се намали копирането на код и за по-лесно дебъгване и поддържане на кода в бъдеще. По този начин се намалява "spaggetti code".
+
+# 14. Енкапсулиране на кода, т.е даваме на потребителя интерфейсът за който сме се разбрали, без да може да ползва наши вътрешни функции, с които си организираме работата. Използване на private.
+
+# 15. Използване на примерно "#map(&:to_s)" вместо "#map { |x| x.to_s }" върху дадена колекция.
+
+# 16. Използване на "#enum_for", който ще създаде enumerator и всеки път ще вика функцията, която сме му подали, върху обекта.
+
+# 17. Когато дефинираме метод и той може да приема блок е добра практика да слагаме "&block" в сигнатурата му. Например "#each(&block)" вместо "#each". По този начин показваме, че нашият метод може да приема и блокове.
+
+# 18. Използване на "#lazy", който създава lazy enumerator, който ни връща стойност чак тогава, когато е поискина или ни трябва, а не предварително да изгенерира всички стойности.
+
+# 19. Използване на "#loop do" цикъл, когато не знаем колко итерации ще правим. Същата аналогия с "#while(true)". На всяка итерация може да yield-ваме стойности. "#loop do" се използва често, когато създаваме lazy enumerators.
+
+# 20. Използване на "#take" когато искаме да вземем определен брой елементи от енумератора. Ако енумератора е lazy, то трябва да кажем и "#force", за да му кажем, че е нужно да изгенерира нужната бройка елементи.