Skip to content

Lazarev_FInal_24.01.2026#3

Open
AndreyLazareff wants to merge 4 commits intodemologin:mainfrom
AndreyLazareff:lazarev
Open

Lazarev_FInal_24.01.2026#3
AndreyLazareff wants to merge 4 commits intodemologin:mainfrom
AndreyLazareff:lazarev

Conversation

@AndreyLazareff
Copy link

No description provided.

@AndreyLazareff AndreyLazareff changed the title Шаблон_игры_19.01.2026г. FInal_24.01.2026 Jan 24, 2026
@AndreyLazareff AndreyLazareff changed the title FInal_24.01.2026 Lazarev_FInal_24.01.2026 Jan 24, 2026
Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Общий вывод по проекту

Общее заключение
Проект демонстрирует хорошее понимание основ Java и веб-технологий (Servlet API). Структура проекта логична, разделена на пакеты по функциональному назначению (model, service, controller), что соответствует принципам SOLID. Тестовое покрытие охватывает основные бизнес-сценарии, что является большим плюсом.

Основные зоны роста:

Обработка ошибок: Старайтесь избегать выбрасывания общих исключений вроде RuntimeException. Создание собственных иерархий исключений сделает код более предсказуемым.

Многопоточность: При работе с сервлетами всегда помните, что один экземпляр сервиса может использоваться сотнями пользователей одновременно. Используйте ConcurrentHashMap и избегайте изменяемого состояния в Singleton-объектах.

Инкапсуляция: Используйте возможности Java для защиты данных (например, Collections.unmodifiableList или List.of).

Вы на правильном пути! Использование Java 21 открывает множество возможностей для написания лаконичного и эффективного кода. Продолжайте изучать паттерны проектирования и подходы к тестированию — это те навыки, которые отличают профессионального разработчика. Удачи в кодинге!

Итоговая оценка: A


@Test
void winIncrementsStats() {
Player p = new Player("test", "hash");
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для создания тестовых данных рекомендуется использовать фабричные методы или паттерн Builder, чтобы тесты не зависели от изменений в конструкторе класса Player. [INFO]


class GameEngineTest {

private final GameEngine engine =
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Инициализация поля 'engine' напрямую в теле класса делает тест зависимым от внешнего ресурса (файла YAML) при каждом создании экземпляра теста. Рекомендуется перенести инициализацию в метод @beforeeach. [WARNING]


@BeforeEach
void setUp() {
service = PlayerService.getInstance();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование Singleton (getInstance) затрудняет изоляцию тестов. Желательно использовать внедрение зависимостей (Dependency Injection) для передачи сервиса в тесты. [ERROR]


@Test
void questsAreLoaded() {
Set<String> quests = QuestRegistry.getQuestIds();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тест завязан на конкретные названия квестов ('space', 'dungeon'). Если файлы будут удалены или переименованы, тест упадет. Стоит проверять структуру или наличие хотя бы одного элемента. [WARNING]

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("WEB-INF/index.jsp")
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Инвалидация сессии сразу после получения может привести к потере данных, необходимых для редиректа в некоторых контейнерах сервлетов. Лучше очищать конкретные атрибуты. [INFO]

LoadedQuest quest = QuestLoader.load(questPath);
this.scenes = quest.getScenes();
this.startSceneId = quest.getStartScene();
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Метод getScene возвращает null, если сцена не найдена. В Java 21 лучше возвращать Optional, чтобы заставить вызывающий код обработать отсутствие данных. [ERROR]


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Параметры из запроса (req.getParameter) могут содержать вредоносный код или спецсимволы. Необходимо экранировать данные перед использованием или отображением. [WARNING]

class QuestLoaderTest {

@Test
void questLoadsCorrectly() {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тест использует реальный файл 'dungeon.yaml'. Если файл будет изменен контент-менеджером, тест может сломаться. Для unit-тестов лучше использовать моки или временные файлы. [INFO]

}

} catch (IOException | URISyntaxException e) {
throw new RuntimeException("Failed to load quests", e);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Выбрасывание RuntimeException без уточнения типа ошибки затрудняет отладку. Рекомендуется создать собственное исключение, например QuestLoadingException. [WARNING]

public class GameResult {

@Getter
private final String nextSceneId;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если класс используется только для передачи данных между слоями, рассмотрите возможность сделать его поля final (иммутабельность) для обеспечения надежности данных. [INFO]

GDGo added a commit to GDGo/ProjectPantera that referenced this pull request Feb 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants