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);
}