ডেটা ওরিয়েন্টেড ডিজাইন কী?


156

আমি এই নিবন্ধটি পড়ছিলাম , এবং এই লোকটি ওওপির সাথে ডেটা ওরিয়েন্টেড ডিজাইনে মিশ্রিত হওয়ার মাধ্যমে কীভাবে প্রত্যেকে উপকার করতে পারে সে সম্পর্কে কথা বলতে চলেছে। তবে তিনি কোনও কোডের নমুনা দেখান না।

আমি এটি googled এবং এটি কি হিসাবে কোনও সত্য তথ্য খুঁজে পাইনি, কোনও কোডের নমুনা ছেড়ে দিন। এই শব্দটির সাথে পরিচিত কেউ এবং উদাহরণ দিতে পারে? এটি কি অন্য কোনও কিছুর জন্য আলাদা শব্দ হতে পারে?


7
গেম ডেভেলপারের সেই নিবন্ধটি এখন ব্লগ ফর্মে সহজেই পাওয়া যায়: গেমসফ্রমেউইথন.com
ওরিয়েন্টেড-

58
আপনি কি ছেলেরা কখনও কোনও কিছু গুগল করেছেন, একটি দুর্দান্ত লক্ষ্যযুক্ত এসও প্রশ্ন খুঁজে পেয়েছেন এবং বুঝতে পেরেছিলেন যে আপনি সেই ব্যক্তি যিনি কয়েক বছর আগে এটি জিজ্ঞাসা করেছিলেন?
রাইগুয়ে

1
ওয়েবে
ডিওডির

14
@ রিয়েগু, আমি একটি প্রশ্ন করেছি, এটি গুগল করেছি, একটি খুব সুন্দর প্রশ্ন পেয়েছি, এবং তখন বুঝতে পেরেছি যে আমি এর উত্তর বহু বছর আগে দিয়েছি ।
মাইকেল ডিকারিফ

4
আমি কিছু গুগল করেছি এবং একটি খুব সুন্দর প্রশ্ন পেয়েছি এবং অনুমান করি কি?
কেই

উত্তর:


287

প্রথমত, এটি ডেটা চালিত ডিজাইনের সাথে বিভ্রান্ত করবেন না।

ডেটা ওরিয়েন্টেড ডিজাইন সম্পর্কে আমার বোঝা হ'ল এটি দক্ষ প্রক্রিয়াকরণের জন্য আপনার ডেটা সংগঠিত করার বিষয়ে। অন্যদিকে ডিজাইন চালিত ক্যাশে মিস ইত্যাদি ডেটা থেকে সম্মান সঙ্গে বিশেষ করে লেট ডেটা আপনার প্রোগ্রাম আচরণ (দ্বারা খুব ভাল বর্ণনা অনেকটা নিয়ন্ত্রণ সম্পর্কে অ্যান্ড্রু কিথ এর উত্তর )।

বলুন যে আপনার আবেদনে বলের জিনিস রয়েছে যেমন রঙ, ব্যাসার্ধ, বাঁচানো, অবস্থান ইত্যাদি বৈশিষ্ট্য রয়েছে 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();
};

আপনার এটি করার কারণটি হ'ল যদি একসাথে ব্যবহৃত ডেটা পৃথক অ্যারেতে রাখা হয় তবে তাদের ঝুঁকি রয়েছে যে তারা ক্যাশে একই স্লটগুলির জন্য প্রতিযোগিতা করবে। এইভাবে একটি লোড করা অন্যটিকে বাইরে ফেলে দেবে।

সুতরাং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে তুলনা করে, আপনি যে ক্লাসগুলি শেষ করবেন সেগুলি আপনার মানসিক মডেলের সত্তার সাথে সম্পর্কিত নয়। যেহেতু ডেটা ব্যবহারের ভিত্তিতে ডেটা একসাথে করা হয়, তাই ডেটা ওরিয়েন্টেড ডিজাইনে আপনার ক্লাস দেওয়ার জন্য আপনার কাছে সর্বদা বুদ্ধিমান নাম থাকবে না।

রিলেশনাল ডাটাবেসের সাথে সম্পর্ক

ডেটা ওরিয়েন্টেড ডিজাইনের পিছনে চিন্তাভাবনা সম্পর্কের ডাটাবেসগুলি সম্পর্কে আপনি কীভাবে ভাবছেন তার সাথে অনেকটাই মিল। রিলেশনাল ডাটাবেস অনুকূলকরণে আরও দক্ষতার সাথে ক্যাশে ব্যবহার করা জড়িত থাকতে পারে, যদিও এই ক্ষেত্রে ক্যাশে সিপিইউ ক্যাশে নয় মেমরির পৃষ্ঠাগুলি। একটি ভাল ডাটাবেস ডিজাইনার সম্ভবত অবিচ্ছিন্নভাবে অ্যাক্সেস করা ডেটা পৃথক টেবিলের মধ্যে বিভক্ত করে দেবে বরং বিশাল সংখ্যক কলাম সহ একটি টেবিল তৈরি করায় কলামগুলির মধ্যে কেবল কয়েকটি ব্যবহৃত হত। তিনি কয়েকটি টেবিলকে অস্বীকৃতি জানাতেও বেছে নিতে পারেন যাতে ডিস্কের একাধিক অবস্থান থেকে ডেটা অ্যাক্সেস করতে না হয়। ডেটা ওরিয়েন্টেড ডিজাইনের মতোই এই পছন্দগুলি ডেটা অ্যাক্সেসের ধরণগুলি কী এবং কোথায় পারফরম্যান্সের বাধা। তা দেখে এই পছন্দগুলি করা হয়।


4
এর জন্য ধন্যবাদ, আপনি এটি খুব ভাল ব্যাখ্যা করেছেন।
রাইগুয়ে

4
ভাল বলেছ; যদিও আমি কেবল একটি প্রশ্ন পেয়েছি। ধরা যাক আমাদের একটি কাঠামো রয়েছে struct balls {vector<vec3> pos; vector<vec3> velocity;}, প্রতিটি বলের অবস্থানকে ক্যাশে ছুঁড়ে ফেলা হবে না যেহেতু আপনি বেগ ভেক্টর এবং অবস্থান ভেক্টরের (হ্যাঁ আধুনিক মেশিন এবং ক্যাশে-লাইন এবং সমস্ত কিছুর মাঝে) এগিয়ে চলেছেন এছাড়াও শুধু একটি উদাহরণ)?
ফলস্ট্রো

14
এটা হতে পারে. তবে মনে রাখবেন পুরো পোস্ট অ্যারে একবারে টানবে না। কেবল একটি ক্যাশে লাইন, এবং কিছু প্রাক উপস্থাপনা সম্ভব। তেমনি বেগ সহ। সুতরাং তাদের একে অপরকে আবর্জনা ফেলার জন্য প্রতিটি পোস এবং ভেক্টরের সংযুক্ত অংশকে একই ক্যাশলাইনে মানচিত্র করতে হবে। এটি অবশ্যই ঘটতে পারে, এজন্যই সুপারিশটি এমন একত্রিত হয় যা ভেরিয়েবলগুলি একসাথে স্ট্রাক্টে রাখা হয়। সুতরাং উদাহরণস্বরূপ বেগ এবং পোজ একটি ভেক্টরে থাকবে এবং রঙ অন্য ভেক্টরে থাকবে।
এরিক এনহিম

1
@roe আপনার একসাথে অ্যাক্সেস করা সম্পত্তিগুলি একসাথে গ্রুপ করা উচিত। বৈশিষ্ট্যগুলির মধ্যে একেবারে কোনও নির্ভরতা থাকা উচিত। সুতরাং এই কাঠামো আরও ভাল হবে struct balls { vector<color> colors; vector<body> bodies; /* contains position and velocity */ }
দানিজার

2
@ দানিজার আমি আপনার পরামর্শ দিয়ে ব্যাখ্যাটি আপডেট করেছি। আমি এই সম্পর্কে আরও অনেক কিছু বলতে পারতাম, তবে এটি সত্যিই কেবল একটি নিবন্ধে পরিণত হবে।
এরিক এঞ্জিম

18

মাইক অ্যাক্টন সম্প্রতি ডেটা ওরিয়েন্টেড ডিজাইন সম্পর্কে একটি সর্বজনীন বক্তৃতা দিয়েছেন:

আমার এটির বেসিক সংক্ষিপ্তসারটি হ'ল: আপনি যদি পারফরম্যান্স চান, তবে ডেটা প্রবাহ সম্পর্কে চিন্তা করুন, আপনার সাথে স্ক্রু করার সম্ভাবনা বেশি এমন স্টোরেজ স্তরটি খুঁজে নিন এবং এর জন্য কঠোরভাবে অনুকূলিত হন মাইক এল 2 ক্যাশে মিসের দিকে মনোনিবেশ করছে, কারণ তিনি রিয়েলটাইম করছেন, তবে আমি কল্পনা করি একই জিনিসটি ডাটাবেসগুলিতে (ডিস্ক রিড) এবং এমনকি ওয়েবে (এইচটিটিপি অনুরোধগুলি) প্রযোজ্য। আমি মনে করি এটি সিস্টেম প্রোগ্রামিংয়ের একটি কার্যকর উপায়।

