Tôi có một vài lớp mà tất cả đều kế thừa từ một lớp cơ sở chung. Lớp cơ sở chứa một tập hợp của một số đối tượng của loại T
.
Mỗi lớp con cần có khả năng tính toán các giá trị nội suy từ bộ sưu tập các đối tượng, nhưng vì các lớp con sử dụng các loại khác nhau, phép tính thay đổi một chút từ lớp này sang lớp khác.
Cho đến nay tôi đã sao chép / dán mã của mình từ lớp này sang lớp khác và thực hiện các sửa đổi nhỏ cho từng mã. Nhưng bây giờ tôi đang cố gắng loại bỏ mã trùng lặp và thay thế nó bằng một phương thức nội suy chung trong lớp cơ sở của tôi. Tuy nhiên, điều đó đang tỏ ra rất khó khăn và tất cả các giải pháp tôi nghĩ có vẻ quá phức tạp.
Tôi bắt đầu nghĩ rằng nguyên tắc DRY không áp dụng nhiều trong tình huống này, nhưng điều đó nghe có vẻ như báng bổ. Bao nhiêu phức tạp là quá nhiều khi cố gắng loại bỏ sao chép mã?
CHỈNH SỬA:
Giải pháp tốt nhất tôi có thể đưa ra là một thứ như thế này:
Lớp cơ sở:
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);
Trẻ lớp 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);
}
Lớp con 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);
}