Saya memiliki beberapa kelas yang semuanya diwarisi dari kelas dasar generik. Kelas dasar berisi kumpulan beberapa objek bertipe T
.
Setiap kelas anak harus dapat menghitung nilai yang diinterpolasi dari koleksi objek, tetapi karena kelas anak menggunakan tipe yang berbeda, perhitungannya sedikit bervariasi dari kelas ke kelas.
Sejauh ini saya telah menyalin / menempelkan kode saya dari kelas ke kelas dan membuat sedikit modifikasi untuk masing-masing kode. Tapi sekarang saya mencoba untuk menghapus kode duplikat dan menggantinya dengan satu metode interpolasi generik di kelas dasar saya. Namun itu terbukti sangat sulit, dan semua solusi yang saya anggap terlalu rumit.
Saya mulai berpikir bahwa prinsip KERING tidak berlaku banyak dalam situasi seperti ini, tetapi itu terdengar seperti penghujatan. Berapa banyak kerumitan yang terlalu banyak ketika mencoba untuk menghapus duplikasi kode?
EDIT:
Solusi terbaik yang bisa saya dapatkan adalah dengan cara seperti ini:
Kelas dasar:
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);
Kelas anak 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);
}
Kelas anak 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);
}