Георги обнови решението на 14.11.2011 13:51 (преди около 13 години)
+REPOSITORY = 'https://github.com/hristozov/ruby-retrospective-1'
+#1 задача
+#1. do/end вместо фигурни скоби изглежда доста по-добре.
+#2. Enumerable#each_cons за връщане на подсписъци с определена дължина. Така при броенето на подсписъци не се занимавам с индекси.
+#3. Криптичното Enumerable#inject може да бъде заменено с едно просто each в to_hash.
+#4. Криптичното Enumerable#inject може да бъде заменено с map и to_hash в index_by.
+#5. Object#tap спестява усилията при създаване на hash при occurences_count. Мога с последователни tap-ове да правя промени по един обект. Радва ме, защото напомня на #fluent interface.
+#6. При викане на методи на текущата инстанция мога да изпускам "self", колкото и да ме е страх да го правя.
+#
+#2 задача
+#1. Мога да ползвам отделен клас за parse-ване - SongParser.
+#2. Присвояване на няколко елемента при parse-ването - "a,b,c = 1,2,3".
+#3. Мога да ползвам конструктора на Array при филтриране по тагове, за да избегна is_a?/kind_of? проверки.
+#4. Рекурсия вместо if-ове при филтриране по таг.
+#5. Array#all? вместо сложна булева логика при филтриране по таг.
+#6. String#end_with? е доста по-красиво от "str[-1] == blabla".
+#7. Проверката дали дадено поле на песента удовлетворява изисквания може да стане с Object#send.
+#8. Един конструктор на Song с няколко аргумента, за да не повтаряме присвоявания на много места
+#
+#3 задача
+#1. Вместо базов клас + наследници и едно factory, мога да сложа всичките намаления в модул с метод от рода на build.
+#2. Мога да използвам raise ... unless ... за error conditions, защото е една идея по-четимо да проверявам за "нормални" граници на стойностите, отколкото за "грешни".
+#3. attr_reader и сие, и мястото им в енкапсулацията.
+#4. Що е то Null object pattern и как мога да го ползвам за coupon-и и discount-и.
+#5. Lambda-та невинаги е добра идея. В случая с отстъпките само пречи - сметките могат да се правят и директно в метода, който я конструира.
+#6. Логиката по печатането може да бъде отделена в клас - InvoicePrinter.
+#7. При печатането мога да ползвам format string-ове вместо безкрайната мъка с ljust/rjust.
+#8. Мога да ползвам nonzero? за числа.
+#9. По-удобно е продуктите да са достъпни през Product и LineItem.
+#10. По-доброто място за error checking е в конструктора на Product.
+#11. Мога да предефинирам [] на Inventory.
+#12. Мога да ползвам "something or default_value" за да върна нещо по подразбиране, ако something е nil. Удобно в комбинация с null object pattern.
+#13. Сметките по total-а стават много по-лесно с map и inject