Mam kilka klas, które wszystkie dziedziczą od ogólnej klasy podstawowej. Klasa podstawowa zawiera zbiór kilku obiektów typu T
.
Każda klasa potomna musi być w stanie obliczyć interpolowane wartości ze zbioru obiektów, ale ponieważ klasy potomne używają różnych typów, obliczenia różnią się nieznacznie w zależności od klasy.
Do tej pory kopiowałem / wklejałem swój kod z klasy do klasy i wprowadzałem niewielkie zmiany w każdym z nich. Ale teraz próbuję usunąć zduplikowany kod i zastąpić go jedną ogólną metodą interpolacji w mojej klasie bazowej. Jest to jednak bardzo trudne, a wszystkie rozwiązania, o których myślałem, wydają się zbyt skomplikowane.
Zaczynam myśleć, że zasada DRY nie stosuje się tak często w tego rodzaju sytuacjach, ale to brzmi jak bluźnierstwo. Jaka złożoność jest zbyt duża, gdy próbujesz usunąć duplikację kodu?
EDYTOWAĆ:
Najlepsze rozwiązanie, jakie mogę wymyślić, to coś takiego:
Klasa podstawowa:
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);
Klasa dziecka A:
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);
}
Klasa dziecka B:
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);
}