Герасим обнови решението на 24.10.2014 23:47 (преди около 10 години)
Здрасти,
Ясно ми е, че има още проблеми за редактиране, въпреки че минава rspec и skeptic тестовете, но се надявам на коментар относно подходите, които съм избрал. : -)
Ето малко бележки:
- Обикновено се изпускат скобите около
require
и се записва само така:require 'set'
. - Не бих извеждал методи в
SetMethods
. Не го ползвам никъде другаде. Ако го ползвах, щях да си помисля, но в момента няма такъв use case. По-просто е да се намират директно вNumberSet
. - Ред 5 ми прилича на нещо, което може би е вградено в Ruby. Проверил ли си? :)
- Трябва да има празен ред между редове: 24 и 25, 29 и 30, 41 и 42, 42 и 43, 43 и 44.
- Никъде не ползваш
set=
, който създаваш на ред 25. Setter методите рядко са добра идея, още повече ако не ги ползва човек. По-добре самоattr_reader :set
, ако го ползваш някъде. - Аргументът на
NumberSet#[]
не трябва да се казваblock
, защото не еblock
.filter
е по-добро име. - Също така, този метод трябва да връща инстанция на
NumberSet
. Ти връщашSet
. - В този метод, по-добре ползвай
Array#concat
. Ще отпадне нуждата от ред 35. - Какво е
argument
на редове 33-34? Може би може да измислиш по-добро име, което казва какво е това нещо. - Защо не направиш метод each на филтрите, който да
yield
-ва само филтрирани елементи? Може да се ползва например така:filter.each(@set) { |element| filtered_elements << element }
. Или, ако инстанцията на филтъра също еEnumerable
, може да е дориfilter.each(@set).to_a
. Или просто метод#filter(@set)
, който връща списък от елементи. - Какво означава
archie
? Търсих в речник, чесах се зад врата, но не мога да разбера. Мисля, че може да се измисли по-добро име там. - Употребата на променливите
archie
иprocs
вNumberSet#[]
изглежда като "изтичане" на имплементационни детайли навън. По-добре е да намериш друго решение. Мисля си и че би могъл да избегнеш това разделение, като по някакъв начин уеднаквиш вътрешния интерфейс на филтрите. -
Когато имаш многоредов израз след
then
(редове 54-56), по-добре пропусниthen
и сложи израза на нов ред:when :non_negative array.select do |element| element.class != Complex and element >= 0 end
Никога не свалай аргументите на блок на нов ред (визирам горния пример).
|foo|
трябва да идва веднага следdo
/{
.- Проверявай дали обект е от даден клас с
foo.is_a?(SomeClass)
. - Паралелното присвояване на ред 81 (и сходни) обикновено се избягва. На два реда си е достатъчно четимо.
- Не съм сигурен дали
array
е добро вътрешно име за параметъра въвFilter
. Тези филтри са специализирани. Може би трябва да еnumbers
.
Мога да опонирам относно:
Ако имаш предвид include? oт Enumerable, не върши работа в случая, тъй като трябва да се сравнят оценъчно. Т.е. трябва да обходя с енумератор цялото множество. Мисля, че с any? ще изглежда по-чисто, но ако имаш по-добра идея, ще очаквам да ми я споделиш след като изтече срока за предаване. : -)
Oтносно разделението на различните attr-whatever - ок. Но не е описано в style guide-а на курса, а в bbatsov-ия писането на два един под друг не е посочено като проблем (даже е използвано в примери).
Относно archie - явява се slang за array. :D Тъй като не бях правил много итерации по него, съм го пропуснал. Благодаря за коментара - изчисти ми позицията относно няколко концепции.