Raccolta calcolata troppo?

3

Diciamo che ho estratto una struttura dati come una lista; questo nuovo oggetto dovrebbe eseguire tutti i calcoli o solo fornire funzioni di calcolo minime e quindi consentire a un nuovo oggetto come ReportGenerator di eseguire calcoli su larga scala? Esempio di seguito:

QUESTO?

class WrappedCollection
{
  public double CalculateByYear(int year) {...}

  public double CalculateCumulativeByYear(int year) {...}

  public double CalculateTotal() {...}

  private IList<double> collection = new List<double>();
}

O QUESTO?

class WrappedCalculation
{
  public double CalculateByYear(int year) {...}

  public double CalculateTotal() {...}

  private IList<double> collection = new List<double>();
}

class ReportGenerator
{
  public ReportGenerator(WrappedCollection collection) {...}

  public double TotalByYear(int year) {...}
  public double CumulativeTotalByYear(int year) {...}
  public double Total() {...}

  private WrappedCollection collection;
}

Questa è una versione notevolmente semplificata; tuttavia, sto iniziando a notare che nella mia WrappedCollection ho bisogno di più metodi e mi sembra di violare l'SRP. La classe WrappedCollection dovrebbe solo gestire ciò che voglio (ad esempio il portafoglio di pensionamento di qualcuno) e il rapporto dovrebbe essere lasciato a un'altra classe che esegue tutti i calcoli.

Mi sembra di ricordare un esempio di Uncle Bob Martin o di Martin Fowler che mostrava di spingere tutti i dati raccolti più in basso nella gerarchia nelle raccolte stesse. Questo sembra generare più di 1 responsabilità.

Il progetto sta confrontando i portafogli di pensionamento; quindi non credo che il 401k di qualcuno debba darmi tutte le metriche come i contributi cumulativi, ecc. Dovrebbe solo darmi il suo totale attuale e forse un contributo per un dato anno in base al tipo (ad esempio, datore di lavoro vs contributo dei dipendenti). Un'altra classe può compilare un elenco dei contributi cumulativi. Sì?

    
posta keelerjr12 13.12.2017 - 17:15
fonte

2 risposte

0

La tua classe di portafoglio viola il Principio di Responsabilità Unica perché dispone di metodi per eseguire attività da due gruppi in gran parte ortogonali, ovvero il mantenimento del contenuto del portfolio e il calcolo delle metriche di reporting basate su quel contenuto.

Separare i due come hai fatto fornisce un miglioramento, ma potresti andare ancora oltre dando a WrappedCalculation un'interfaccia, ad esempio IWrappedCalculation e codificando ReportGenerator in termini di tale interfaccia. In questo modo potresti riutilizzare il generatore di rapporti che hai scritto per i portafogli di pensionamento per produrre rapporti per portafogli di altro tipo, ad esempio portafogli non pensionistici o combinazioni di diversi portafogli.

    
risposta data 13.12.2017 - 18:05
fonte
3

Ancora un altro sviluppatore silurato dai principi SOLID.

Responsabilità non significa "fare solo una cosa". Significa "avere una sola ragione per cambiare" o, più specificamente, "Questo è il posto dove andare a fare modifiche per questa area di interesse". Avere più metodi sulla tua classe non significa necessariamente che stai violando SRP.

Un repository non ha quattro responsabilità perché ha i metodi Crea, Leggi, Aggiorna ed Elimina. Ne ha solo uno: accesso ai dati.

I principi SOLID esistono per suggerire modi per migliorare la manutenibilità del tuo software. È la sostenibilità che dovresti perseguire, non l'aderenza servile ai principi arbitrari.

    
risposta data 13.12.2017 - 17:48
fonte

Leggi altre domande sui tag