Иван обнови решението на 28.10.2011 09:55 (преди около 14 години)
Доста по-добре от останалите, но ето ти малко коментари все пак:
- В момента
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 (не помня с какво се настъпваше)
