Георги обнови решението на 25.10.2011 13:27 (преди около 14 години)
Целия ти метод 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 не ми изглеждаше твърде обфускирано. Когато го писах все още имах разбирах критериите като "дизюнктивни" и след като поправих това нещата явно доста са се замазали. Дори и сега, като погледнах кода, ми се наложи да се замисля за момент, за да разбера какво се случва.
За останалата критика - ще гледам да си науча урока и да не се повтаря. :)
