Refactoring: função de invocação automática em vez do método Extract?

5

Estou lendo o livro "Refatoração" e estou na técnica "Extrair método":

Código original:

void printOwing() {
  printBanner();

  //print details
  System.out.println ("name:  " + _name);
  System.out.println ("amount " + getOutstanding());
}

Código refatorado com a técnica "Extrair método":

void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails (double outstanding) {
  System.out.println ("name:  " + _name);
  System.out.println ("amount " + outstanding);
}

E se, em vez disso, eu escrevesse uma função imediatamente invocada, que teria o benefício de isolar claramente e rotular com nome a parte do código que eu teria extraído? Dentro do IDE, eu poderia recolher este método e ter o benefício de ver claramente o fluxo sem o método extraído em algum outro lugar:

 void printOwing() {
      printBanner();

   void printDetails (double outstanding) { // collapsed in the ide
      System.out.println ("name:  " + _name);
      System.out.println ("amount " + getOutstanding());
     }() // self invokation
    }

Isso não é melhor que o "método de extração"? De sua experiência?

    
por Benj 18.06.2016 / 19:27
fonte

2 respostas

3

O que motiva a extração de método aqui?

Em este artigo com o seu exemplo exato , ele diz:

"Quanto mais linhas encontradas em um método, mais difícil é descobrir o que o método faz. Essa é a principal razão para essa refatoração."

Além de fornecer um nome significativo para um trecho de código, o que sua solução alternativa também faz, na verdade, mover o código para fora do método original mantém os métodos pequenos e legíveis.

Edit: Como foi apontado, facilita a extração para classes e reutilização. Também elimina o compartilhamento complexo de variáveis por meio de encerramentos.

    
por 18.06.2016 / 19:51
fonte
2

Um benefício adicional além de nomear um trecho de código por meio da extração é disponibilizá-lo para reutilização. Uma função invocada imediatamente não pode ser chamada de um contexto diferente, enquanto uma função / método separada pode ser disponibilizada para codificar em outro lugar.

    
por 18.06.2016 / 23:22
fonte