Красимир обнови решението на 29.12.2012 20:14 (преди около 12 години)
+REPOSITORY = 'https://github.com/comco/ruby-retrospective-2'
+
+# Двадесет неща, които научих.
+#
+# 1. За обхождане на последователност от числа, a.upto(b) е по-приятно от (a..b).
+# 2. По-къси редове правят кода по-четим.
+# 3. Писането на код във функционален стил е добро.
+# 4. self е не нужен почти никъде, т.е. там където можем да минем и без него, го разкарваме.
+# 5. Имена като a, e са недопустими имена на променливи.
+# 6. Ако проблемът изглежда достатъчно общ, има голяма вероятност да е решен в стандартната библиотека (с малки изключения). Визирам Hash#group_values, който се решава чрез group_by.
+# 7. Блоковете са по-удобни от ламбди. Ако конструктор трябва да приема като параметър процедура, е по-приятно да е в блок.
+# 8. Ако в базовия клас имаме ламбда, отговаряща за някаква функционалност, добра абстракция е да я опаковаме в метод и да използваме метода вместо ламбдата. Така информацията за това как се извършва действието е капсулирана от наследниците.
+# 9. Struct.new може да е най-лесния начин да се дефинират плоски стари класове (plain old objects), но си има недостатъци - например, ако load-нем два пъти един и същ клас, наследяващ Struct.new, вторият път получаваме грешка.
+# 10. Третирането на не-класови данни (напр. хешове) като обекти с дадени свойства, е code smell.
+# 11. Инициализирането в each има смисъл само за бавни неща като заявки към база данни. В противен случай е хубаво в each да се върши възможно най-малко подготвителна работа.
+# 12. Ако в блок, подаден на метод от по-висок ред (като map), прилагаме единствено определен метод, можем да го подадем направо чрез символ (напр. .any?(&:divides?). Така кодът става по-кратък и по-прост.
+# 13. При наследяване се наследяват и статичните методи. Това позволява при изграждане на йерархия класовете наследници да се регистрират към базов клас, например за да се избегне switch-а във factory-то. За енкапсулация, такава комуникация е по-добре да става с класови методи, а не с класови променливи (наследникът Cos на Expression извиква self.handles_expression(:cos), за да регистрира символа, за който отговаря).
+# 14. Има си метод за намиране на предходното числа - pred.
+# 15. Когато трябва да се дефинират повече класови методи е по-удобно да се ползва class << self.
+# 16. Когато имаме проста if-elseif-else конструкция, кодът става по-четим, ако се използва then.
+# 17. Използвайки /i за регулярни изрази може да ги съкрати и направи по-разбираеми. Вместо [[:alpha:]] минаваме с [a-z].
+# 18. При регулярни изрази като IP адреси, където областта от стойностите е ограничена, е по-удобно да се използва тест, отколкото да се изброяват всички възможни префикси из областта от стойности.
+# 19. Синтаксисът за достъп до именовани групи $~ е удобен за съставяне на условия.
+# 20. Удобен начин за булево оценяване на израз (ако се очаква даден метод да връща точно true или false), е !!expr.