Skip to content

Первая реализация тз 10ого спринта.#1

Merged
Slavakorgg merged 3 commits intomainfrom
controllers-films-users
Mar 27, 2025
Merged

Первая реализация тз 10ого спринта.#1
Slavakorgg merged 3 commits intomainfrom
controllers-films-users

Conversation

@Slavakorgg
Copy link
Owner

No description provided.

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

Привет, Вячеслав! Спасибо за PR.

Отличная работа! :)
Отметил несколько моментов, но на самом деле в первую очередь посмотри, пожалуйста, вот что

  • исключение пусть у нас будет проверяемым
  • аннотация @Valid

@RequestMapping("/films")
@Slf4j
public class FilmController {
private final List<Film> films = new ArrayList<>();

Choose a reason for hiding this comment

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

По списку же искать муторно - надо все элементы перебирать, лучше взять какую-нибудь из реализаций Map, HashMap, ну или если хочется выпендриться, то ConcurrentHashMap. Web - конкурентная среда, одновременно может приходить множество запросов, надо уметь работать и в многопоточной среде

https://habr.com/ru/post/132884/



@PostMapping
public Film createFilm(@RequestBody Film film) {

Choose a reason for hiding this comment

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

А тут наверно надо добавить @Valid перед @RequestBody? :)

if (film.getName() == null || film.getName().isEmpty()) {
throw new ValidationException("Название фильма не может быть пустым");
}
if (film.getDescription().length() > 200) {

Choose a reason for hiding this comment

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

А если description == null, то мы получим ошибку :)

@@ -0,0 +1,7 @@
package ru.yandex.practicum.filmorate.exception;

public class ValidationException extends RuntimeException {

Choose a reason for hiding this comment

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

А подходит ли для данной ситуации непроверяемое исключение?
Пользователь ввел некорректные данные - вполне себе штатная ситуация, пусть тут будет проверяемое исключение :)
extends Exception

Есть еще такой признак - если исключение есть в бизнес-процессе, то его стоит сделать проверяемым. Так мы на уровне компилятора говорим о возможных альтернативных ситуациях и обязываем вышестоящий обработать их или эскалировать еще выше. По большому счету это и не ошибки вовсе, а некоторые отклонения от основного пути пользователя.
Например, снимаем денежку с карты в банкомате
стандартный путь: приложили карту, получили денежку
возможные отклонения

  • ввели сумму больше чем денег на балансе
  • карта заблокирована
  • ввели неверный пин-код
  • и пр

пример ошибки: у банкомата пропало соединение с интернетом (может и так он будет работать, не в курсе, но пусть будет что не может), эту ситуацию обрабатывать бессмысленно кроме как отобразить пользователю сообщение что "атм не работает" и прекратить все текущие операции до устранения внешней причины. И в бизнес-процессе этой ситуации нет, это чисто техническая история. Вот это уже RuntimeException

*/
@Getter
@Setter
@Data

Choose a reason for hiding this comment

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

@Data

С этой аннотацией надо поаккуратней. Она генерирует equals и hashCode на основании всех полей.
Однако, сущность - это не просто объект, это представление строки таблицы базы данных, а строку таблицы однозначно определяет ее идентификатор, и потому, соотвественно, для сущностей equals и hashCode стоит определять на основе id (первичного ключа).

Остальные поля, при этом, могут вообще быть разными, то есть могут существовать разные версии одного и того же объекта, но как это разруливатеся - это уже отдельная история.

Плюс еще некоторые поля могут быть ленивыми коллекциями и в момент обращения бдут генерироваться sql-запросы, которые и не нужны в данный момент

Т.е. лучше или переопределить руками или указать через аннотации как генерировать эти методы :)

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

.

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

Теперь все отлично, спасибо :)

@Slavakorgg Slavakorgg merged commit de9f630 into main Mar 27, 2025
2 checks passed
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.

3 participants