Иван обнови решението на 28.10.2011 09:55 (преди над 13 години)
Доста по-добре от останалите, но ето ти малко коментари все пак:
- В момента
Collection
е глупав. Той е по-подходящ да парси редовете отSong
. -
@my_song_list
е далеч по-лошо име от@songs
. -
attr_reader :genre, :subgenre
. - Странно е
#name
едновременно да връща името и да проверява дали песента има такова име. По-добре това да са два отделни метода. - Ако искаш да вземеш всичко без последната удивителна на низ, това може да стане със
str.chomp('!')
-
saint_lambda
? - По-добре създавай нов списък от тагове, вместо да го мутираш
@tags = @tags.uniq
.
Няма да се разсърдим, ако си сложиш снимка :)
Още:
-
@tags = "#{@tags},#{@genre.downcase}.split(',')
е бая странно. Защо не просто@tags += @genre.downcase.split(',')
или@tags = @tags | @genre..
или дори@tags |= @genre.downcase...
. -
not (x == y)
се пише катоx != y
.
Можеш ли да потвърдиш, че можеш да отвориш решението си и да го коментираш?
Тъй, понеже обещах да си опиша официално коментарите - 'here goes nothin' :)
Съгласен съм със забележките отностно @my_song_list
, attr_reader
, str#chomp
и мутирането на @tags
- оправил съм ги в решението.
Collection
е ужасяващо глупав, но не искам да дробя редовете в него. От тук произтича, че не мога и допълните тагове да пъхам от там (ако не съм извадил artist
не мога да си харесам конкретна стойност от hash-a
)
saint_lambda
не е нито криптично, нито кратко, нито подвеждащо - приеми го като 'моя подпис' в/у тоя сорс. Ако те дразни много - ще се постарая следващите задачи да са с по-скучни аргументи:)
По принцип поведението на атрибутите на Song
е странно, но към момента не се сещам друг начин, който да ми позволява толкова проста реализация на find
. Идеята ми е, че търсех конструкция, в която да сравнявам с
class.func(param)==criteria[param]
и не си харесах друг начин да го реализирам (поне без специална обработка на criteria[filter]
).
@tags = "#{@tags},#{@genre.downcase}.split(',')
- отново идва от нежеланието ми да раздробявам tags
и genre/subgenre
по-рано. В този момент те не са масиви от думички, а списъци от думички (разделени в 1 стринг с ,
) -> Така с 1 удар хващам 2 мухи, вместо да парсвам 2 различни списъка по един и същи начин.
За not (x==y)
се извинявам, че съм те разбрал грешно и съм го оправил:)
ПС Последната снимка, която ми е направена доброволно е с две котенца някъде в планината (преди >2 години). Мразя да се снимам и този курс не е основателна причина да се жертвам (нищо лично, ама наистина много много мразя да се снимам) :)
Отвъд свещенната ти ламбда и compare_with_nil
, всичко друго е супер.
Мерси, принципно се размислих, че мога да превърна
def find(criteria)
@songs.select do |the_song|
criteria.all? { |field, value| the_song.method(field).call(value) }
end
end
В
def find(criteria)
@songs.select do |the_song|
criteria.all? { |field, value| the_song.method("check_#{field}").call(value) }
end
end
И да постигна същото с класови атрибути
ПС saint_lamba
е света ламбда
, ако беше holy_lambda
щеше да е свещена :)
Не, това е грешно. Това не е Python.
Не се прави the_song.method('foo').call(bar)
. Прави се the_song.send('foo', bar)
.
По принцип знам (в смисъл внимавам на лекции), но когато го писах ми направи някакъв проблем. Възможно да е идвал от другаде, но като достигнах някаква стабилност ми се стори по-умно да не го пипам :)
Не съм ходил на Python (не помня с какво се настъпваше)