Utilizzo del pattern Metodo di estrazione per rifattorizzare un metodo semplice con un ciclo for

1

Sto leggendo di nuovo parti specifiche del libro di refactoring di Martin Fowlers (le aree su cui non sono stato informato della prima volta). Sto guardando al capitolo del metodo Extract al momento. Posso capire perché il metodo Extract è benefico; ad esempio:

1) Ereditarietà e sovrascrittura

2) Chiarezza per l'utente della classe

Dire che ho un codice come il seguente (Questo è un servizio di dominio DDD). È un candidato per il metodo Extract?:

    public IEnumerable<KeyValuePair<int, int>> CalculateDenominationsFor(int cost) 
        {
            var target = cost;
            foreach (var denomination in currency.AvailableDenominations.OrderByDescending(a => a))
            {
               var numberRequired = target / denomination;
               if (numberRequired > 0)
               {
                   yield return new KeyValuePair<int, int>(denomination, numberRequired);
               }
               target = target - (numberRequired * denomination); 
            }
        }   

Suppongo di poter estrarre le seguenti linee di codice ai metodi:

target = target - (numberRequired * denomination); 

e

yield return new KeyValuePair<int, int>(denomination, numberRequired);

Le preoccupazioni che ho riguardo alle mie due idee sopra sono:

1) Sarebbero metodi privati quindi nessun vantaggio per il chiamante.

2) La classe è attualmente sigillata, quindi nessun beneficio di successione.

Esistono indicazioni disponibili che indicano quando utilizzare il metodo Extract? Sto pensando troppo a questo? Sto cercando di applicare questo principio di minimo stupore e mi ritrovo a ripensarci molto recentemente.

    
posta w0051977 27.01.2018 - 12:50
fonte

1 risposta

5

Sì, credo che tu stia pensando troppo! Non dovresti cercare "candidati per i refactoring". Dovresti cercare il codice che richiede miglioramenti e quindi cercare i refactoring come possibili strumenti per migliorare il codice.

Quindi la domanda è se il codice in questione:

  1. ha un problema
  2. Questo problema può essere alleviato applicando a refactoring

Non vedo le due espressioni in questione come problematiche, e non vedo come siano migliorate dai refactoring che suggerisci.

(Il metodo nel suo insieme potrebbe probabilmente essere più chiaro, ma non riesco a capire cosa sta succedendo, ma potrebbe essere solo la mancanza di contesto.)

    
risposta data 27.01.2018 - 13:16
fonte

Leggi altre domande sui tag