Решение на Пета задача от Стефан Василев

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

Към профила на Стефан Василев

Резултати

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

Код

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, с които се научих да боравя, както и други интересни неща, към които ни линк-нахте по време на курса.
#
# Не мисля, че съм направил това домашно достатъчно добре с оглед на факта че имах достъп до всички решения, включително и вашите, но просто
# бях притиснат от времето. Не съм почнал късно да го пиша, просто имам доста контролни. Благодаря за всичко на което ме научихте! : )

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

Стефан обнови решението на 21.01.2014 05:31 (преди около 10 години)

+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 (и това щеше да работи).