নোট করুন যে এটি আপনাকে অ্যালগরিদম এবং সময়ের জটিলতা সম্পর্কে চিন্তা থেকে বিরত রাখে না, এটি কেবল আপনার পাগল সিএস দক্ষতা দিয়ে লক্ষ্যমাত্রা অবলম্বন করা সবচেয়ে ব্যয়বহুল অপারেশন টাইপ বের করার দিকে আপনার দৃষ্টি নিবদ্ধ করে।


14

আমি কেবল এটিই উল্লেখ করতে চাই যে নোয়েল গেম বিকাশে আমাদের যে নির্দিষ্ট কিছু প্রয়োজনের মুখোমুখি হচ্ছে সে সম্পর্কে বিশেষভাবে কথা বলছে। আমি মনে করি যে অন্যান্য সেক্টরগুলি যা রিয়েল-টাইম সফট সিমুলেশন করছে সেগুলি এতে উপকৃত হবে, তবে এটি এমন কোনও প্রযুক্তি হওয়ার সম্ভাবনা নেই যা সাধারণ ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে লক্ষণীয় উন্নতি দেখায়। এই সেট আপটি নিশ্চিত করার জন্য যে প্রতি শেষ বিট পারফরম্যান্স অন্তর্নিহিত হার্ডওয়্যার থেকে বেরিয়ে গেছে।


একমত। কিছু অন্যান্য ক্ষেত্র যেখানে ডেটা-ওরিয়েন্টড ডিজাইনটি উল্লেখযোগ্য তা হ'ল: উচ্চ-ব্যান্ডউইথ ডিভাইসের জন্য হার্ডওয়্যার এবং ফার্মওয়্যার (যেমন নেটওয়ার্কিং বা স্টোরেজ); বৃহত আকারের বৈজ্ঞানিক কম্পিউটিং (যেমন আবহাওয়া সিমুলেশন, প্রোটিন ভাঁজ), সিগন্যাল প্রক্রিয়াকরণ (যেমন অডিও, চিত্র, ভিডিও), ডেটা সংক্ষেপণ। এগুলি "কম্পিউটেশনাল সায়েন্স অ্যান্ড ইঞ্জিনিয়ারিং" এর অধীনে পড়ে যা কখনও কখনও আরও সাধারণ কম্পিউটার বিজ্ঞান থেকে পৃথক মেজর হিসাবে দেওয়া হয়।
rwong

-3

ডেটা ওরিয়েন্টেড ডিজাইন এমন একটি নকশা যাতে প্রক্রিয়াকরণের অ্যালগরিদমের পরিবর্তে অ্যাপ্লিকেশনটির লজিক ডেটা সেট দিয়ে তৈরি হয়। উদাহরণ স্বরূপ

পদ্ধতিগত পদ্ধতির।

int animation; // this value is the animation index

if(animation == 0)
   PerformMoveForward();
else if(animation == 1)
  PerformMoveBack();
.... // etc

তথ্য ডিজাইন পদ্ধতির

typedef struct
{
   int Index;
   void (*Perform)();
}AnimationIndice;

// build my animation dictionary
AnimationIndice AnimationIndices[] = 
  {
      { 0,PerformMoveForward }
      { 1,PerformMoveBack }
  }

// when its time to run, i use my dictionary to find my logic
int animation; // this value is the animation index
AnimationIndices[animation].Perform();

এর মতো ডেটা ডিজাইন অ্যাপ্লিকেশনটির লজিক তৈরি করতে ডেটা ব্যবহারকে উত্সাহ দেয়। বিশেষত ভিডিও গেমগুলিতে পরিচালনা করা সহজ যা এনিমেশন বা অন্য কোনও ফ্যাক্টরের উপর ভিত্তি করে কয়েক হাজার যুক্তিযুক্ত পথ থাকতে পারে।


14
এটি আসলে সঠিক নয়। আপনি ডেটা চালিত ডিজাইনের সাথে ডেটা ওরিয়েন্টড ডিজাইনকে বিভ্রান্ত করছেন। আমি নোলের আর্টিকেলটি না পড়ার আগে পর্যন্ত আমি একই জিনিসটি করেছি এবং বুঝতে পারি যে তিনি সম্পূর্ণ আলাদা কিছু নিয়ে কথা বলছেন।
এরিক এনহিম

12
এছাড়াও, ইনডিস কোনও শব্দ নয়। এখানে "সূচক" এবং "সূচকগুলি" এবং কিছু এমনকি "সূচকগুলি "ও সমাহিত করা হয় তবে" ইনডিস "কখনই ঠিক হয় না।
বাক্সিসিমো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.