Решение на Пета задача от Калоян Калудов

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

Към профила на Калоян Калудов

Резултати

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

Код

REPOSITORY = 'https://github.com/KaloyanKaludov/ruby-retrospective-3'
#01 Операторите свързани с присвояване не могат да се разглеждат като символи и да се извикват чрез send.
#02 unshift работи като pop_front.
#03 fetch може да връща стойност по подрабиране.
#04 Съществува функция between? за проверка дали число е между други две и интервалът е включващ.
#05 При дефиниране на функции с define_method е полезно на блока да се подаде splat променлива ако искаме
# да имаме променлив брой аргументи.
#06 Много е грозно да се опитваш да разделяш логически свързани неща просто за да имаш няколко, но по-къси
# метода. ЛОГИКАТА на функцията трябва да е кратка и ясна. Дължината на функцията в брой редове, няма
# никакво значение, ако е лесна за разбиране.
#07 define_method се използва за дефинирането на много на брой функции с много сходна функционалност.
# Тази практика разбира се разчита на факта, че генерираните функции никога няма да се налага да се
# променят или усложняват. (Което много рядко е така)
#08 Style Guide-а препоръчва 0.upto(n) вместо (0..n) и 0.upto(n - 1) вместо (0...n).
#09 Struct може да се използва за бързи и прости структури от данни.
#10 Думата evaluator не е част от английския език.
#11 За да създадеш копие на прост обект може да използваш dup, но трябва да помниш, че копирането е плитко.
#12 Често няма нужда да подаваме блок на reduce, понеже съответната операция обикновено вече съществува.
#13 self-ът се запазва в closure-а на ламбда при създаването и. Няма нужда да го помним, дори и да извикаме
# ламбдата след това от друг обект.
#14 При хеширане на сложни обекти е удбно да се вкарат отделните им компоненти в Array и да се възползваме
# от hash функцията на Array.
#15 Често е полезно в наши класове да имплементираме методи от вида each_something, понеже това дава лесен,
# удобен и познат начин за обхождане на някаква вътрешна структура.
#16 Чрез method_missing имаме удобен начин във DSL да пишем произволни имена без да се налага те да са от
# символен тип.
#17 Добра идея списъци от константи в телата на класовете да се freeze-ват с цел оптимизация.
#18 Добра идея е нашите класове да се съдържат в модули за да не се замърсява top-level scope-а.
#19 Булеви изрази, в които участват повече от две условия със разнородни операции (т.е. and/or/not)
# и/или извиквания на функции, се четат по трудно.
#20 В класа String няма метод each_slice както в Enumerable. За сметка на това 'foo bar'.scan(/.{5}/)
# върши подобна работа, но пропуска последния "slice".

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

Калоян обнови решението на 19.01.2014 14:24 (преди почти 11 години)

+REPOSITORY = 'https://github.com/KaloyanKaludov/ruby-retrospective-3'
+
+#01 Операторите свързани с присвояване не могат да се разглеждат като символи и да се извикват чрез send.
+
+#02 unshift работи като pop_front.
+
+#03 fetch може да връща стойност по подрабиране.
+
+#04 Съществува функция between? за проверка дали число е между други две и интервалът е включващ.
+
+#05 При дефиниране на функции с define_method е полезно на блока да се подаде splat променлива ако искаме
+# да имаме променлив брой аргументи.
+
+#06 Много е грозно да се опитваш да разделяш логически свързани неща просто за да имаш няколко, но по-къси
+# метода. ЛОГИКАТА на функцията трябва да е кратка и ясна. Дължината на функцията в брой редове, няма
+# никакво значение, ако е лесна за разбиране.
+
+#07 define_method се използва за дефинирането на много на брой функции с много сходна функционалност.
+# Тази практика разбира се разчита на факта, че генерираните функции никога няма да се налага да се
+# променят или усложняват. (Което много рядко е така)
+
+#08 Style Guide-а препоръчва 0.upto(n) вместо (0..n) и 0.upto(n - 1) вместо (0...n).
+
+#09 Struct може да се използва за бързи и прости структури от данни.
+
+#10 Думата evaluator не е част от английския език.
+
+#11 За да създадеш копие на прост обект може да използваш dup, но трябва да помниш, че копирането е плитко.
+
+#12 Често няма нужда да подаваме блок на reduce, понеже съответната операция обикновено вече съществува.
+
+#13 self-ът се запазва в closure-а на ламбда при създаването и. Няма нужда да го помним, дори и да извикаме
+# ламбдата след това от друг обект.
+
+#14 При хеширане на сложни обекти е удбно да се вкарат отделните им компоненти в Array и да се възползваме
+# от hash функцията на Array.
+
+#15 Често е полезно в наши класове да имплементираме методи от вида each_something, понеже това дава лесен,
+# удобен и познат начин за обхождане на някаква вътрешна структура.
+
+#16 Чрез method_missing имаме удобен начин във DSL да пишем произволни имена без да се налага те да са от
+# символен тип.
+
+#17 Добра идея списъци от константи в телата на класовете да се freeze-ват с цел оптимизация.
+
+#18 Добра идея е нашите класове да се съдържат в модули за да не се замърсява top-level scope-а.
+
+#19 Булеви изрази, в които участват повече от две условия със разнородни операции (т.е. and/or/not)
+# и/или извиквания на функции, се четат по трудно.
+
+#20 В класа String няма метод each_slice както в Enumerable. За сметка на това 'foo bar'.scan(/.{5}/)
+# върши подобна работа, но пропуска последния "slice".

Добри решения. Ето и малко бележки:

  • В този код: INSTRUCTION = Struct.new(:name, :operand_1, :operand_2) е по-добре INSTRUCTION да е Instruction, защото зад тази константа стои клас.
  • Точка 16 е нещо грозно и извратено. Че може - може, но не се препоръчва :) Дадохме ви го в четвърта задача, само за да ви измъчим да се сетите за това :) Иначе е много по-добра идея да се ползва символ като име на етикет.
  • 17 не е точно така -- оптимизацията е под въпрос и е малковажна - важното е да се предпазим от това някой неволно да мутира обекта, стоящ зад нашата константа (например да изтрие/добави/промени ключове в хеш).