Основные возможности платформы Hexlet не доступны в вашем браузере. Пожалуйста, обновитесь.

Комментарии в код ревью

Конструкция:

if (Xcount <= Ocount) return "X"; else return "Y";

Выглядит жутковато, лучше используй скобки, или для короткой записи тернарный оператор.

Повторяющиеся запросы лучше выносить в переменную например: int fieldSize = field.getSize()

08 марта, 06:43

xCounter == 0 && oCounter == 0 || xCounter == oCounter

разницы в этих сравнениях нету, можно одну убрать)

08 марта, 06:26

Так будет более читаемо, вы правы) У меня была проверка ` if (checkCoordinate(x) || checkCoordinate(x)) {

return false;

} но вариант, который вы предложзили определенно лучше читаем: if (!checkCoordinate(x) || !checkCoordinate(x)) {

return false;

} `

08 марта, 05:49

Влад, спасибо за совет. Только вот со знаками вроде напутали? должно быть так: private boolean checkCoordinate(final int coordinate) { return (coordinate < 0 || coordinate > Field.getSize()) ? false: true; }

07 марта, 07:55

И кстати в данном случае человек не сможет походить по части доски так как field.getSize() - 1 = 3 - 1 = 2 то есть условие пропустит 0 и 1 а 2 уже нет так как 2 < 2 не будет верно.

07 марта, 06:46

(field.getSize() - 1)) Обращение к статическим полям лучше делать через класс Field.getSize()

И избегать как огня таких моментов где для правильности уравнения нужно отнимать, прибавлять 1... )

07 марта, 06:28

Ух :)

(point.x < (field.getSize() - 1)) && (point.x >= 0) && (point.y < (field.getSize() - 1)) && (point.y >= 0)

Много повторяющегося кода, чтоб избежать этого можно сделать проверку общую для x и y допустим так:

return (coordinate < 0 || coordinate > Field.getSize()) ? true : false;

И передавать в метод по одной координете.

07 марта, 06:27

В идеале лучше чтоб каждый метод как можно меньше был привязан к окружающим сущьностям лучше упростить checkCoordinates и передавать ему просто int но вызвать функцию два раза.

Например private boolean checkCoordinate(final int coordinate) { return (coordinate < 0 || coordinate > Field.getSize()) ? true : false; }

07 марта, 06:19

С функцией length - стоит быть осторожным и понимать что она вернет длинну первого массива, но если поле 3 на 4 - здесь будет прокол.

Лучше занеcти информацию о размере поля в статик переменную и использовать ее для назначения массива и возавразать ее из метода.

07 марта, 06:17

public String[][] figures = new String[3][3]; public int getSize() { return 3; }

Любые значения которые могут изменятся стоит заносить в переменные, допустим в public static int $FIELD_SIZE = 3;

Граматика метод называется chekKoordinat но переменная coord P.s Сокращения лучше не использовать

Так-же в методе checkKoordinat нужно проверять еще на максимальное значение.

Для этого field.figures[point.x][point.y]=="" у тебя есть метод field.getFigure() В реальном коде поля будут недоступны из другого класса, так как это смый плохой вариант для поддержания и дебагинга кода)

А вообще попробуй все стереть и сделать еще раз но более вдумчиво, и пересмотрев предыдущее уроки, и все получится)

07 марта, 06:11

по красоте - size надо делать final;

String winner не нужен.

06 марта, 20:02

Попытался сделать универсальный алгоритм для любого размера поля. Решение "в лоб".

06 марта, 19:55

Итеративный процесс.

06 марта, 10:56

Добрый день, не пойму, для чего в задании предлагается использовать функцию для поиска подстроки substr? Задача и без неё решается.

06 марта, 02:00

почему r * r не надо заключать в скобки?

05 марта, 16:35

Спасибо большое - разобрался.

03 марта, 16:14

в "решении учителя" внутри цикла вот такая вещь

    final Point p = new Point();
                p.x = i;
                p.y = i2;
                final String figure = field.getFigure(p);
                if (figure == null) continue;
                // вместо "equals" можно использовтаь стандартный оператор "==", 
                // но рекомендуется поискать то, зачем использовать именно "equals" для сравнения строк.
                if (figure.equals("X")) x++;
                if (figure.equals("O")) y++;

вопрос такой: если оно лучше, то чем? работать скорее всего будет медленнее, потому что каждый раз в цикле создается final Point p = new Point() , я в правильную сторону мыслю?

03 марта, 15:48

В данном коде на каждом рекурсивном вызове: во-первых, берётся первый символ str, во-вторых, берётся подстрока от str (без учёта первого символа под индексом 0). Таким образом достигается рекурсивный перебор каждого символа исходной строки, в результате которого (при "сворачивании" рекурсии) можно сложить слова "задом-наперед". Обратите внимание, как работает функция substr: первый параметр - строка; второй параметр - индекс символа, с которого будет начинаться новая подстрока; третий параметр - количество символов (начиная с индекса, указанного во втором параметре), которое нужно взять для новой подстроки. По факту, Вы не совсем корректно указываете третий параметр, потому что в том случае, если берёте подстроку, начиная со второго символа (индекс = 1), то до конца слова остаётся strings.length(str) - 1 символов. Но если в этом параметре указать больше символов, чем остаётся на самом деле (как это происходит в вашем коде), то всё равно возьмётся подстрока со второго символа до конца строчки, поэтому результат оказывается тот же самый.

Если загляните в модуль strings.js, то увидите что функция substr является "обёрткой" для вызова метода самой строки substr: т.е. в итоге str.substr(...).

03 марта, 14:07

Йоу

01 марта, 18:03

Да, то что это решение проходит тесты – совпадение.

return links.map(e => check(`${address}/${e}`));

Тут лучше Array#forEach. Ты же по сути не мапишь, а тебе просто пробежаться нужно.

01 марта, 14:28

Похоже, что я совершенно не понял задачу.

Теперь я понимаю, что нужно было ходить по ссылкам в одной сессии.

Кстати, я так и не понял почему колбек на ошибку ломает тесты, если вызывать его синхронно, без setTimeout.

01 марта, 14:22

Правилом хорошего тона будет еще добавить отступы между свойствами, когда будешь работать с кем-то в команде важно придерживаться одного стандарта)

01 марта, 06:29

После Руби точки с запятой все потерял : )

24 февр., 19:58

Круглые скобки в "Решении учителя" признак хорошего тона? п.с. Сказано создать Header, а компонент называется в файле Header1

24 февр., 15:22

Считаю некорректным без предупреждения использовать на курсе конструкции типа import, export и др. В двух роликах теории есть пример реализации render:

 render: function(){
   return <div>
    <h1>Привет</h1><h2>ошибка</h2>
   </div>
 }

но подобное решение render:

render: function(){
      return <b>This is my first component!</b>
}

не проходит проверку.

Не объясняется принцип создания компонента для дальнейшего экспорта.

24 февр., 13:16