Александрина обнови решението на 27.01.2016 23:21 (преди около 9 години)
+REPOSITORY = 'https://github.com/AKarakehayova/ruby-retrospective-2015-1'
+#Двадесет неща, които научих:
+#1.Трябва да се познават функциите, вградени в езика, за да не се налага да се усложнява кода, за да се пише нещо, което го има наготово.
+#2.Важно е да си пишеш сам тестове, за да проверяваш всяка част от кода си и да намираш лесно къде има проблем.
+#3. Научих колко полезни са хешовете и как могат да спестят много код.
+#4. Не винаги генерирането на напълно случайни числа е удачно. В случаи като във втора задача забавя значително програмата.
+#5. Научих, че функцията sample връща произволен елемент от масив.
+#6. Да разделям задачата си на по-малки части, по-лесни #проблеми, за да е ясно разграничен логически кода.
+#7. Когато include-нем Enumerable и дефинираме each в наш клас #можем да използваме методите, дефинирани в Enumerable.
+#8. Използвах и научих доста методи от Enumerable (например #partition).
+#9.Да не правя дълги и неясни методи, чиято цел се разбира #трудно.
+#10.Да използвам lambda-функции, ако дадена функция ми е #необходима само като помощна в точно един метод.
+#11. Да давам ясни имена на методите си,а не като help, за да #може след време да знам какво се очаква от този метод и след #време.
+#12. Кодът става по-кратък и елегантен с използването на #паралелно присвояване.
+#13. Да спазвам ръководството по стил.
+#14. За предпочитане е използването на модули пред #наследяването в случай на нужда от преизползване на методи.
+#15. Използването на функции от по-висок ред (map, filter) #спестява доста итерации и изглежда много по-ясно.
+#16. Използвах регулярни изрази и научих доста полезни неща, #които мога да правя с тях.
+#17. Класове, които са помощни, е добре да са вложени в #главния клас.
+#18. Вместо да дефинирам setter-и и getter-и мога да използвам #attr_accessor.
+#19. Научих каква е разликата между super и super().
+#20. Методите на даден клас, които се ползват единствено като #помощни от други методи на класа, е добре да бъдат дефинирани #в private частта на класа.
Махнах 2 точки, защото 4-тото решение може да се оправя още доста, както и има места, където не си спазвала конвенциите - в 3-та, примерно, използваш return
, където не е нужно. А в 4-та имаш проблеми с индентацията и форматирането на кода.
В четвърта задача:
- В
initialize
на Deck-овете просто си копирала кода. Можеше да направиш нещо от типа на:
class Deck
SUITS = [:spades, :hearts, :diamonds, :clubs]
RANKS = [2, 3, 4, 5, 6, 7, 8, 9, 10, :jack, :queen, :king, :ace]
class << self
def default_deck
self::SUITS.product(self::RANKS).map do |suit, rank|
Card.new(rank, suit)
end
end
end
def initialize(cards = nil)
@deck = cards || self.class.default_deck
end
end
class BeloteDeck < Deck
SUITS = [:clubs, :diamonds, :hearts, :spades]
RANKS = [7, 8, 9, :jack, :queen, :king, 10, :ace]
end
- Опитвай да групираш части от кода в методите, като ги разделяш с празни редове
примерно написала си:
def deal
hand_cards = []
26.times do
hand_cards << draw_top_card
end
Hand.new(hand_cards)
end
което ще стане по-ясно така:
def deal
hand_cards = []
26.times do
hand_cards << draw_top_card
end
Hand.new(hand_cards)
end
т.е. имаш някакви начални данни, правиш нещо с тях и накрая подготвяш изходния резултат
пс. най-чисто би било нещо от типа на
def deal
hand_cards = Array.new(26) { draw_top_card }
Hand.new(hand_cards)
end
или може и на един ред :)
Погледни отново нашето решение на 4-та задача и разгледай как е направена частта с Hand
и BeloteDeck::Hand
.