@EgorSvinarev

Как разделить логику внутри метода?

Добрый день!
Анализируя свой код, я понял, что внутри метода моего сервиса выполняется слишком много логики, которая по большей части является предусловиями для основной логики. Это выглядит примерно так:
код

public void method() {

    // Обработка Optional на 15 строк с проверкой на null
    Optional<User> user = userRepositoyry.findById(id)

    // Еще всякая всячина
    // Запись файлов для необходимой логики,  логирование, обработка входных и выходных данных и т.д.  

    // И чуть-чуть основной логики
}



По идее я не могу убрать эту рутинную логику, потому что без нее основная не будет работать. Но, учитывая, что я не совсем хорошо знаю паттерны проектирования, я предполагаю, что есть какой-либо паттерн, решающий эту проблему. Я натыкался на паттерн "Цепочка обязанностей", который частично вроде бы должен решать эту проблему. Правильно ли я копаю и есть какие-либо другие решения?
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 2
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Если вы установите Sonarlint, то наверняка он пожалуется на то, что ваш метод можно упростить.
Также обратите внимание на то, что 1 метод должен отвечать за 1 функционал.
Если у вас в названии метода есть например, ключевое слово And, то как минимум ваш метод можно разделить на 2 метода. На сайте refactoring.gugu есть неплохой видеокурс и книга по clean code. Но наверное, все же стоит обратиться к более академическим источникам.

Вот, эту строку можно вынести в отдельный метод:
Optional<User> user = userRepositoyry.findById(id)
Например,
public User findUserById(Long id) {
	userRepository.findById(id)
	.orElseThrow(ResourceNotFoundException::new);
}


// Запись файлов для необходимой логики, логирование, обработка входных и выходных данных и т.д.

Логирование

Наверное, не самая лучшая идея с точки зрения простоты реализации, но можно использовать возможности AOP для логирования. Например, если вы используете Spring, то вы можете использовать Spring AOP (before, after, around, afterReturn)
Обработку входных и выходных данных можно вынести в отдельные приватные методы.

Не видя полную задачу сложно что-либо еще объективно сказать. Что касается паттерна Chain of Responsibility, то на мой взгляд он вам тут не поможет.
Ответ написан
Комментировать
igordance
@igordance
Могу посоветовать книги "Чистый код" Робба Мартина или "Совершенный код" Макконелла - помогут разобраться с проектированием классов и методов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект