Решение на Втора задача от Диана Генева
Резултати
- 6 точки от тестове
- 1 бонус точка
- 7 точки общо
- 24 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
........................ Finished in 0.02232 seconds 24 examples, 0 failures
История (4 версии и 4 коментара)
Диана обнови решението на 23.10.2014 00:44 (преди около 10 години)
Като цяло много хубаво решение, браво! Само няколко неща:
- Имаш леки проблеми със space-овете. По конвенция трябва да оставяш едно празно място преди и след отварящата
{
и още едно преди затварящата}
когато става дума за блокове. Също не оставяй празни места между името на метод и скобите с аргументите или&
и името на block-a, който получаваш, както си направила в конструктора наFilter
. - Даваш повече знание и свобода за манипулация над твоите обекти, отколкото е нужно. Това нарушава Law of Dementer, който е един от градивните принципи за добър ООП дизайн. В момента няма нещо, което да има нужда от
attr_accessor :number_set
, съответно би следвалоNumberSet
да се опитва да си го крие. (: Това важи и за филтрите.Filter#condition
се извиква вNumberSet
, но никъде извън дефиницията на самите филтри не се променя. Следователно би било по-добре да използвашattr_reader
, а неattr_accessor
. Дори и така ще бъде малко спорно - външните класове трябва да знаят, чеcondition
е някакъв proc и да му викатcall
. Дали няма да е по-приятно, ако има по един предикат във филтрите, който скрива този имплементационен детайл? -
if not
е причинатаunless
да съществува. Условието и действията са достатъчно кратки, за да можеш да ги запишеш на един ред -x unless y
. - Това не е напълно вярна имплементация на
each
. Hint: виж какво би станало, ако го извикаш без блок. Дори и да го оправиш, няма нужда да преоткриваш колелото - можеш да го вземеш с име вNumberSet#each
и после да прехвърлиш работата наArray#each
. - Предпочитай наследяване пред mixin-ване в общия случай. Можеше
&
и|
да ги дефинираш въвFilter
и да го наследиш от другите два. Тогава ще имаш и опцията да употребишsuper
като директно подаваш block, без да трябва да минаваш през lambda-и. - Старай се именуването ти да е консистентно. number, n и x имат едно и също значение, но са три. Лично на мен ми харесва най-много number. Също result е доста общо. Опитай се да измислиш нещо по-говоримо.
- Кодът става по-красив, ако подравняваш някои конструкции, когато се срещат на съседни редове. Сред тях са
=
,then
и стойностите на hash-овете. - Слагай един празен ред между методите и клас макросите (
include
,attr_accessor
и т.н.), за по-добра четимост.
Голяма част от горните точки са по-скоро дребни неща. Не се притеснявай, справила си се похвално още от първата версия. (:
Диана обнови решението на 23.10.2014 21:33 (преди около 10 години)
Браво :)
На мен малко ми бърка в здравето това: @set = []
. Звучи ми като string = 42
. От друга страна, вграденият клас Set
не помага много, понеже той би приел 5
и 5.0
като различни елементи. Може би бих потърсил друго име за променливата, но, честно казано, нямам качествено по-добри идеи. Повечето хора използват @numbers
или @set
.
Диана и Никола, ако ви дойде по-добра идея, споделете. Ако не, просто игнорирайте бележката.
На мен лично @numbers
ми хареса. Иначе браво, оправила си важните неща, сори че не отговорих толкова време.
Ох, да си призная честно го смених от numbers на set само защото не можех да мина скептик за символи на ред. Реших, че е по-належащо да прекръсря result и n ( който беше n поради същите причини) Като го върна на numbers пак става 83... и вече ме дразни. Изглежда все едно съм си кръстила кучето Куче...май по-скоро все едно съм си кръстила кучето Котка... :/