Решение на Четвърта задача от Веселин Николов

Обратно към всички решения

Към профила на Веселин Николов

Резултати

  • 0 точки от тестове
  • 0 бонус точки
  • 0 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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 }.

История (1 версия и 0 коментара)

Веселин обнови решението на 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 }.