Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как отрефакторить данный код  [new]
JulT
Member

Откуда:
Сообщений: 1440
Всем привет. Подскажите пожалуйста, как можно красиво отрефакторить данный кусок кода:

public ResponseHolder getPaymentById(parameters) {
if (condition 1){
return ResponseHolder.builder()
.fail(....)
.build();
}
if (condition 2){
return ResponseHolder.builder()
.fail(....)
.build();
}

some logic

if (condition 3){
return ResponseHolder.builder()
.fail(....)
.build();
}

return ResponseHolder.builder()
.success(....)
.build();
}
Спасибо!
14 фев 19, 20:25    [21809950]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 16730
JulT,

switch ?
14 фев 19, 20:35    [21809960]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
JulT
Member

Откуда:
Сообщений: 1440
вадя
JulT,

switch ?

нет, свитч это не красиво)
14 фев 19, 20:37    [21809963]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42472
А что здесь происходит?

.fail(....)
14 фев 19, 20:39    [21809964]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
JulT
Member

Откуда:
Сообщений: 1440
mayton
А что здесь происходит?

.fail(....)

new MessageError(...)
14 фев 19, 20:40    [21809965]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42472
JulT
mayton
А что здесь происходит?

.fail(....)

new MessageError(...)

А что скрыто за точками? Там - текст который зависит от кондишенов?
14 фев 19, 20:41    [21809966]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
mayton
текст который зависит от кондишенов?
+1
В этом вся соль вопроса.
А не в удалении if.
14 фев 19, 21:43    [21809998]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
Сначала надо определиться по какому критерию рефакторить, это пункт 1. Пункт два прямо зависит от пункта 1
14 фев 19, 22:00    [21810011]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
JulT
Member

Откуда:
Сообщений: 1440
new MessageError(MessageCategory.ERROR, SERVICE_INVALID)
new MessageError(MessageCategory.ERROR, PRODUCT_NOT_FOUND)
или
new MessageError(MessageCategory.WARNING, SERVICE_UNKNOWN)
14 фев 19, 22:11    [21810019]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42472
JulT
new MessageError(MessageCategory.ERROR, SERVICE_INVALID)
new MessageError(MessageCategory.ERROR, PRODUCT_NOT_FOUND)
или
new MessageError(MessageCategory.WARNING, SERVICE_UNKNOWN)

А вы - хитрая лиса. Почему-бы сразу это не написать?

Вообще рефакторинг предполагает некий набор эквивалентных трансформаций
которые улучшают характеристики кода. И эти транформации должны быть доказуемыми.

А у вас - что? Что такое some logc? Мы можем эффективно свернуть часть вашего кода.
Но нам нужно понимать какая функциональная связь существует между condition 3
и some logic. Вы не дали этой информации.

Если conditions завияст от parameters и если выбросить этот some logic то ваш код это по сути (в стиле
функционого программирования) мог бы выглядеть так.

Object decodeMessageError(parameters) {
    // ....
    return new MessageError(condition1 ? ERROR ? condition2 : ...., ...... );
}

public ResponseHolder getPaymentById(parameters) {
     return ResponseHolder.builder()
                       .fail(decodeMessageError(parameters))
                       .build()
}
15 фев 19, 00:01    [21810074]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
JulT, а что за сервис то и как так может быть, что он анноун?
15 фев 19, 09:59    [21810224]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
JulT, а что за сервис то и как так может быть, что он анноун?


Если же брать общий случай, то все обработку ошибок надо выносить на уровень @ControllerAdvice`ов. Для себя использовать какие-нить кастомные exception`ы, унаследованные от RuntimeException`а, чтобы код не загрязнять.
Ошибку на уровне репозитория типа NotFoundException обрабатывать в сервисе не надо, пусть летит дальше, либо делать ретроу своей ошибки, чтобы код опять же не загрязнять.
15 фев 19, 10:05    [21810232]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3189
JulT
Всем привет. Подскажите пожалуйста, как можно красиво отрефакторить данный кусок кода:

public ResponseHolder getPaymentById(parameters) {
if (condition 1){
return ResponseHolder.builder()
.fail(....)
.build();
}
if (condition 2){
return ResponseHolder.builder()
.fail(....)
.build();
}

some logic

if (condition 3){
return ResponseHolder.builder()
.fail(....)
.build();
}

return ResponseHolder.builder()
.success(....)
.build();
}
Спасибо!


Return должен быть один в методе.

Хорошего Вам дня!
15 фев 19, 20:48    [21811226]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
chpasha
Member

Откуда:
Сообщений: 8451
Valentin Kolesnikov
Return должен быть один в методе.

это весьма спорное утверждение
15 фев 19, 23:30    [21811300]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
mayton
Member

Откуда: loopback
Сообщений: 42472
Есть Guard Expressions.
15 фев 19, 23:36    [21811302]     Ответить | Цитировать Сообщить модератору
 Re: Как отрефакторить данный код  [new]
JulT
Member

Откуда:
Сообщений: 1440
всем спасибо
19 фев 19, 13:12    [21814252]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить