Решение на Четвърта задача от Евгени Кунев

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

Към профила на Евгени Кунев

Резултати

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

Код

REPOSITORY = 'https://github.com/kunev/ruby-retrospective-1'
#Какво научих:
#01.Ако искаме да конструираме hash с inject, има хубав oneliner,
# който ползва Hash#update.
# (to_hash в задача 1)
#
#02.Ако се чудим къде да слагаме/не слагаме скоби, най-добре
# е да се прави като в нормалните *НЕ-LISP* езици.
# (не като съм направил в index_by от задача 1)
#
#03.Около фигурните скоби на блоковете се оставя по един space.(нещо из задача 2)
#
#04.each_cons има съмнителен практически смисъл, но е много полезен
# за реализация на subarray_count. Особено по-полезен от 0.upto(...
# (очевидно subarray_count в задача 1)
#
#05.tap е добър начин да направиш малка промяна на обекта, който връщаш
# без да е нужно да пишеш на няколко реда и да имаш ред, който само връща.
# (occurences_count от задача 1)
#
#06.Ако обект се конструира по hash, по-добре да се обработи hash-а и
# стойностите да се подадат на конструктора на обекта просто като променливи,
# вместо в него да има логика по извличането на данни от hash-а.
# (създаването на Song във задача 2 и Promotion и Coupon в задача 3)
#
#07.`each { |smth| return false if smth.smth } true` е същото като
# `all?` само че по-грозно и неприятно за четене.
# (Song#matches_criteria? в задача 2)
#
#08.Когато името е удобно за ключ в hash, в който се пазят обектите, но е редно
# и да е атрибут на самите обекти, по-добре да заменим hash-а с обикновен масив
# и да избираме обекти с Enumerable#detect(продуктите и купоните в трета задача)
# (продуктите и купоните в Inventory от задача 3)
#
#09.Ако един метод очевидно не може 'да върши едно единствено нещо', разумния начин
# да се подходи е да се използва този метод за 'сглобяване' на резултатите от няколко
# други метода, които правят 'само едно нещо' и ако е необходимо да се повтори
# процедурата дървовидно.
# (много неща в задача 3)
#
#10.Проверката за валидността на данните, с които се конструира обект е най-уместно
# да се намира в конструктора на този обект, за да може нещата да се 'счупят' възможно
# най-рано и все пак в очевидно логичен за счупване контекст.
# (Product в задача 3)
#
#11.Една на пръв поглед странна абстракция, може да ти улесни живота много,
# на възможностите за такива трябва да се обръща повече внимание.
# (CartItem в задача 3)
#
#12.Ако един метод в зависимост то 1-2 параметъра може да прави много различни неща,
# по-добре да се разбие на методи в отделни класове, като изборът според параметри
# става избор на клас, а не избор на предприето действие от метода. Проследява се по-лесно
# (ShoppingCart#total, CartItem#price и прочее в задача 3)
#
#13.Модулите в Ruby дават много удобен механизъм за Factory, особено в комбинация
# с наученото в точка 12.
# (Promotion и Coupon в задача 3)
#
#14.Ако езикът предлага unless, защо ти е да пишеш if not?
# (хвърляне на грешки в задача 3)
#
#15.Динамичността на динамичните езици(тавтологията засилва акцента върху динамиката)
# е лесен за ползване инструмент при създаването на негласни DSL-и и групи
# от """полиморфни""" класове
# (Promotion и Coupon в задача 3)
#
#16.NullObject е полезна абстракция на нямането на нещо, която спестява
# досадни проверки на много места из кода.
# (NilPromotion и NilCoupon в задача 3)
#
#17.Ако ти трябва една малка функционалност от някоя библиотека
# напиши/открадни си я с чиста съвест от там, вместо да разчиташ,
# че ще е достъпна там където ти трябва.
# (ref: нулевият брой точки, които ще имам на трета задача)
# (ordinalize в трета задача вместо require на active_support)
#
#18.Когато си направиш метод, който да проверява стойността на една променлива
# имай тест, който те подсигурява, че не заобикаляш тази проверка
# (CartItem#add в задача 3)
#
#19.Когато трябва да се генерира дълъг стринг, който се сглобява на части,
# по-красиво и лесно е да се ползва буфер, в който да се записват последователно
# частите от крайния резултат, от колкото да се полагат усилия по някакъв начин
# всичко да се напише ин интерполира в стринга наведнъж.
# (логиката по печатането на касова бележка в задача 3)
#
#20.Трябва да се отдава повече време за анализ и откриване на "повтарящ се" код,
# който да може да се абстрахира в общи методи и за разбиране на местата, където
# в малко код се наблъсква много логика, която става трудна за прослед

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

Евгени обнови решението на 14.11.2011 00:43 (преди около 13 години)

