Substituir Condicional Aninhada por Cláusulas de Guarda.
Você tem um grupo de condicionais aninhadas e é difícil determinar o fluxo normal de execução do código.
Isole todas as verificações especiais e casos de borda em cláusulas separadas e coloque-as antes das verificações principais. Idealmente, você deve ter uma lista “plana” de condicionais, uma após a outra.
##Example
public double getPayAmount() {
double result;
if (isDead){
result = deadAmount();
}
else {
if (isSeparated){
result = separatedAmount();
}
else {
if (isRetired){
result = retiredAmount();
}
else{
result = normalPayAmount();
}
}
}
return result;
}public double getPayAmount() {
if (isDead){
return deadAmount();
}
if (isSeparated){
return separatedAmount();
}
if (isRetired){
return retiredAmount();
}
return normalPayAmount();
}##Why Refactor
Identificar a “condicional do inferno” é bastante fácil. As indentações de cada nível de aninhamento formam uma seta, apontando para a direita na direção da dor e do sofrimento:
if () {
if () {
do {
if () {
if () {
if () {
...
}
}
...
}
...
}
while ();
...
}
else {
...
}
}
É difícil descobrir o que cada condicional faz e como, já que o fluxo “normal” de execução do código não é imediatamente óbvio. Essas condicionais indicam uma evolução desordenada, com cada condição adicionada como medida paliativa sem qualquer reflexão sobre a otimização da estrutura geral.
Para simplificar a situação, isole os casos especiais em condições separadas que encerram a execução imediatamente e retornam um valor nulo se as cláusulas de guarda forem verdadeiras. Na prática, sua missão aqui é deixar a estrutura plana.
##How to Refactor
Tente livrar o código de efeitos colaterais—Separar Consulta de Modificador pode ser útil para esse propósito. Essa solução será necessária para a reorganização descrita abaixo.
-
Isole todas as cláusulas de guarda que levam à chamada de uma exceção ou ao retorno imediato de um valor do método. Coloque essas condições no início do método.
-
Depois que a reorganização estiver concluída e todos os testes passarem com sucesso, veja se você pode usar Consolidar Expressão Condicional para cláusulas de guarda que levam às mesmas exceções ou valores retornados.