Станимира обнови решението на 19.01.2016 21:46 (преди около 9 години)
+REPOSITORY = 'https://github.com/sis0k0/ruby-retrospective-2015-1'
+
+# Двадесет и две неща, които научих + 2 бонус :)
+#
+# * 1 задача *
+# 1. Добра практика е да се използват константи,
+# вместо в кода да се срещат "магически" числа.
+# Това важи дори и ако числото се среща веднъж.
+#
+# 2. Ако има няколко логически свързани "магически" числа,
+# е добра идея да бъдат отделени в Hash (отново константа).
+# Този Hash трябва да е с име, описващо общото между числата.
+# ** Реално погледнато (1) и (2) важат не само за числа,
+# но и за стрингове и всякакви други променливи.
+#
+# * 2 задача *
+# 3. Ако искам методът, който пиша, да не променя (mutate) даден обект,
+# трябва да изполвам методите Object#dup или Object#clone,
+# като clone създава "дълбоко" копие на обекта за разлика от dup.
+# Копие, създадено с clone, наследява singleton методите на първообраза.
+# Също така, ако първообразът е бил замразен, копието също
+# ще е замразено. Тези две неща не важат за dup.
+#
+# 4. Методът Array#product връща всички комбинации от елементите
+# на масива, върху който сме го извикали, и подадените като аргументи масиви.
+# Ако имаме масив с x координати и масив с y координати, можем да го използваме,
+# за да получим масив с точки в координатната равнина.
+#
+# 5. Методът Array#- връща масив, от който сме изключили всички ненужни елементи,
+# подадени като аргумент (отново масив).
+# Ако имаме 1 множество 'A' (в случая Array) с елементи и негово подмножество 'B',
+# можем да използваме горния метод, за да намерим допълнението на 'B' до 'A'.
+#
+# 6. Методът Array#sample връща случаен елемент от масива.
+#
+# 7. Всеки метод трябва да върши точно 1 нещо и
+# да има име, което казва кое е това нещо.
+# Всяко странично нещо, което върши методът, заслужава да е отделен метод.
+#
+# 8. Когато трябва да проверя дали число е в някакъв интервал,
+# мога да използвам методът Comparable#between? вместо да пиша изрази от типа на
+# 0 < x <= 42.
+#
+# 9. Ако искам да върна масив с координати на точка мога да напиша просто:
+# def point
+# [x, y]
+# end
+# Ако искам да взема координатите, мога да използвам паралелно присвояване:
+# x, y = point
+#
+# 10. За разлика от други езици, конвенция за имената на методите е те да
+# са съществителни имена, а не глаголи.
+#
+# 11. Ако искам да пиша условни изрази на няколко реда,
+# трябва да поставя условния оператор в края на реда:
+#
+# obstacle_ahead?(snake, direction, dimensions) or
+# obstacle_ahead?(next_position, direction, dimensions)
+#
+# или да ескейпна символа за нов ред:
+#
+# obstacle_ahead?(snake, direction, dimensions)\
+# or obstacle_ahead?(next_position, direction, dimensions)
+#
+# * 3 задача *
+# 12. Имам следния метод:
+#
+# def prime?
+# is_prime = true
+#
+# (2..self / 2).each do |i|
+# if self % i == 0
+# is_prime = false
+# break
+# end
+# end
+#
+# is_prime and self > 1
+# end
+#
+# Вместо да използвам each и в тялото му да проверявам
+# едно по едно дали всяко число е делител,
+# мога да ползвам методът Enumerable#all?
+#
+# def prime?
+# return false if self == 1
+# (2..self / 2).all? { |i| self % i != 0 }
+# end
+#
+# 13. Мога да отделя логиката за (безкрайно) генериране на редиците в отделен метод.
+# В методът each на всяка редица, мога да ползвам Enumerable#lazy
+# и след това да взема (Enumerable#take) само колкото числа са необходими.
+#
+# 14. Добра идея е генерирането на редиците да не е част от публичния интерфейс,
+# след като е от магията, която се случва вътре в класа.
+# (С други думи не трябва да позволяваме на клиента да се простреля в крака,
+# използвайки нашия безкраен генератор на числа.)
+#
+# 15. За гореспоменатите безкрайни генератори можем да ползваме
+# конструкцията за безкраен цикъл (finally find a use case for it)
+#
+# loop do
+# ...
+# end
+#
+# * 4 задача *
+# 16. Мога да ползвам map(&:to_s) в комбинация с join("\n"),
+# за метода Deck#to_s.
+#
+# 17. Добавих метод Hand#includes? за проверка дали в
+# ръката се съдържа определена карта.
+# С негова помощ добавих и метод Hand#king_and_queen?,
+# който проверява дали в ръката се срещат едновременно
+# дама и поп от 1 боя.
+# Благодарение на наследяването, този метод се използва директно в
+# методите SixtySixHand#twenty?, SixtySixHand#forty? и BeloteHand#belote?
+#
+# 18. Мога да използвам sort_by (вместо sort), като в блока трябва
+# да върна масив с критериите за сортиране.
+#
+# 19. Осъзнах, че мога да използвам some_collection.any?{...},
+# вместо some_collection.each{...}.any?
+#
+# 20. Смених подхода при проверка за поредни карти от боя BeloteHand#consecutive?
+# Обхождам боите, селектирам всички карти от тази боя и от тях проверявам дали има последователни.
+# Предишният подход беше доста по-tricky и труден за разчитане.
+#
+# 21. Вместо да правя нов метод #sort за всяка колода,
+# в който да извиквам родителския метод и да му подавам специфичните RANKS,
+# изнесох предаването на RANKS в #initialize методите на колодите.
+#
+# 22. Вложих всички класове Hand в съответстващите класове Deck,
+# защото е логично те да не могат да се инстанциират без да са част от колода.
+#
+#
+# * Бонус *
+# 23. Научих, че когато пиша тестове, трябва да тествам публичния интерфейс.
+# Само публичния интерфейс. Целия публичен интерфейс.
+# Глупави грешки в следствие от неспазването на това правило.
+#
+# 24. Научих, че трябва да рефакторирам кода си, докато нямам какво повече да рефакторирам
+# и че най-доброто решение никога не е първото.