La progettazione errata prevede che il client esegua il cast tra le interfacce?

4

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.

    
posta keelerjr12 12.12.2017 - 17:49
fonte

1 risposta

1

Should I use casting to get the different data that I want

No. L'uso dello stesso nome per due metodi diversi che fanno cose diverse non può essere una buona idea. Usando lo stesso nome per due metodi diversi che restituiscono dati diversi, in cui entrambi i metodi possono essere entrambi implementati dallo stesso oggetto, è destinato a causare confusione.

should I add new methods in MatchingTSP

Sì. Non c'è motivo per non creare nuovi metodi per le attività aggiuntive che sono necessarie per conformarsi a IMatchableTSP . Solo farlo renderà la vita meno confusa per le persone che usano le tue interfacce e probabilmente puoi evitare un'intera classe di bug relativi alla confusione semplicemente scegliendo nomi chiari.

    
risposta data 14.08.2018 - 21:30
fonte

Leggi altre domande sui tag