Hepsi genel bir temel sınıftan miras kalan birkaç sınıfım var. Temel sınıf, birkaç tür nesneden oluşan bir koleksiyon içerir T
.
Her alt sınıf, nesne koleksiyonundan enterpolasyonlu değerleri hesaplayabilmelidir, ancak alt sınıflar farklı türleri kullandığından, hesaplama sınıftan sınıfa küçük bir miktar değiştirir.
Şimdiye kadar kodumu sınıftan sınıfa kopyaladım / yapıştırdım ve her birinde küçük değişiklikler yaptım. Ama şimdi kopyalanan kodu kaldırmaya ve onu temel sınıfımdaki tek genel enterpolasyon yöntemiyle değiştirmeye çalışıyorum. Ancak bunun çok zor olduğu kanıtlandı ve düşündüğüm tüm çözümler çok karmaşık görünüyor.
DRY ilkesinin bu tür durumlarda geçerli olmadığını, küfür gibi göründüğünü düşünmeye başladım. Kod çoğaltmayı kaldırmaya çalışırken ne kadar karmaşıklık var?
DÜZENLE:
Bulabileceğim en iyi çözüm şunun gibi gider:
Temel Sınıf:
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);
Çocuk sınıfı 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 sınıfı çocuk:
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);
}