Петър обнови решението на 16.10.2015 12:28 (преди около 10 години)
Мислех доста как може да си опростя кода и за момента това съм измислил. Бих се радвал, ако ми дадете някакви насоки или препоръки как мога да си подобря кода. :)
.................... 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.