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ì?