Калоян обнови решението на 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 не е точно така -- оптимизацията е под въпрос и е малковажна - важното е да се предпазим от това някой неволно да мутира обекта, стоящ зад нашата константа (например да изтрие/добави/промени ключове в хеш).