Стефан обнови решението на 21.01.2014 05:31 (преди почти 11 години)
+REPOSITORY = 'https://github.com/SVasilev/ruby-retrospective-3'
+
+# Двадесет неща, които научих.
+#
+# 1. Числото 1 не е сред простите числа.
+# 2. Не е нужно да се използва self.each когато сме отворили класа Array например. Може да се използва направо each.
+# 3. Навързването на редица от функции е доста полезно и спестява много редове код.
+# 4. Map-ването и reduce-вантео на масиви може да става с референции към функции... Така кодът:
+# def digits
+# abs.to_s.chars.map { |element| element.to_i }
+# end
+#
+# Лесно се превръща в:
+# def digits
+# abs.to_s.chars.map(&:to_i)
+# end
+# 5. Добавянето на Enumerable в собвтвен клас го прави изброим тоест може да се итерира.
+# 6. Добавяйки each в собствен клас прави възможно всякакво итериране на обекти от този клас.
+# 7. Трябва много внимателно да се избира интерфейса на всеки клас, тъй като при сложен интерфейс работата с него става трудна.
+# 8. Хубаво е да се енкапсулира код в различни модули.
+# 9. Никак не е добра идея да има код извън модул или клас, защото той отива в Object.
+# 10. При викане на методи не е нужно да се слагат скоби когато се изреждат аргументите дори и това да е в if клауза. Например:
+# return item.to_s.upcase if [:todo, :current, :done].include?(item)
+#
+# Спокойно може да се преобразува в:
+# return item.to_s.upcase if [:todo, :current, :done].include? item
+# 11. След всеки метод в клас/модул се оставя един ред разстояние за по добра четимост.
+# 12. Няма значение колко модули или класове имаме, важно е кодът да е четим и подреден.
+# 13. Понягока е хубаво да предефинираме аритметични операции за нашите обекти. Съкращават ни доста код.
+# 14. Рекурсията в Руби не е оптимизирана, бавна е, има по добри алгоритми за растеризация.
+# 15. Да не забравям, че понякога е полезно да се използва private секцията на класовете.
+# 16. Хубаво е да се разделя логиката на задачата в различни модули.
+# 17. Руби кодът не бива да прилича на C++ код.
+# 18. Не е нужно да откриваме топлата вода в Руби. Ако работим по важен проект то колкото повече се ровим за готови неща толкова по-добре.
+# Ако се стремим към алгоритми или просто ни е интересно може да си поиграем да имплементираме нещо, което е вече имплементирано.
+# 19. Добре е когато се натрупва много код в една функция да бъде изнасян в отделни. Не само че е по-разбираемо, но е полезно и при дебъгинг.
+# 20. Като за завършем мисля, че е редно да отбележа, че курса по Руби ме научи на много неща както за самия език така и за общи практики.
+# Много ми харесаха неща като Version Control, с които се научих да боравя, както и други интересни неща, към които ни линк-нахте по време на курса.
+#
+# Не мисля, че съм направил това домашно достатъчно добре с оглед на факта че имах достъп до всички решения, включително и вашите, но просто
+# бях притиснат от времето. Не съм почнал късно да го пиша, просто имам доста контролни. Благодаря за всичко на което ме научихте! : )
Аз на свой ред ти благодаря за обратната връзка и се радвам, че си научил толкова неща :)
Липсата на време си е проличала и някои от решенията ти имат следните проблеми, затова не получаваш пълен брой точки за задачата:
- Не си адресирал някои от бележките ми по трета задача.
- В четвърта задача имаш повече от допустимото количество на дублиране на код.
Към научените неща имам следната дребна бележка:
- В този пример за изпускане на скоби не виждам да има извикан метод в if клауза, без скоби:
return item.to_s.upcase if [:todo, :current, :done].include?(item)
. Ако беше така, щях да разбера:return item.to_s.upcase if [:todo, :current, :done].include? item
(и това щеше да работи).