Skip to content

Buslovskii_Quest#18

Open
Kirill-Buslovskiy wants to merge 5 commits into
demologin:mainfrom
Kirill-Buslovskiy:buslovskii
Open

Buslovskii_Quest#18
Kirill-Buslovskiy wants to merge 5 commits into
demologin:mainfrom
Kirill-Buslovskiy:buslovskii

Conversation

@Kirill-Buslovskiy
Copy link
Copy Markdown

No description provided.

Copy link
Copy Markdown
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.

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

Проект представляет собой классическую реализацию веб-приложения на сервлетах с применением паттерна Front Controller. Структура кода понятна, разделение на пакеты логично, а наличие тестов свидетельствует о хорошем подходе к качеству. Основные замечания касаются архитектурной гибкости (жесткая привязка данных в коде), потокобезопасности при работе с общим состоянием в слушателях и использования устаревших способов логирования. Устранение «магических чисел» и переход на внешнюю конфигурацию квестов значительно повысят уровень проекта.

Проделанная работа впечатляет: структура команд и навигация по квестам реализованы очень аккуратно. Это отличная база для перехода к изучению Spring Framework, где многие из указанных замечаний решаются встроенными механизмами. Продолжайте развивать навыки проектирования, и архитектурное мастерство придет с практикой!

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

@Override
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
System.out.println("Session created. Active sessions: " + activeSessions);
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Использование System.out.println для логирования событий жизненного цикла сессии недопустимо в профессиональной разработке. Следует использовать специализированные фреймворки, такие как SLF4J с реализацией Logback, чтобы обеспечить гибкое управление уровнями логирования и форматом вывода. [WARNING]

@WebListener
public class SessionListener implements HttpSessionListener {

private static int activeSessions = 0;
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Поле activeSessions объявлено как статическое интовое значение без обеспечения потокобезопасности. В многопоточной среде сервлет-контейнера инкремент (++) и декремент (--) не являются атомарными операциями, что приведет к некорректному подсчету сессий. Рекомендуется использовать AtomicInteger. [ERROR]

request.getRequestDispatcher(view).forward(request, response);
}
} catch (Exception e) {
throw new ServletException("Error executing command", e);
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Перехват общего исключения Exception и его оборачивание в ServletException без предварительного логирования затрудняет отладку. Рекомендуется логировать стек вызовов перед пробросом исключения дальше. [INFO]

}
}

private String getCommandPath(HttpServletRequest request) {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Метод getCommandPath содержит избыточную логику парсинга URI с ручным поиском символов '?', '#' и '.'. Современные методы API HttpServletRequest уже предоставляют разделенные части пути, а логика очистки расширений файлов может быть вынесена в отдельный утилитный класс. [INFO]

}

private void initializeQuestions() {
questions = new HashMap<>();
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Инициализация вопросов внутри конструктора класса жестко связывает логику квеста с данными. Это нарушает принцип единственной ответственности (SRP). Рекомендуется вынести конфигурацию вопросов во внешние файлы (JSON/XML) или использовать паттерн 'Фабрика' для загрузки данных. [WARNING]

private void initializeQuestions() {
questions = new HashMap<>();

questions.put(1, new Question(1,
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Тексты вопросов содержат многострочные литералы, смешанные с логикой кода. Это затрудняет локализацию приложения в будущем. Рекомендуется использовать ResourceBundle для хранения строковых ресурсов. [WARNING]

System.out.println("Session destroyed. Active sessions: " + activeSessions);
}

public static int getActiveSessions() {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Метод getActiveSessions является статическим. В контексте веб-приложения доступ к глобальному состоянию через статику — это антипаттерн, затрудняющий масштабирование и изоляцию данных приложения. [WARNING]

"Начать заново",
"Выбрать другой квест",
1, 1, true,
null,
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Передача null в конструктор Question для параметров victoryMessage/defeatMessage требует внимательной проверки на стороне получателя, чтобы избежать NullPointerException. Лучше использовать пустые строки или Optional. [INFO]

import java.io.IOException;

@WebServlet("/")
public class FrontControllerServlet extends HttpServlet {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Название класса FrontControllerServlet корректно отражает паттерн, однако логика обработки команд могла бы быть более гибкой при использовании маппинга через аннотации или конфигурационные файлы вместо ручного парсинга строк. [INFO]


import static org.junit.jupiter.api.Assertions.*;

class QuestTest {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Класс теста и методы не имеют модификатора доступа public, что допустимо в JUnit 5, однако стоит придерживаться единообразия во всем проекте относительно видимости тестовых компонентов. [INFO]

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