Веселин обнови решението на 14.11.2011 01:11 (преди около 13 години)
+REPOSITORY = 'http://github.com/veselinn/ruby-retrospective-1'
+
+# Двадесет(почти) неща, които научих.
+#
+# 1. Направих си GitHub account.
+# 2. Повечето методи от Enumerable, приемащи блок, връщат Enuemrator, когато не им е даден
+# блок. Върху този Enumerator мога да извиквам други методи на Enumerable.
+# 3. tap извиква блока със себе си и връща обекта, на който е извикан.
+# 4. Когато monkey patch-вам Array, не е нужно да викам self.map, а мога да извкиам направо
+# map, зашото съм в класа Array.
+# 5. flatten приема аргумент, отговарящ на броя рекурсивни извиквания, които да извърши.
+# flatten(1) е супер за Array#to_hash. Това го видях след като си мислех: "Ех, не би ли било
+# яко сега flatten да приема аргумент.", като по-генералана забележка изглежда, че в ruby
+# има всякакви благинки от този род(същото и за <<(виж по долу)).
+# 6. Да използвам reject, за да филтрирам елементи, който не са nil. Като се замисля мога да
+# ползвам и compact.
+# 7. Да използвам възможно най-простите структури. В Inventory мога да пазя продуктите в
+# масив а не в хеш.
+# 8. Подредбата на кода има значение за разбирането му. Четейки решения на 3та задача
+# виждам, че ако 1во в решението е реализирана една функционалност и след това тя се
+# използва по-нататък в решението разбирам по-лесно програмата отколкото обратното. В случая
+# задачите се предават в един документ. В реалния свят биха били в различни файлове, но
+# въпреки това ме накара да се замисля дори каква да е подредбата на методите в класовете.
+# 9. Бях направил Coupon да се наследява от PercentCoupon и FlatAmountCoupon. Като в Coupon
+# се инициализира само полето name. Вече смятам, че това не е удачно, защото инициализиране
+# на една поле не е достатъчно условие за използването на наследяване. С наследяването ще
+# карам човека, който чете кода да се замисля излишно защо точно съм използвал наследяване.
+# Дали е само заради инизиализаята на name или използвам това, че се наследяват някъде по
+# друг начин.
+# 10. По-добре Cart да знае за Inventory, отколколкото да използва вътрешните структури на
+# Inventory. Така Inventory ще предостави методи за работа с продуктите и купоните.
+# 11. В оригиналното си решение нямах клас за елемент от количката. Така имах логика за
+# принтиране разпръсната между InvoicePrinter и видовете промоции и купони, логиката за
+# смятане на отстъпки и цялата цена също бе разпръсната между няколко класа. Когато направя
+# нов клас за елемент от количката разпръсната логика, която имам в няколко елемента е в
+# новия клас.
+# 12. Да използвам << вметсо push за масиви, защото << работи както си мисля(append-ва) и за
+# String.
+# 13. NullObjectPattern. Ползването му за промоциите и купоните.
+# 14. Смятането на цената на всички продукти в кошницата може да става с
+# @items.map(&:price).inject(&:+). Изглежда доста по-разбираемо от @items.inject('0'.to_d) {
+# |sum, item| sum + item.price }.