Ивайло обнови решението на 25.10.2011 20:33 (преди около 13 години)
Ако погледнеш внимателно, ще видиш че Collection
има няколко метода, които не ползват нищо от инстанцията - tags
, name
и прочее. Още повече, всички вземат един допълнителен аргумент (song
) и боравят с него.
def name(song, song_name)
song.name == song_name
end
def artist(song, song_artist)
song.artist == song_artist
end
def filter(song, filter_block)
filter_block.(song)
end
Въобще, опитват се да ти кажат, че искат да ги преместиш от Collection
в Song
. Всеки път, когато имаш метод, който не борави по никакъв начин със self
, това е ясен знак, че метода трябва да бъде някъде другаде.
Отделно, в тази задача имаш тамън две неща да правиш - (1) парсене на вход и (2) проверка дали песен отговаря на критерии. Тези неща трябва да стоят отделно. Първото е много подходящо за Collection
, докато второто - за Song
.
Не, не, не, не, и не.
Нещата с @@
в Ruby са класови променливи. Семантиката им е малко странна, което е причината да не сме говорили за тях. Пишат се със snake case. Това което търсиш е константа:
SUBPROPERTY_DELIMITER = /,\s*/
-
[*tags]
е хитро, браво че си се сетил. Аз не се. - Браво, че си открил
send
. Получило се е хубаво. -
tag[0..2]
може да се запише катоtag.chomp('!')
в този случай. - По принцип е по-добре да ползваш:
filter_block.call
, отколкотоfilter_block.()
. Можеше просто да го кръстишfilter
. - Този
map!
не е особено адекватен. По-добре си създай нов списък. - Аз не бих изкарал
SUBPROPERTY_DELIMITER
. Бих го inline-нал и на двете места. - Може да напишеш
send "#{method_name}_matches?", value
. По-удачно е. -
genres.map(&:downcase)
е по-добре отgenres.map { |genre| genre.downcase }
.
Иначе, решението ти ми харесва. Личи си, че си понаучил доста Ruby и одобрявам. Имаш 2 бонус точки за това.