У мене є кілька класів, які успадковують усі із загального базового класу. Базовий клас містить колекцію декількох об'єктів типу T
.
Кожен дочірній клас повинен мати можливість обчислювати інтерпольовані значення з колекції об'єктів, але оскільки дочірні класи використовують різні типи, обчислення змінюються незначно біт від класу до класу.
Поки я копіював / вставляв свій код з класу в клас і вносив незначні зміни до кожного. Але зараз я намагаюся видалити дублюваний код і замінити його одним загальним методом інтерполяції в моєму базовому класі. Однак це виявляється дуже складно, і всі рішення, які я вважав, здаються занадто складними.
Я починаю вважати, що принцип DRY не застосовується настільки в подібній ситуації, але це звучить як богохульство. Наскільки складність занадто велика при спробі видалити дублювання коду?
Редагувати:
Найкраще рішення, яке я можу придумати, виглядає приблизно так:
Базовий клас:
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);
Дитячий клас А:
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);
}
Дитячий клас 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);
}