Ich habe mehrere Klassen, die alle von einer generischen Basisklasse erben. Die Basisklasse enthält eine Auflistung mehrerer Objekte vom Typ T
.
Jede untergeordnete Klasse muss in der Lage sein, interpolierte Werte aus der Auflistung von Objekten zu berechnen. Da die untergeordneten Klassen jedoch unterschiedliche Typen verwenden, variiert die Berechnung von Klasse zu Klasse geringfügig.
Bisher habe ich meinen Code von Klasse zu Klasse kopiert / eingefügt und kleinere Änderungen an jedem vorgenommen. Aber jetzt versuche ich, den duplizierten Code zu entfernen und durch eine generische Interpolationsmethode in meiner Basisklasse zu ersetzen. Das gestaltet sich jedoch sehr schwierig, und alle Lösungen, die ich mir vorgestellt habe, scheinen viel zu komplex zu sein.
Ich fange an zu glauben, dass das DRY-Prinzip in solchen Situationen nicht so häufig angewendet wird, aber das klingt nach Blasphemie. Wie viel Komplexität ist zu viel, wenn versucht wird, Codeduplizierungen zu entfernen?
BEARBEITEN:
Die beste Lösung, die ich finden kann, sieht ungefähr so aus:
Basisklasse:
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);
Kinderklasse 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);
}
Kinderklasse 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);
}