Ho diverse classi che ereditano tutte da una classe base generica. La classe base contiene una raccolta di diversi oggetti di tipo T.
Ogni classe figlio deve essere in grado di calcolare i valori interpolati dalla raccolta di oggetti, ma poiché le classi figlio usano tipi diversi, il calcolo varia leggermente da classe a classe.
Finora ho copiato / incollato il mio codice da una classe all'altra e ho apportato piccole modifiche a ciascuno. Ma ora sto cercando di rimuovere il codice duplicato e sostituirlo con un metodo di interpolazione generico nella mia classe di base. Tuttavia, ciò si sta rivelando molto difficile e tutte le soluzioni che ho pensato sembrano troppo complesse.
Sto iniziando a pensare che il principio DRY non si applichi tanto in questo tipo di situazione, ma suona come una bestemmia. Quanta complessità è eccessiva quando si tenta di rimuovere la duplicazione del codice?
MODIFICARE:
La migliore soluzione che posso trovare è qualcosa del genere:
Classe base:
protected T GetInterpolated(int frame)
{
var index = SortedFrames.BinarySearch(frame);
if (index >= 0)
return Data[index];
index = ~index;
if (index == 0)
return Data[index];
if (index >= Data.Count)
return Data[Data.Count - 1];
return GetInterpolatedItem(frame, Data[index - 1], Data[index]);
}
protected abstract T GetInterpolatedItem(int frame, T lower, T upper);
Classe A per bambini:
public IGpsCoordinate GetInterpolatedCoord(int frame)
{
ReadData();
return GetInterpolated(frame);
}
protected override IGpsCoordinate GetInterpolatedItem(int frame, IGpsCoordinate lower, IGpsCoordinate upper)
{
double ratio = GetInterpolationRatio(frame, lower.Frame, upper.Frame);
var x = GetInterpolatedValue(lower.X, upper.X, ratio);
var y = GetInterpolatedValue(lower.Y, upper.Y, ratio);
var z = GetInterpolatedValue(lower.Z, upper.Z, ratio);
return new GpsCoordinate(frame, x, y, z);
}
Classe B per bambini:
public double GetMph(int frame)
{
ReadData();
return GetInterpolated(frame).MilesPerHour;
}
protected override ISpeed GetInterpolatedItem(int frame, ISpeed lower, ISpeed upper)
{
var ratio = GetInterpolationRatio(frame, lower.Frame, upper.Frame);
var mph = GetInterpolatedValue(lower.MilesPerHour, upper.MilesPerHour, ratio);
return new Speed(frame, mph);
}