Решение на Девета задача от Станимира Влаева

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

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

Резултати

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

Код

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. Научих, че трябва да рефакторирам кода си, докато нямам какво повече да рефакторирам
# и че най-доброто решение никога не е първото.

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

From https://github.com/fmi/ruby-retrospective-2015-1
 * branch            master     -> FETCH_HEAD
HEAD is now at 767dd8d Update the task name in the readme for clarity
Cloning into 'submission'...
HEAD is now at 7085de1 Task #2, use clone instead of dup
From /tmp/ruby-retrospective-2015-1/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/sis0k0/ruby-retrospective-2015-1/compare/767dd8dfe46...7085de1bf8d

‘solutions/04.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/04.rb’
‘solutions/02.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/02.rb’
‘solutions/03.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/03.rb’
‘solutions/01.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/01.rb’
OK
........

Finished in 0.00491 seconds
8 examples, 0 failures
OK
....................

Finished in 0.0112 seconds
20 examples, 0 failures
OK
....................

Finished in 0.01049 seconds
20 examples, 0 failures
OK
.........................................................

Finished in 0.05456 seconds
57 examples, 0 failures
From https://github.com/fmi/ruby-homework
 * branch            master     -> FETCH_HEAD
HEAD is now at 9dd040c Modify a test in task 8 to not include empty cells
.

Finished in 0.00158 seconds
1 example, 0 failures

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

Станимира обнови решението на 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. Научих, че трябва да рефакторирам кода си, докато нямам какво повече да рефакторирам
+# и че най-доброто решение никога не е първото.