Беатрис обнови решението на 16.01.2017 16:35 (преди почти 8 години)
+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