আমার বেশ কয়েকটি ক্লাস রয়েছে যা সমস্ত জেনেরিক বেস বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। বেস ক্লাসে বিভিন্ন ধরণের অবজেক্টের সংগ্রহ রয়েছে T
।
প্রতিটি শিশু শ্রেণিকে অবজেক্টগুলির সংগ্রহ থেকে আন্তঃবিবাহিত মানগুলি গণনা করতে সক্ষম হওয়া প্রয়োজন, তবে যেহেতু শিশু শ্রেণিগুলি বিভিন্ন ধরণের ব্যবহার করে, গণনাটি এক শ্রেণিতে পৃথক পৃথক হয়ে যায়।
এখন পর্যন্ত আমি ক্লাস থেকে ক্লাসে আমার কোড অনুলিপি / পেস্ট করেছি এবং প্রত্যেকটিতে ছোটখাট পরিবর্তন করেছি। তবে এখন আমি নকল কোডটি সরিয়ে আমার বেস ক্লাসে একটি জেনেরিক ইন্টারপোলেশন পদ্ধতিতে এটি প্রতিস্থাপনের চেষ্টা করছি। তবে এটি খুব কঠিন হিসাবে প্রমাণিত হচ্ছে এবং আমি যে সমস্ত সমাধানগুলি ভেবে দেখেছি সেগুলি খুব জটিল বলে মনে হচ্ছে।
আমি ভাবতে শুরু করি যে ডিআরওয়াই নীতিটি এই ধরণের পরিস্থিতিতে ততটা প্রযোজ্য নয়, তবে এটি নিন্দার মতো বলে মনে হচ্ছে। কোড সদৃশ অপসারণ করার চেষ্টা করার সময় কত জটিলতা বেশি হয়?
সম্পাদনা করুন:
আমি যে সর্বোত্তম সমাধানটি নিয়ে আসতে পারি তা হ'ল এরকম কিছু:
বেস শ্রেণি:
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);
}
শিশু শ্রেণি বি:
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);
}