+REPOSITORY = 'https://github.com/kunev/ruby-retrospective-1'
+
+#Какво научих:
+#01.Ако искаме да конструираме hash с inject, има хубав oneliner,
+# който ползва Hash#update.
+# (to_hash в задача 1)
+#
+#02.Ако се чудим къде да слагаме/не слагаме скоби, най-добре
+# е да се прави като в нормалните *НЕ-LISP* езици.
+# (не като съм направил в index_by от задача 1)
+#
+#03.Около фигурните скоби на блоковете се оставя по един space.(нещо из задача 2)
+#
+#04.each_cons има съмнителен практически смисъл, но е много полезен
+# за реализация на subarray_count. Особено по-полезен от 0.upto(...
+# (очевидно subarray_count в задача 1)
+#
+#05.tap е добър начин да направиш малка промяна на обекта, който връщаш
+# без да е нужно да пишеш на няколко реда и да имаш ред, който само връща.
+# (occurences_count от задача 1)
+#
+#06.Ако обект се конструира по hash, по-добре да се обработи hash-а и
+# стойностите да се подадат на конструктора на обекта просто като променливи,
+# вместо в него да има логика по извличането на данни от hash-а.
+# (създаването на Song във задача 2 и Promotion и Coupon в задача 3)
+#
+#07.`each { |smth| return false if smth.smth } true` е същото като
+# `all?` само че по-грозно и неприятно за четене.
+# (Song#matches_criteria? в задача 2)
+#
+#08.Когато името е удобно за ключ в hash, в който се пазят обектите, но е редно
+# и да е атрибут на самите обекти, по-добре да заменим hash-а с обикновен масив
+# и да избираме обекти с Enumerable#detect(продуктите и купоните в трета задача)
+# (продуктите и купоните в Inventory от задача 3)
+#
+#09.Ако един метод очевидно не може 'да върши едно единствено нещо', разумния начин
+# да се подходи е да се използва този метод за 'сглобяване' на резултатите от няколко
+# други метода, които правят 'само едно нещо' и ако е необходимо да се повтори
+# процедурата дървовидно.
+# (много неща в задача 3)
+#
+#10.Проверката за валидността на данните, с които се конструира обект е най-уместно
+# да се намира в конструктора на този обект, за да може нещата да се 'счупят' възможно
+# най-рано и все пак в очевидно логичен за счупване контекст.
+# (Product в задача 3)
+#
+#11.Една на пръв поглед странна абстракция, може да ти улесни живота много,
+# на възможностите за такива трябва да се обръща повече внимание.
+# (CartItem в задача 3)
+#
+#12.Ако един метод в зависимост то 1-2 параметъра може да прави много различни неща,
+# по-добре да се разбие на методи в отделни класове, като изборът според параметри
+# става избор на клас, а не избор на предприето действие от метода. Проследява се по-лесно
+# (ShoppingCart#total, CartItem#price и прочее в задача 3)
+#
+#13.Модулите в Ruby дават много удобен механизъм за Factory, особено в комбинация
+# с наученото в точка 12.
+# (Promotion и Coupon в задача 3)
+#
+#14.Ако езикът предлага unless, защо ти е да пишеш if not?
+# (хвърляне на грешки в задача 3)
+#
+#15.Динамичността на динамичните езици(тавтологията засилва акцента върху динамиката)
+# е лесен за ползване инструмент при създаването на негласни DSL-и и групи
+# от """полиморфни""" класове
+# (Promotion и Coupon в задача 3)
+#
+#16.NullObject е полезна абстракция на нямането на нещо, която спестява
+# досадни проверки на много места из кода.
+# (NilPromotion и NilCoupon в задача 3)
+#
+#17.Ако ти трябва една малка функционалност от някоя библиотека
+# напиши/открадни си я с чиста съвест от там, вместо да разчиташ,
+# че ще е достъпна там където ти трябва.
+# (ref: нулевият брой точки, които ще имам на трета задача)
+# (ordinalize в трета задача вместо require на active_support)
+#
+#18.Когато си направиш метод, който да проверява стойността на една променлива
+# имай тест, който те подсигурява, че не заобикаляш тази проверка
+# (CartItem#add в задача 3)
+#
+#19.Когато трябва да се генерира дълъг стринг, който се сглобява на части,
+# по-красиво и лесно е да се ползва буфер, в който да се записват последователно
+# частите от крайния резултат, от колкото да се полагат усилия по някакъв начин
+# всичко да се напише ин интерполира в стринга наведнъж.
+# (логиката по печатането на касова бележка в задача 3)
+#
+#20.Трябва да се отдава повече време за анализ и откриване на "повтарящ се" код,
+# който да може да се абстрахира в общи методи и за разбиране на местата, където
+# в малко код се наблъсква много логика, която става трудна за прослед