Спасибо. С вашим каналом начинал в ИТ. Паттерны отлично объяснили, да и сейчас интересно.
@EugeneSuleimanov Жыл бұрын
Большое спасибо за отзыв!
@BCEMCPATb Жыл бұрын
Єдріть твою… прикольно подивитись як правильно складається усе. Давай більше!
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв :)
@YaroslavGutiy-b2d Жыл бұрын
Євгеній привіт, буду радий ролику про кешування. Різного роду стратегії та налаштування. Надіюсь тобі теж буде цікава подібна тема для відео)
@ТатьянаГромова-ы1м Жыл бұрын
Благодарю за этот ролик. Смотрю ваши видео и всегда много полезного для себя отмечаю
@EugeneSuleimanov Жыл бұрын
Большое спасибо за отзыв!
@antonshtilenko4419 Жыл бұрын
Спасибо за ролик! Уже предвкушаю 30 минут интересного и познавательного контента
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв :)
@tims7036 Жыл бұрын
Не поленюсь написать комментарий, чтобы больше начинающих разаботчиков увидели этот шикарный ролик 👍 Вот интересно, решение и правда приходит на лету одним дублем, или всё же была какая-то предварительная подготовка? Я бы тупил над чем-то похожим полдня в лучшем случае, а не 30 минут 🥲
@EugeneSuleimanov Жыл бұрын
Большое спасибо за отзыв! Именно это видео - одним дублем :)
@Kiberpiest1 Жыл бұрын
Спасибо! Как всегда на высоте.
@EugeneSuleimanov Жыл бұрын
Спасибо, Петя :)
@SplashDmg2011 Жыл бұрын
Кто захочет потренироваться - рекомендую реализовать умного PC, который ходит не рандомно, а выбирает самый выгодный ход. Довольно интересная задачка для обучения.
@EugeneSuleimanov Жыл бұрын
Хорошая идея и спасибо за комментарий!
@ГлебВалерьевич-у6ы Жыл бұрын
Ожидал увидеть рефакторинг в плане чистки кода, а оказалось полное переписывание приложения)) Общий посыл понятен, отличная работа, спасибо! В плане клинкода еще можно было бы: 1) переименовать методы, возвращающие булеаны в isWinner(Player), isValidMove(Move) потому, что, как мне кажется, check и validate скорее намекают на какой то войд метод 2) вынести всю логику в if(currentPlayer == ...) в отдельные методы, внутри которых вызывать ход и проверку на победу + выход из игры через System.exit() (чтобы избавиться от break в цикле) 3) смену текущего игрока вынести в отдельный метод (для того, чтобы не мешать разные уровни абстракции в методе) тогда play() станет еще проще и читабельнее
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Сначала смотрел, как переписать первый вариант, но вышло очень «не боевое» решение. По именованию методов - согласен, можно было сделать так.
@M.Makart Жыл бұрын
Очень зашёл ролик. Можно при желании сделать такое же видео с примером декомпозиции, но с игрой посложнее, вроде тетриса или Xonix.
@EugeneSuleimanov Жыл бұрын
Спасибо за отзыв! Да, уверен, что в этом формате можно будет сделать серию видео.
@eugenmorozov9738 Жыл бұрын
Как и всегда, очень хорошая подача материала, просто гениально! Евгений, а если написать prompt запрос и вложить в него все те условия и изменения, которые были сделаны вручную. Или привести чат бот через итерации к наиболее ожидаемому варианту? Немножко концовку видео можно было бы переиграть, чтобы сравнить проитерированный результат бота со своим решением. А так выходит, что результат явно в пользу «кожаных мешков» 😂
@EugeneSuleimanov Жыл бұрын
Большое спасибо за отзыв! P.S.: Идея хорошая, но не додумался до неё. Пусть хоть здесь у нас будет мнимое преимущество :)
@JohnDoe-km7ch Жыл бұрын
Мне кажется, что хранить поле 2мерным массивом удобнее. В таком случае не нужно хранить комбинации. Условие выигрышной комбинации i для всех ячеек рано (строка), j для всех ячеек равно (столбец), i=j диагональ. Тогда логика не продается при попытке увеличить поле. Положим, правило: победитель должен зачеркнуть 3 последовательных ячейки на поле 5х8.
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Как один из вариантов, но основной посыл был в том, что мы отделяем хранилище и представление о нем во вне.
@M.Makart Жыл бұрын
Можно у класса Field создать метод get(int xPos, int yPos) { int sideLength = (int) Math.sqrt(storage.length); return storage[sideLength * xPos + yPos]; }, который выдаст нужный элемент одномерного массива storage.
@EugeneSuleimanov Жыл бұрын
@@M.Makart Безусловно - нет предела совершенству при рефакторинге :) Спасибо за комментарий!
@Arulomp Жыл бұрын
Предложил бы пару доработок. Валидацию ввода и проверку победителя стоит перенести из GameLogic в Field. Сейчас изменение размера поля потребует и изменения GameLogic. А вот вывод поля в текущем примере я бы перенес в GameLogic, чтобы вся работа с консолью была сосредоточена в одном месте. В идеале, конечно, вообще разделить вывод на экран и игровую логику на разные классы.
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий. Мои мысли были такие: Валидация и проверка не должны относиться к полю по SRP. Это как шахматы и доска. Доска не знает про правила и на ней можно играть в шашки и в «Чапаева». Примерно, так.
@ГосподинИнквизитор Жыл бұрын
Как мне кажется есть небольшая ошибка при создании поля игры, реализован конструктор, который позволяет создавать Доски произвольного размера, условно хотели 5 на 5 клеток, однако в методе printBoard() в условии идёт переход на следующую стоку после каждого 3го элемента, а значит у нас будет 8 клеток вниз и 3 вбок... Из возможных фиксов добавление 2х полей с высотой и шириной доски, вместо if( i % 3 ...) поставить if( i % width ...), ну и конструктор чуть подправить Не знаю, маленькая ошибка или так и задумано, но мнением поделился
@kras_mazov Жыл бұрын
Почему-то мне кажется, что с двумерным массивом было бы проще и очевиднее. И проверять победу можно было бы не тупо перечислением всех победных комбинаций, а логикой. Что позволило бы, например, использовать игровое поле произвольного размера.
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Да, рабочий вариант. Выбрал одномерный, чтобы подчеркнуть разницу между восприятием человека и работой машины.
@ЮрийБродинский Жыл бұрын
Привет! Я бы выделил для сущности игрока отдельный интерфейс и сделал бы разные реализации (человек, компьютер и тд). Игроков можно было бы запихнуть в массив и ввести переменную turn, которая менялась бы в конце цикла и по ней в начале каждой итерации вытягивать игрока и вызывать у него метод move для получения позиции. Но это так, навскидку, по-хорошему пока сам не начнешь писать, сложно сказать, проявят себя предложенные идеи лучше или хуже.
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Здесь масса вариантов, как это можно обыграть и нет единственно верного.
@andreyyyymeee1323 Жыл бұрын
годно
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий!
@alexf990710 ай бұрын
Здравствуйте. Хочу предложить идею для одного из следующих роликов - запилить какое-то Spring приложение использующее API ChatGPT.
@EugeneSuleimanov10 ай бұрын
Уже есть в планах. Спасибо за предложение!
@Олександр-ч4ъ Жыл бұрын
"У меня все ходы записаны"))))
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий :)
@maksimus.ssirotkin1124 Жыл бұрын
Здравствуйте, почему класс называется Field?
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Как поле, доска. Можно было назвать Board.
@maksimus.ssirotkin1124 Жыл бұрын
@@EugeneSuleimanov Простой поле, клетка, доска board, думаю лучше.)
@tiy2000 Жыл бұрын
А при ничьей ваш алгоритм не зависнет?
@EugeneSuleimanov Жыл бұрын
Большое спасибо за комментарий и замечание! Есть такое упущение :) Не совсем зависнет, но ввести новые данные будет невозможно.
@maksimus.ssirotkin1124 Жыл бұрын
А если бы писали на С? Там ведь нет классов? Или есть? Как бы это все делилось?
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий. В Cи есть struct. Попробовал бы через них.
@hankie5 Жыл бұрын
Можно было логику выигрыша валидации и т.д. вынести в интерфейс GameLogic с пометкой default
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий. Возможный вариант. Здесь я придерживался подхода - "одна точка входа". Это, в данном случае, дает нам больше гибкости по реализации разных правил.
@МаксимЖивотовский-ц8о Жыл бұрын
+
@mashinis Жыл бұрын
По моему, улучшения кода, с генерированного ChatGPT не произошло. Автор видео просто реализовал своё видение программы. По моему, ChatGPT отлично справляется с рефакторингом своего кода, раскидывая сущности в отдельные классы. Надо только его об этом попросить.
@EugeneSuleimanov Жыл бұрын
Спасибо за комментарий! Ни в коем случае не претендую на идеальный код. Единственный момент, рефакторинг - это не "улучшение". "Процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы". ИМХО - то было достигнуто, но если есть конкретные замечания - буду рад конструктивной критике.
@tiy2000 Жыл бұрын
Хотел отправить свой вариант, но KZbin удалил комментарий со ссылкой на GitHub((