Решение на Седма задача - ретроспекция от Беатрис Бонева

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

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

Резултати

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

Код

REPOSITORY = 'https://github.com/Beatris/ruby-retrospective-2016'.freeze
# rubocop:disable AsciiComments
#
# Двадесет неща, които научих.
#
# 1. Избягвай ненужни проверки и over-engineer-ване. Пример (2ра задача):
# path.strip.reverse.chomp('.').reverse.chomp('.') - srsly?! Остави го да се чупи,
# както си му е реда - само правиш кода по-трудно разбираем и рискуваш допълнително бъгове.
#
# 2. Разделяй и владей. По-добре повече функции, отколкото if-ове и дъъъълги функции. Вместо
# да правиш if за всеки подаден тип - имплементирай такава функция в отделните типове - в
# Руби това става доста лесно. Пример (2ра задача) - Array#fetch_deep
#
# 3. Избягвай `хитрости`. KISS. По-важно е кода да ти е ясен, а не 10 мин да се чудиш какво
# правиш тука и за чий?! Пример (2ра задача):
# Array#fetch_deep: Hash[(0..(self.size - 1)).map { |x| x.to_s }.zip(self)].fetch_deep(path)
# Горното ме навежда и на:
#
# 4. Single-responsibility principle. Горе разчитам, че в Hash има функция fetch_deep - ами ако няма?!
# Това значи ли Array#fetch_deep не трябва да работи?! Не си вкарвай излишни dependency-та.
#
# 5. Избягвай ненужни операции. Например, да буташ няколко стойности в списък само, за да вземеш
# първото, което не е nil.. Има си оператор `||`. Първо, че е по-сложно за разбиране от читателя,
# второ, че рискуваш да introduce-неш бъгове, трето, че е по-скъпа операция.
#
# 6. map в Руби не мутира обекта, така че не е нужно да клонираш въпросния обект и после да променяш
# новия с each. Пример (2ра задача) - Hash#reshape и Array#reshape
#
# 7. Най-добре да изключим някакъв edge case в началото с return, отколкото да имаме много if-ове,
# които затрудняват четенето на кода и логиката. (Веднъж съм виждала и контра-пример за това, но
# един път е пренебрижимо малко => е по-скоро е изключение).
#
# 8. #join вика to_s метода на обектите, които join-ваш, така че не е нужно да ги map-ваш с to_s
#
# 9. #join join-ва и празни низове/списъци ['a', '', []].join('\n') == "a\\n\\n"
#
# 10. Rspec#match_array не е удачно да се ползва, когато редът има значение. Идеята му е точно обратната.
#
# 11. Когато unit-тестваме е добре да се стремим да тестваме всяка функция максимално отделно от останалите,
# за да хващаме правилните грешки и да не чупим неправилните тестове. Например, не трябва да разчитаме,
# че #to_s работи правилно, за да тестваме #components (задача 4).
#
# 12. По-добре е да се избягва self, когато е възможно в методите на класа - по-ясен и по-кратък кода.
#
# 13. Използвай unless по-често - може да спести доста код (например като return-нем в началото на функцията,
# ако са аргумента ни е nil - виж номер 7).
#
# 14. Не забравяй да си правиш методите за вътрешно ползване private.
#
# 15. Не прекалявай с номер 2 - ако нещо го правиш веднъж и е един select не ти е нужна отделна private функция
#
# 16. При unit тестове най-добре си дефинирай обекта веднага преди теста, а не да го търсиш някъде нагоре.
#
# 19. Пиши си домашните!
#
# 20. Пиши си домашните НЕ в последния момент!
#
# rubocop:enable AsciiComments

Лог от изпълнението

From https://github.com/fmi/ruby-retrospective-2016
 * branch            master     -> FETCH_HEAD
HEAD is now at a22cf37 Set rubocop version to 0.46.0 to fix obsolete cop errors
Cloning into 'submission'...
HEAD is now at a188dc0 Finalize
From /tmp/ruby-retrospective-2016/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/Beatris/ruby-retrospective-2016/compare/1f710b00c26...a188dc09f40

'tasks/1/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/1/solution.rb'
'tasks/2/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/2/solution.rb'
'tasks/3/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/3/solution.rb'
'tasks/4/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/4/solution.rb'
'tasks/5/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/5/solution.rb'
Inspecting 1 file
.

