Tengo varias clases que todas heredan de una clase base genérica. La clase base contiene una colección de varios objetos de tipo T
.
Cada clase secundaria necesita poder calcular valores interpolados de la colección de objetos, pero dado que las clases secundarias usan diferentes tipos, el cálculo varía un poco de una clase a otra.
Hasta ahora he copiado / pegado mi código de una clase a otra y he realizado modificaciones menores en cada uno. Pero ahora estoy tratando de eliminar el código duplicado y reemplazarlo con un método de interpolación genérico en mi clase base. Sin embargo, eso está resultando ser muy difícil, y todas las soluciones que he pensado parecen demasiado complejas.
Estoy empezando a pensar que el principio DRY no se aplica tanto en este tipo de situación, pero eso suena como una blasfemia. ¿Cuánta complejidad es demasiado cuando se trata de eliminar la duplicación de código?
EDITAR:
La mejor solución que se me ocurre es algo como esto:
Clase 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);
Niño clase 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);
}
Niño clase 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);
}