ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Condicional Aninhada por Cláusulas de Guarda.

Problem

Você tem um grupo de condicionais aninhadas e é difícil determinar o fluxo normal de execução do código.

Solution

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

Before
public double getPayAmount() {
  double result;
  if (isDead){
    result = deadAmount();
  }
  else {
    if (isSeparated){
      result = separatedAmount();
    }
    else {
      if (isRetired){
        result = retiredAmount();
      }
      else{
        result = normalPayAmount();
      }
    }
  }
  return result;
}
After
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.

  1. 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.

  2. 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.