এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে কোনও শ্রেণি একই বুনিয়াদি আচরণ, পদ্ধতিগুলি এবং সেটারের প্রয়োগ করে তবে শ্রেণীর একাধিক বিভিন্ন সংস্করণ বিভিন্ন ব্যবহারের জন্য উপস্থিত থাকতে পারে। আমার বিশেষ ক্ষেত্রে, আমার একটি ভেক্টর রয়েছে (জ্যামিতিক ভেক্টর, একটি তালিকা নয়) এবং সেই ভেক্টর যে কোনও এন-ডাইমেনশনাল ইউক্লিডিয়ান স্পেসে প্রয়োগ করতে পারে (1 মাত্রিক, 2 মাত্রিক, ...)। এই শ্রেণি / প্রকারটি কীভাবে সংজ্ঞায়িত করা যায়?
এটি সি ++ তে সহজ হবে যেখানে শ্রেণি টেম্পলেটগুলির প্যারামিটার হিসাবে প্রকৃত মান থাকতে পারে, তবে জাভাতে আমাদের সেই বিলাসিতা নেই।
এই সমস্যাটি সমাধান করার জন্য যে দুটি পদ্ধতির বিষয়ে আমি ভাবতে পারি তা হ'ল:
সংকলন সময় প্রতিটি সম্ভাব্য কেস বাস্তবায়ন।
public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 implements Vector { public final double x, y; public Vector2(double x, double y) { this.x = x; this.y = y; } @Override public double magnitude() { return Math.sqrt(x * x + y * y); } public double getX() { return x; } public double getY() { return y; } }
এই সমাধানটি অবশ্যই খুব সময় সাশ্রয়ী এবং কোডের জন্য অত্যন্ত ক্লান্তিকর। এই উদাহরণে এটি খুব খারাপ বলে মনে হচ্ছে না, তবে আমার আসল কোডে আমি ভেক্টরগুলির সাথে চারটি মাত্রা (x, y, z, এবং ডাব্লু) পর্যন্ত একাধিক বাস্তবায়নকারীগুলির সাথে কাজ করছি। আমার কাছে বর্তমানে 2 হাজারেরও বেশি লাইনের কোড রয়েছে, যদিও প্রতিটি ভেক্টরকে কেবলমাত্র 500 টি প্রয়োজন।
রানটাইমে প্যারামিটার নির্দিষ্ট করে।
public class Vector { private final double[] components; public Vector(double[] components) { this.components = components; } public int dimensions() { return components.length; } public double magnitude() { double sum = 0; for (double component : components) { sum += component * component; } return Math.sqrt(sum); } public double getComponent(int index) { return components[index]; } }
দুর্ভাগ্যক্রমে এই সমাধানটি কোড কর্মক্ষমতাকে আঘাত করে, পূর্ববর্তী সমাধানের চেয়ে ম্যাসিয়ার কোডের ফলাফল দেয় এবং সংকলন-সময়ে এতোটা নিরাপদ নয় (এটি সংকলন-সময়ে নিশ্চিত করা যায় না যে আপনি যে ভেক্টরটির সাথে প্রকৃতপক্ষে আচরণ করছেন এটি দ্বি-মাত্রিক, উদাহরণ স্বরূপ).
আমি বর্তমানে এক্সেন্ডে আসলে বিকাশ করছি, সুতরাং যদি কোনও এক্সটেন্ড সমাধান পাওয়া যায় তবে সেগুলিও গ্রহণযোগ্য হবে।