মৌলিক ধারণা
ডেটা স্ট্রাকচার হলো বিশেষ ক্লাসগুলো যেগুলো শুধু ডেটা ধরে রাখতে বাস্তবায়িত, অর্থাৎ পিউর মডেল, যেমন Car, Kid, Animal, Event, Employee, Company, Customer ইত্যাদি। এই ডেটাগুলো সাধারণত অন্য ক্লাসের শুরুতে ইনস্ট্যান্স ভেরিয়েবল হিসেবে ডিক্লেয়ার বা বিবেচিত হয়।
এই ক্লাসের মেথডগুলো কোনো বাস্তব মুনাফা কাজ করবে না, অন্যথায় ডেটা স্ট্রাকচার ক্লাস আর ডেটা স্ট্রাকচার থাকবে না! তাই মূলত, মেথডগুলো হলো গেটার এবং সেটার (অর্থাৎ অ্যাকসেসর এবং মিউটেটর), সাধারণত কারণ ইনস্ট্যান্স ভেরিয়েবলগুলো প্রাইভেট হিসেবে বিবেচিত হয়। একটি বিকল্প মতামত: ডেটা স্ট্রাকচার ভেরিয়েবলগুলো পাবলিক হওয়া উচিত, এবং ক্লাসের ইনস্ট্যান্স থেকে সরাসরি অ্যাক্সেস করা যাবে, কিন্তু এটি বিতর্কের বিষয় যে প্রাইভেট ভেরিয়েবল কনসেপ্ট ভালো।
- সেক্ষেত্রে, ডেটা স্ট্রাকচার ক্লাস, তার ডেটা (ভেরিয়েবল) প্রকাশ বা এক্সপোজ করে এবং কোনো মেনিংফুল (সিগনিফিক্যান্ট) মেথড বা ফাংশন নেই।
- একটি নরমাল ক্লাস (এখানে অবজেক্ট বলা হয়), যেমন MainActivity, ListAdapter, Calculator, Iterator, তাদের ডেটা छাড়ায়, এবং তাদের মেথড প্রকাশ করে যা সেসব ডেটার ওপর কাজ করে।
তাই, হাতে থাকা সমস্যা সমাধানের দুটি পদ্ধতি আছে, অর্থাৎ একটি ডেটা স্ট্রাকচার বাস্তবায়ন করা এর শুদ্ধতম রূপে, অন্যদিকে একটি অবজেক্ট ক্লাস তৈরি করা সেসব ডেটার ওপর অপারেশন বিল্ড করতে, অথবা, আমরা মডেল ক্লাসগুলোকে অবজেক্ট ক্লাস হিসেবে বানাতে পারি, যা তাদের ডেটা ছাড়ায় যখন তাদের মেথড এক্সপোজ করে, নিচের উদাহরণের মতো:
public class Square { public Point topLeft1; public double side1; } public class Rectangle { public Point topLeft1; public double height1; public double width1; } public class Circle { public Point center1; public double radius1; } public class Geometry { public final double PI = 3.141592653589793; public double area(Object shape) throws NoSuchShapeException { if (shape instanceof Square) { Square s = (Square)shape; return s.side1 x s.side1; }else if (shape instanceof Rectangle) { Rectangle r = (Rectangle)shape; return r.height1 x r.width1; }else if (shape instanceof Circle) { Circle c = (Circle)shape; return PI x c.radius1 x c.radius1; } throw new NoSuchShapeException(); } }
এই সমাধানে শেপগুলো ডেটা স্ট্রাকচার হিসেবে বিবেচিত হয়েছে, যখন Geometry ক্লাস অবজেক্ট হিসেবে বিবেচিত হয়েছে।
সুবিধা − যদি আমরা আরও মেথড যোগ করতে চাই তবে আমরা সেগুলো শুধু Geometry ক্লাসে যোগ করব (এই সমাধান বাস্তবায়ন করা উচিত এই সময়)।
অসুবিধা − যদি আমরা আরও ডেটা স্ট্রাকচার যোগ করতে চাই (অর্থাৎ আরও শেপ), তবে আমাদের Geometry ক্লাসের সব মেথড পরিবর্তন করতে হবে।
ডেটা স্ট্রাকচার এবং অবজেক্টের পার্থক্য
- অবজেক্ট বিহেভিয়ার এক্সপোজ করে এবং ডেটা ছাড়ায়। এতে নতুন ধরনের অবজেক্ট যোগ করা সহজ হয় বিদ্যমান বিহেভিয়ার ছাড়া বদলে। এটি বিদ্যমান অবজেক্টে নতুন বিহেভিয়ার যোগ করা কঠিন করে দেয়।
- ডেটা স্ট্রাকচার ডেটা প্রকাশ বা এক্সপোজ করে এবং কোনো সিগনিফিক্যান্ট বিহেভিয়ার নেই। এতে বিদ্যমান ডেটা স্ট্রাকচারে নতুন বিহেভিয়ার যোগ করা সহজ হয় কিন্তু বিদ্যমান ফাংশনে নতুন ডেটা স্ট্রাকচার যোগ করা কঠিন করে দেয়।