Il design sbagliato prevede che il client esegua il cast tra le interfacce? Capisco che si possa fare, ma è pulito? Sto confrontando i profili di pensionamento in una simulazione. Ho 2 diversi tipi di TSP (penso a 401k). Ho una classe TSP, che contiene contributi dei dipendenti (nessuna corrispondenza governativa). MatchingTSP è un TSP, ma include anche i contributi di corrispondenza governativa. Esaminando specificamente questo caso:
- MY MYAIN MODEL -
interface ITSP
{
public void MakeContribution(...);
public double CalculateContributionByYear(int year);
public double CalculateCumulativeContributions(...);
public double CalculateTotal(...);
}
class TSP : public ITSP
{
public virtual void MakeContribution(...) {...}
public virtual double CalculateContributionByYear(int year) {...}
public virtual double CalculateCumulativeContributions(...) {...}
public virtual double CalculateTotal(...) {...}
private IList<TSPContribution> contributions;
}
interface IMatchableTSP
{
public void MakeContribution(...);
public double CalculateContributionByYear(int year);
public double CalculateCumulativeContributions(...);
public double CalculateTotal(...);
}
class MatchableTSP : public TSP, IMatchableTSP
{
public override void MakeContribution(...) {...}
public override CalculateContributionByYear(int year) {...}
public override CalculateCumulativeContributions(...) {...}
public override CalculateTotal(...) {...}
private IList<TSPContribution> contributions;
}
- CLIENT USE -
ITSP johnTSP = TSPFactory.CreateTSP();
ITSP jimTSP = TSPFactory.CreateMatchableTSP();
// Print BaseTSP Employee Contributions
Console.WriteLine(johnTSP.CalculateCumulativeContributions());
Console.WriteLine(jim.TSP.CalculateCumulativeContributions());
// Print MatchingTSP Contributions
Console.WriteLine((IMatchableTSP)jim.TSP.CalculateCumulativeContributions());
Quindi vedo due problemi qui: il client ha bisogno di eseguire il cast tra diverse interfacce per ottenere diversi tipi di dati. Le interfacce sono duplicate (violando DRY) per consentire questo casting tra le interfacce.
Devo utilizzare il casting per ottenere i diversi dati che desidero (ad esempio contributi dei dipendenti o contributi della corrispondenza governativa) o dovrei aggiungere nuovi metodi in MatchingTSP che includono MakeMatchingContribution (...), CalculateMatchingContributionByYear (int anno), ecc.