Conversation
Общий вывод по проектуПредставленный код демонстрирует хорошее владение базовым синтаксисом Java и продвинутыми механизмами. Проект демонстрирует глубокое понимание принципов ООП и работы Java Servlet API. Однако, основной проблемой является игнорирование многопоточной специфики сервлетов: использование static полей и обычных HashMap для хранения данных пользователей и квестов приведет к ошибкам при реальном использовании. Пакет можно было сделать свой ;) Рекомендации:
Итоговая оценка: A (с авансом на будущее ;) |
| import java.util.concurrent.atomic.AtomicInteger; | ||
|
|
||
| public class Quest { | ||
| static AtomicInteger atomicInteger = new AtomicInteger(0); |
There was a problem hiding this comment.
Статическое поле 'atomicInteger' для генерации ID разделяется между всеми экземплярами класса в рамках JVM. Это может привести к непредсказуемому поведению в многопоточной среде сервлетов. Лучше перенести генерацию ID на уровень репозитория.
| this.name = name; | ||
| } | ||
|
|
||
| Map<Integer, Question> questions = new HashMap<>(); |
There was a problem hiding this comment.
Поля 'questions' и 'loseMap' имеют доступ по умолчанию (package-private). Согласно принципу инкапсуляции, их следует сделать private.
| public Question getQuestionById(int i){ | ||
| return questions.get(i); | ||
| } | ||
| public void crete(int i,String first, String second, String third, String lose){ |
There was a problem hiding this comment.
Опечатка в названии метода 'crete'. Следует исправить на 'create' для соблюдения чистоты кода и читаемости.
|
|
||
|
|
||
|
|
||
| private final Map<Integer, Quest> questMap = new HashMap<>(); |
There was a problem hiding this comment.
Использование HashMap в многопоточной среде (сервлеты) небезопасно. Рекомендуется заменить на ConcurrentHashMap для предотвращения Race Condition.
| return questMap.get(id); | ||
| } | ||
|
|
||
| public void crate(Quest quest){ |
There was a problem hiding this comment.
Опечатка в названии метода 'crate'. Следует переименовать в 'create'.
|
|
||
| @WebServlet("/quest") | ||
| public class NewQuest extends HttpServlet { | ||
| static int num; |
There was a problem hiding this comment.
Объявление переменных 'num' и 'name' как static в сервлете — критическая ошибка. Сервлет создается в единственном экземпляре, и эти данные будут перезаписываться при одновременном обращении разных пользователей.
|
|
||
| @WebServlet("/play") | ||
| public class Play extends HttpServlet { | ||
| int qid; |
There was a problem hiding this comment.
Поле 'qid' на уровне класса сервлета не является потокобезопасным. Значение, установленное одним пользователем, может быть прочитано другим. Данные состояния должны храниться в HttpSession.
| int qid; | ||
| @Override | ||
| protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { | ||
| System.out.println("=== PLAY POST ==="); |
There was a problem hiding this comment.
Использование System.out.println для логирования недопустимо в продакшн-коде. Рекомендуется использовать логгер (например, SLF4J + Logback).
| try{ | ||
| qid = Integer.parseInt(req.getParameter("questId")); | ||
| } | ||
| catch (Exception e){ |
There was a problem hiding this comment.
Пустой блок catch (Exception e) 'проглатывает' ошибки. Это затрудняет отладку. Необходимо как минимум логировать исключение.
| return; | ||
| } | ||
|
|
||
| if ( Create.questRepository.getById(qid).getQuestionById(que+1 ) == null){ |
There was a problem hiding this comment.
Сложная цепочка вызовов (Create.questRepository.getById...). Это нарушает закон Деметры. Следует извлечь объект Quest в локальную переменную.
| @WebServlet("/create") | ||
| public class Create extends HttpServlet { | ||
|
|
||
| public static QuestRepository questRepository = new QuestRepository(); |
There was a problem hiding this comment.
Публичное статическое поле 'questRepository' — это нарушение инкапсуляции и плохая практика управления зависимостями. Репозиторий должен внедряться через конструктор или Winter.find.
| public class Create extends HttpServlet { | ||
|
|
||
| public static QuestRepository questRepository = new QuestRepository(); | ||
| Quest quest; |
There was a problem hiding this comment.
Поле 'quest' в сервлете приведет к состоянию гонки (Race Condition). Перенесите его в локальную область видимости метода doPost.
|
|
||
|
|
||
| public class Answer { | ||
| String text; |
There was a problem hiding this comment.
Поля 'text' и 'id' не имеют модификаторов доступа. Их следует сделать private final.
No description provided.