1 file inspected, no offenses detected
.................

Finished in 0.00492 seconds
17 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
...............

Finished in 0.00555 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected

...............

Finished in 0.00816 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
....................

Finished in 19.14 seconds
20 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
.........................

Finished in 0.01908 seconds
25 examples, 0 failures
.

Finished in 0.00164 seconds
1 example, 0 failures

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

Беатрис обнови решението на 16.01.2017 16:35 (преди над 7 години)

+REPOSITORY = 'https://github.com/Beatris/ruby-retrospective-2016'.freeze
+
+# rubocop:disable AsciiComments
+#
+# Двадесет неща, които научих.
+#
+# 1. Избягвай ненужни проверки и over-engineer-ване. Пример (2ра задача):
+# path.strip.reverse.chomp('.').reverse.chomp('.') - srsly?! Остави го да се чупи,
+# както си му е реда - само правиш кода по-трудно разбираем и рискуваш допълнително бъгове.
+#
+# 2. Разделяй и владей. По-добре повече функции, отколкото if-ове и дъъъълги функции. Вместо
+# да правиш if за всеки подаден тип - имплементирай такава функция в отделните типове - в
+# Руби това става доста лесно. Пример (2ра задача) - Array#fetch_deep
+#
+# 3. Избягвай `хитрости`. KISS. По-важно е кода да ти е ясен, а не 10 мин да се чудиш какво
+# правиш тука и за чий?! Пример (2ра задача):
+# Array#fetch_deep: Hash[(0..(self.size - 1)).map { |x| x.to_s }.zip(self)].fetch_deep(path)
+# Горното ме навежда и на:
+#
+# 4. Single-responsibility principle. Горе разчитам, че в Hash има функция fetch_deep - ами ако няма?!
+# Това значи ли Array#fetch_deep не трябва да работи?! Не си вкарвай излишни dependency-та.
+#
+# 5. Избягвай ненужни операции. Например, да буташ няколко стойности в списък само, за да вземеш
+# първото, което не е nil.. Има си оператор `||`. Първо, че е по-сложно за разбиране от читателя,
+# второ, че рискуваш да introduce-неш бъгове, трето, че е по-скъпа операция.
+#
+# 6. map в Руби не мутира обекта, така че не е нужно да клонираш въпросния обект и после да променяш
+# новия с each. Пример (2ра задача) - Hash#reshape и Array#reshape
+#
+# 7. Най-добре да изключим някакъв edge case в началото с return, отколкото да имаме много if-ове,
+# които затрудняват четенето на кода и логиката. (Веднъж съм виждала и контра-пример за това, но
+# един път е пренебрижимо малко => е по-скоро е изключение).
+#
+# 8. #join вика to_s метода на обектите, които join-ваш, така че не е нужно да ги map-ваш с to_s
+#
+# 9. #join join-ва и празни низове/списъци ['a', '', []].join('\n') == "a\\n\\n"
+#
+# 10. Rspec#match_array не е удачно да се ползва, когато редът има значение. Идеята му е точно обратната.
+#
+# 11. Когато unit-тестваме е добре да се стремим да тестваме всяка функция максимално отделно от останалите,
+# за да хващаме правилните грешки и да не чупим неправилните тестове. Например, не трябва да разчитаме,
+# че #to_s работи правилно, за да тестваме #components (задача 4).
+#
+# 12. По-добре е да се избягва self, когато е възможно в методите на класа - по-ясен и по-кратък кода.
+#
+# 13. Използвай unless по-често - може да спести доста код (например като return-нем в началото на функцията,
+# ако са аргумента ни е nil - виж номер 7).
+#
+# 14. Не забравяй да си правиш методите за вътрешно ползване private.
+#
+# 15. Не прекалявай с номер 2 - ако нещо го правиш веднъж и е един select не ти е нужна отделна private функция
+#
+# 16. При unit тестове най-добре си дефинирай обекта веднага преди теста, а не да го търсиш някъде нагоре.
+#
+# 19. Пиши си домашните!
+#
+# 20. Пиши си домашните НЕ в последния момент!
+#
+# rubocop:enable AsciiComments