일반 기본 클래스에서 모두 상속되는 여러 클래스가 있습니다. 기본 클래스에는 여러 유형의 객체 모음이 포함되어 있습니다 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);
어린이 클래스 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);
}
어린이 클래스 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);
}