J'ai plusieurs classes qui héritent toutes d'une classe de base générique. La classe de base contient une collection de plusieurs objets de type T
.
Chaque classe enfant doit être capable de calculer des valeurs interpolées à partir de la collection d'objets, mais comme les classes enfants utilisent différents types, le calcul varie un tout petit peu d'une classe à l'autre.
Jusqu'à présent, j'ai copié / collé mon code de classe en classe et apporté des modifications mineures à chacune. Mais maintenant, j'essaie de supprimer le code dupliqué et de le remplacer par une méthode d'interpolation générique dans ma classe de base. Cependant, cela s'avère très difficile, et toutes les solutions auxquelles j'ai pensé semblent bien trop complexes.
Je commence à penser que le principe DRY ne s'applique pas autant dans ce genre de situation, mais cela sonne comme un blasphème. Quelle est la complexité excessive lorsque vous essayez de supprimer la duplication de code?
MODIFIER:
La meilleure solution que je peux trouver va quelque chose comme ceci:
Classe de 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 enfant 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);
}
Classe enfant 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);
}