3.8 KiB
#рефакторинг #методы_рефакторинга
Проблема
У вас есть группа вложенных условных операторов, среди которых сложно выделить нормальный ход выполнения кода.
getPayAmount(): number {
let result: number;
if (isDead){
result = deadAmount();
}
else {
if (isSeparated){
result = separatedAmount();
}
else {
if (isRetired){
result = retiredAmount();
}
else{
result = normalPayAmount();
}
}
}
return result;
}
Решение
Выделите все проверки специальных или граничных случаев выполнения в отдельные условия и поместите их перед основными проверками. В идеале, вы должны получить «плоский» список условных операторов, идущих один за другим.
getPayAmount(): number {
if (isDead){
return deadAmount();
}
if (isSeparated){
return separatedAmount();
}
if (isRetired){
return retiredAmount();
}
return normalPayAmount();
}
Причины рефакторинга
Отступы каждого из уровней вложенности формируют в нем отчётливую стрелку, указывающую вправо. Разобраться в том, что и как делает такой оператор довольно сложно, так как «нормальный» ход выполнения в нем не очевиден. Такие операторы появляются эволюционным путём, когда каждое из условий добавляется в разные промежутки времени без мыслей об оптимизации остальных условий. Чтобы упростить такой оператор, нужно выделить все особые случаи в отдельные условные операторы, которые бы при наступлении граничных условий, сразу заканчивали выполнение и возвращали нужное значение. По сути, ваша цель — сделать такой оператор плоским.
Порядок рефакторинга
Постарайтесь избавиться от «побочных эффектов» в условиях операторов. Отделение запроса от модификатора (Separate Query from Modifier) может в этом помочь. Такое решение понадобится для дальнейших перестановок условий.
- Выделите граничные условия, которые приводят к вызову исключения или немедленному возвращению значения из метода. Переместите эти условия в начало метода.
- После того как с переносами покончено, и все тесты стали проходить, проверьте, можно ли использовать Объединение условного выражения (Consolidate Conditional Expression) для граничных условных операторов, ведущих к одинаковым исключениям или возвращаемым значениям.
