Петър обнови решението на 16.10.2015 12:28 (преди над 9 години)
Мислех доста как може да си опростя кода и за момента това съм измислил. Бих се радвал, ако ми дадете някакви насоки или препоръки как мога да си подобря кода. :)
.................... Finished in 0.02145 seconds 20 examples, 0 failures
Мислех доста как може да си опростя кода и за момента това съм измислил. Бих се радвал, ако ми дадете някакви насоки или препоръки как мога да си подобря кода. :)
Извинявай, злощастно сме те пропуснали. Най-вероятно защото в списъка с всички решения, твоето има коментар и не сме видяли, че не е от нас. Ще се опитам да внимавам повече в бъдеще. Ето няколко насоки за подобрение:
snake_head.map.with_index { |m, i| m + direction[i] }
е малко overkill, искаше просто [x1 + y1, x2 + y2]
.move
one-liner, ако беше видял Array#drop
. Подобно за grow
- няма много смисъл от междинната променлива.if x then true else false
конструкциите с еквивалентното само x
.Главните забележки са откъм имена:
get_new_snake_x_y
не е много ясно какво значи. Като правило, не използвай get_foo
за имена в Ruby, не носи информация отвъд foo
. Останалата част се чете като x и y на новата змия. Една идея по-ясно ще е координатите на новата змия. Но идва третия проблем - това всъщност са координатите на новата глава. Можеше да е просто new_head или position_ahead/next_square.temp
за име на променлива. Не носи никаква информация за съдържанието. Винаги си задавай въпроса Какво значи тази стойност в домейна на решавания проблем?. Например тук можеше да я кръстиш taken
(за заети полета).width_arr
). arr
не е близко до домейна на проблема, а е имплементационен детайл. Също ще трябва и да сменяш името, ако после решиш да използваш друг тип. Ако си искал да държиш височини, вместо height_arr
използвай heights
.check_next_position
разбирам ще взема следващата позиция и ще проверя нещо за нея. Ти вече й подаваш следващата позиция, съотвено би следвало да е само check_position
(проверява позицията, която й е подадена, а не следващата на тази, която е подадена). В Ruby конвенцията казва, че имената на предикатите трябва да завършват на ?
. Можеше да си и малко по-ясен от check
. Например position_in_bounds?
.Благодаря за насоките. Ще гледам занапред да си именовам променливите по-добре.
Относно get_new_x_y, исках просто да си поиграя с нещо по-различно и да се разръчкам.
Относно if x then true else false конструкцията, тя не се ли използва когато е one-line statement, тъй като при мен е multi-line, или поне така си мисля :D. Също така как е по-добре с (if/then/else/end) или с (?:) конструкцията.
Това с if x then true else false
го казах примерно, ?:
се предпочита - да (ако няма странични ефекти). Многоредово, принципът е същият:
if some_boolean_value
true
else
false
end
E напълно еквивалентно на просто some_boolean_value
.