প্রথমত, এটি ডেটা চালিত ডিজাইনের সাথে বিভ্রান্ত করবেন না।
ডেটা ওরিয়েন্টেড ডিজাইন সম্পর্কে আমার বোঝা হ'ল এটি দক্ষ প্রক্রিয়াকরণের জন্য আপনার ডেটা সংগঠিত করার বিষয়ে। অন্যদিকে ডিজাইন চালিত ক্যাশে মিস ইত্যাদি ডেটা থেকে সম্মান সঙ্গে বিশেষ করে লেট ডেটা আপনার প্রোগ্রাম আচরণ (দ্বারা খুব ভাল বর্ণনা অনেকটা নিয়ন্ত্রণ সম্পর্কে অ্যান্ড্রু কিথ এর উত্তর )।
বলুন যে আপনার আবেদনে বলের জিনিস রয়েছে যেমন রঙ, ব্যাসার্ধ, বাঁচানো, অবস্থান ইত্যাদি বৈশিষ্ট্য রয়েছে with
অবজেক্ট ওরিয়েন্টড অ্যাপ্রোচ
ওওপি-তে আপনি এইভাবে বলগুলি বর্ণনা করবেন:
class Ball {
Point position;
Color color;
double radius;
void draw();
};
এবং তারপরে আপনি এটির মতো বলের সংগ্রহ তৈরি করতে পারেন:
vector<Ball> balls;
ডেটা ওরিয়েন্টেড অ্যাপ্রোচ
ডেটা ওরিয়েন্টেড ডিজাইনে যাইহোক, আপনি কোডটি এইভাবে লেখার সম্ভাবনা বেশি:
class Balls {
vector<Point> position;
vector<Color> color;
vector<double> radius;
void draw();
};
আপনি দেখতে পাচ্ছেন যে কোনও একক ইউনিট আর একটি বল উপস্থাপন করে না। বল অবজেক্টগুলি কেবল স্পষ্টভাবে উপস্থিত থাকে exist
পারফরম্যান্স অনুসারে এর অনেক সুবিধা থাকতে পারে। সাধারণত আমরা একই সাথে অনেকগুলি বলের অপারেশন করতে চাই। হার্ডওয়্যার সাধারণত দক্ষতার সাথে পরিচালনা করতে মেমরির বৃহত ক্রমাগত অংশগুলি চায়।
দ্বিতীয়ত আপনি এমন অপারেশন করতে পারেন যা একটি বলের বৈশিষ্ট্যের অংশকেই প্রভাবিত করে। যেমন আপনি যদি সমস্ত বলের রঙগুলি বিভিন্ন উপায়ে একত্রিত করেন তবে আপনি চান আপনার ক্যাশে কেবল রঙের তথ্য থাকতে পারে। তবে যখন সমস্ত বলের বৈশিষ্ট্যগুলি এক ইউনিটে সংরক্ষণ করা হয় আপনি একটি বলের অন্যান্য সমস্ত বৈশিষ্ট্যও টানবেন। যদিও আপনার তাদের প্রয়োজন নেই।
ক্যাশে ব্যবহারের উদাহরণ
বলুন প্রতিটি বল 64 বাইট নেয় এবং একটি পয়েন্ট 4 বাইট নেয়। একটি ক্যাশে স্লট লাগে, বলুন, পাশাপাশি 64 বাইট। আমি যদি 10 বলের অবস্থান আপডেট করতে চাই তবে আমাকে 10 * 64 = 640 বাইট মেমরির ক্যাশে রেখে দিতে হবে এবং 10 ক্যাশে মিস করতে হবে। তবে আমি যদি বলগুলির অবস্থানগুলি পৃথক ইউনিট হিসাবে কাজ করতে পারি তবে কেবল 4 * 10 = 40 বাইট লাগবে। এটি একটি ক্যাশে আনতে ফিট করে। এইভাবে আমরা সমস্ত 10 টি আপডেট করার জন্য 1 টি ক্যাশে মিস পেয়েছি। এই সংখ্যাগুলি নির্বিচারে - আমি ধরে নিয়েছি একটি ক্যাশে ব্লকটি আরও বড়।
তবে এটি চিত্রিত করে যে কীভাবে মেমরি লেআউট ক্যাশে হিটগুলিতে এবং এইভাবে পারফরম্যান্সের উপর মারাত্মক প্রভাব ফেলতে পারে। এটি কেবলমাত্র সিপিইউ এবং র্যামের গতির মধ্যে পার্থক্য বৃদ্ধির কারণে গুরুত্ব বাড়বে।
কীভাবে স্মৃতি বিন্যাস করবেন
আমার বল উদাহরণে আমি বিষয়টি অনেক সরল করে দিয়েছি কারণ সাধারণত যে কোনও সাধারণ অ্যাপ্লিকেশানের জন্য আপনি একসাথে একাধিক ভেরিয়েবল অ্যাক্সেস করতে পারবেন। যেমন পজিশন এবং ব্যাসার্ধ সম্ভবত একসাথে ঘন ঘন ব্যবহার করা হবে। তারপরে আপনার কাঠামোটি হওয়া উচিত:
class Body {
Point position;
double radius;
};
class Balls {
vector<Body> bodies;
vector<Color> color;
void draw();
};
আপনার এটি করার কারণটি হ'ল যদি একসাথে ব্যবহৃত ডেটা পৃথক অ্যারেতে রাখা হয় তবে তাদের ঝুঁকি রয়েছে যে তারা ক্যাশে একই স্লটগুলির জন্য প্রতিযোগিতা করবে। এইভাবে একটি লোড করা অন্যটিকে বাইরে ফেলে দেবে।
সুতরাং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে তুলনা করে, আপনি যে ক্লাসগুলি শেষ করবেন সেগুলি আপনার মানসিক মডেলের সত্তার সাথে সম্পর্কিত নয়। যেহেতু ডেটা ব্যবহারের ভিত্তিতে ডেটা একসাথে করা হয়, তাই ডেটা ওরিয়েন্টেড ডিজাইনে আপনার ক্লাস দেওয়ার জন্য আপনার কাছে সর্বদা বুদ্ধিমান নাম থাকবে না।
রিলেশনাল ডাটাবেসের সাথে সম্পর্ক
ডেটা ওরিয়েন্টেড ডিজাইনের পিছনে চিন্তাভাবনা সম্পর্কের ডাটাবেসগুলি সম্পর্কে আপনি কীভাবে ভাবছেন তার সাথে অনেকটাই মিল। রিলেশনাল ডাটাবেস অনুকূলকরণে আরও দক্ষতার সাথে ক্যাশে ব্যবহার করা জড়িত থাকতে পারে, যদিও এই ক্ষেত্রে ক্যাশে সিপিইউ ক্যাশে নয় মেমরির পৃষ্ঠাগুলি। একটি ভাল ডাটাবেস ডিজাইনার সম্ভবত অবিচ্ছিন্নভাবে অ্যাক্সেস করা ডেটা পৃথক টেবিলের মধ্যে বিভক্ত করে দেবে বরং বিশাল সংখ্যক কলাম সহ একটি টেবিল তৈরি করায় কলামগুলির মধ্যে কেবল কয়েকটি ব্যবহৃত হত। তিনি কয়েকটি টেবিলকে অস্বীকৃতি জানাতেও বেছে নিতে পারেন যাতে ডিস্কের একাধিক অবস্থান থেকে ডেটা অ্যাক্সেস করতে না হয়। ডেটা ওরিয়েন্টেড ডিজাইনের মতোই এই পছন্দগুলি ডেটা অ্যাক্সেসের ধরণগুলি কী এবং কোথায় পারফরম্যান্সের বাধা। তা দেখে এই পছন্দগুলি করা হয়।