Refactoring di una classe di God Manager

2

Sto correndo nell'esatto problema Robert Martin menzionato quando ho una classe chiamata Manager , la mia ha troppa (ridondante).

Sto scrivendo un sistema che esegue calcoli su molti buffer contenenti dati che formano una sorgente con data e ora.

  • I buffer memorizzano diversi tipi di dati, sono classi template.
  • Quando arriva una nuova Osservazione, una BufferManager distribuisce ed elabora i campi dell'Osservazione ai diversi Buffer.
  • Un'operazione utente comune è quella di accedere a un intervallo di tempo di un determinato buffer.

Ho un BufferID emum di nomi in BufferManager , uno per ogni Buffer e poi ho dizionari (std :: map) in BufferManager , uno per ogni tipo di Buffer.

L'utente ottiene quindi l'intervallo desiderato di un buffer chiamando:

Type1Interval int1 =  BufferManager.getType1BufferInterval(BufferID, starTime, endTime)
...
TypeNInterval intN = BufferManager.getTypeNBufferInterval(BufferID, starTime, endTime)

dove l'unica differenza tra due di tali funzioni è che getTypeJBufferInterval accede al dizionario contenente i buffer di tipo J.

Come posso, dato un BufferID e un intervallo di tempo, restituire il Buffer corrispondente (valori) senza dover avere tutte queste diverse funzioni?

    
posta 1v0 19.08.2015 - 22:07
fonte

1 risposta

1

Puoi utilizzare la singola regola di responsabilità per suddividere questa classe manager.

Dalla tua descrizione, BufferManager contiene la raccolta di buffer, distribuisce ed elabora le osservazioni e fornisce l'accesso agli intervalli dei buffer.

Il primo passo è dividere i dati dal manager. La mappa e l'enumerazione non appartengono al gestore. Forse vuoi legarli insieme, nel qual caso dovresti creare una classe separata che possiede la mappa e enumare e dire chiamarla BufferMap .

Quindi puoi avere 2 classi diverse (o 3 se la distribuzione e l'elaborazione sono separabili). Quindi crea ObservationProcessor e BufferIntervalCalculator . Quindi i tuoi 2 metodi diventano:

BufferIntervalCalculator bufferIntervalCalculator(bufferMap);
ObservationProcessor observationProcessor(bufferMap);
observationProcessor.Process(observation);

Type1Interval int1 = bufferIntervalCalculator.calculateInterval<Type1Interval>(BufferId, startTime, endTime);
...
TypeNInterval intN = bufferIntervalCalculator.calculateInterval<TypeNInterval>(BufferId, startTime, endTime);
    
risposta data 21.08.2015 - 05:23
fonte

Leggi altre domande sui tag