Refactoring: funzione di auto-invocazione invece del metodo Extract?

5

Sto leggendo il libro "Refactoring" e sono alla tecnica "Metodo di estrazione":

Codice originale:

void printOwing() {
  printBanner();

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

Codice refactored con tecnica "metodo Extract":

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

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

Cosa succede se invece scriverei una funzione immediatamente invocata, che avrebbe il vantaggio di isolare chiaramente e denominare il nome della parte di codice che avrei estratto? All'interno dell'IDE, potrei comprimere questo metodo e avere il vantaggio di vedere chiaramente il flusso senza il metodo estratto in qualche altro posto:

 void printOwing() {
      printBanner();

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

Non è meglio del "Metodo di estrazione"? Dalla tua esperienza?

    
posta Benj 18.06.2016 - 19:27
fonte

2 risposte

3

Che cosa motiva l'estrazione del metodo qui?

In questo articolo con il tuo esatto esempio dice:

"Più linee si trovano in un metodo, più difficile è capire quale sia il metodo. Questa è la ragione principale di questo refactoring."

Oltre a fornire un nome significativo per una porzione di codice, che anche la tua soluzione alternativa fa, in realtà lo spostamento del codice dal metodo originale mantiene i metodi piccoli e leggibili.

Modifica: come è stato sottolineato, rende più facile l'estrazione in classi e il riutilizzo. Elimina anche la condivisione complessa delle variabili tramite chiusure.

    
risposta data 18.06.2016 - 19:51
fonte
2

Un altro vantaggio oltre a nominare un pezzo di codice attraverso l'estrazione è renderlo disponibile per il riutilizzo. Una funzione invocata immediatamente non può essere chiamata da un contesto diverso, mentre una funzione / metodo separato può essere resa disponibile per codificare altrove.

    
risposta data 18.06.2016 - 23:22
fonte

Leggi altre domande sui tag