Георги обнови решението на 25.10.2011 13:27 (преди около 13 години)
Целия ти метод parse_song
изглежда като нещо, което можеш да преместиш в Song
.
Също, виж какво прави Array(1)
, и Array([1, 2, 3])
.
У, написах един коментар два пъти. Може би трябва триене.
Както и да е, друго което можеш да направиш с тези ламбди е да ги плъзнеш като константа някъде.
Или далеч по-умното, можеш да ги направиш методи на Song
. Една песен може сама да си прецени дали отговаря на някакви критерии или не. Можеш да кръстиш метода #matches?
и после да филтрираш масива с песни от Collection
с нея.
Парсенето на файла може да остане в Collection
.
Благодаря!
-
genrestring
се пише катоgenre_string
-
tag.end_with? '!'
, вместоtag[-1] == '!'
. Последното няма да работи в 1.8. - Това в
matches_tag?
се пише сtag.all? { |tag_element| matches_tag? tag_element }
. - Цялостното ти подравняване в
Collection#initialize
е доста страно.- Няма нужда от
\
на края на реда - whitespace-а се слага така
.map { |line line.split }
- Няма нужда от
- Когато блока е на повече от един ред, се ползва
do
/end
нотацията. Грешиш го на няколко места. - Това да имаш instance метод
Song#parse
е странно. Трябва да правишsong = Song.new; song.parse
. Така можеш да инстанцираш невалиденSong
, което не е хубаво. По-добре щеше:- Да го прави конструктора.
Song.new(string_for_parsing)
. - Да бъде class метод в
Song
.Song.parse(string_for_parsing)
. - Да го прави
Collection
.
- Да го прави конструктора.
- Начина, по който ползваш
#inject
вCollection#find
е ужасен. Там е заEnumerable#select
, в който да има#all?
.
Щях да ти взема точка, но щях и да ти дам точка за кратко решение.
Питай, ако имаш въпроси.
Без наклонената черта в края на реда, vim не ми изместваше вдясно продължението на израза на новия ред. Логиката ми беше, че щом vim се държи така, явно липсата на \
не е добра практика. Тъпо.
А за parse-ването - то първоначално беше в Collection
-а, но след първия ти коментар го преместих в Song
. Лошото е, че след още малко промени направих метода твърде дебел и не можех да го върна в Collection
. Щях да наруша ограниченията, защото с конструирането и връщането на Song
ставаше прекалено дълъг. А вариантът за разделяне на няколко метода не ми допадаше. Сега гледам, че има много изродски решения на този проблем.
А колкото до inject-а - с нещо подобно се озовах на "слайдовете на срама" след първото домашно. Въпреки това, в това Collection#find
не ми изглеждаше твърде обфускирано. Когато го писах все още имах разбирах критериите като "дизюнктивни" и след като поправих това нещата явно доста са се замазали. Дори и сега, като погледнах кода, ми се наложи да се замисля за момент, за да разбера какво се случва.
За останалата критика - ще гледам да си науча урока и да не се повтаря. :)