Александрина обнови решението на 16.10.2015 00:46 (преди над 9 години)
Индентирай правилно, на тази задача ще отнемаме точки за това. Оставяй място около операторите (визирам
=
,-
).-
Не сравнявай неща в условието на
if
сtrue
илиfalse
.Например 22-ри ред може да се запише така:
if !problem_one and !problem_two
А 43-ти ред може да се запише така:
if after_one or after_two
Общо взето сравнявайки булев израз с
true
получаваш същия булев израз. Сравнявайки булев израз сfalse
получаваш отрицанието на булевия израз.Другото е, че имаш разни места в кода (31-ви и 43-ти ред), където имаш
if булев_израз
и после връщашtrue
, ако булевия израз еtrue
иfalse
, ако булевия израз еfalse
. Това е безсмислено. Връщай си стойността на булевия израз, която еtrue
, ако той еtrue
, илиfalse
, ако той еfalse
.Например целия код от 43-ти до 45-ти ред може да се замени от единствения ред със следния булев израз:
after_one or after_two
-
Нека направим този 43-ти ред още по-четим :) Змията е в
danger?
, акоafter_one or after_two
. Това не звучи много смислено. Ако преименуваме променливите, може да стане например така:def danger?(...) ... dead_after_one_move or dead_after_two_moves end
Ахаа.. Сега вече разбирам какво се случва. Неоспоримо по-ясно е от:
if(after_one == true || after_two == true) true else false end
Руби е един от езиците, които ти дават много свобода на изразяване, затова и го обичаме толкова. Възползвай се от възможностите му !
Като си говорим за имена...
problem_one
иproblem_two
не са ок. Нищо не ми казват... Можеш ли да измислиш по-добри ?Несъмнено имената са много важни. С тях много по-лесно се разбират намеренията на кода. В Руби това е залегнало дълбоко в езика. Някои методи от
Array
например дори си имат синоними, защото една дума звучи по-добре от друга в различен контекст. Използвай имената, които звучат добре. Напримерsnake.last
за достъпване на последен елемент, вместо да правишsnake[snake.length - 1]
. Доста по-кратко и ясно е. Разгледай подробно документацията наArray
, ще ти бъде супер полезно.Когато имаш някаква сложна конструкция (като тази на 5-ти, 13-ти, 30-ти ред), която на всичкото и отгоре се повтаря, може да я скриеш зад фунция с ясно име. Помисли какво точно прави въпросната конструкция. Дай ѝ име. Така всеки път някой друг като я погледне ще разбере какво се случва, вместо да трябва да интерпретира кода.
Булевите изрази на 31-ви и на 33-ти ред също може да се именуват подобаващо. Успех !