सबसे पहले, डेटा चालित डिज़ाइन के साथ इसे भ्रमित न करें।
डेटा ओरिएंटेड डिज़ाइन के बारे में मेरी समझ यह है कि यह कुशल प्रोसेसिंग के लिए आपके डेटा को व्यवस्थित करने के बारे में है। विशेष रूप से कैश मिसेज आदि के संबंध में। दूसरी ओर डेटा ड्रिवेन डिज़ाइन आपके प्रोग्राम व्यवहार के बहुत सारे नियंत्रण को बताने के बारे में है ( एंड्रयू कीथ के उत्तर द्वारा बहुत अच्छी तरह से वर्णित है )।
कहते हैं कि आपके आवेदन में रंग, त्रिज्या, बंधुत्व, स्थिति आदि गुणों के साथ आपके पास गेंद की वस्तुएं हैं।
ऑब्जेक्ट ओरिएंटेड दृष्टिकोण
OOP में आप इस तरह गेंदों का वर्णन करेंगे:
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();
};
जैसा कि आप देख सकते हैं कि अब एक बॉल का प्रतिनिधित्व करने वाली कोई एकल इकाई नहीं है। बॉल ऑब्जेक्ट केवल निहित रूप से मौजूद हैं।
इसके कई फायदे हो सकते हैं, प्रदर्शन के हिसाब से। आमतौर पर हम एक ही समय में कई गेंदों पर ऑपरेशन करना चाहते हैं। हार्डवेयर आम तौर पर कुशलता से संचालित करने के लिए स्मृति की बड़ी निरंतर मात्रा चाहते हैं।
दूसरी बात यह है कि आप ऐसे ऑपरेशन कर सकते हैं जो केवल गेंदों के गुणों के हिस्से को प्रभावित करते हैं। उदाहरण के लिए, यदि आप सभी गेंदों के रंगों को विभिन्न तरीकों से जोड़ते हैं, तो आप चाहते हैं कि आपके कैश में केवल रंग की जानकारी हो। हालाँकि जब सभी बॉल प्रॉपर्टीज को एक यूनिट में स्टोर किया जाता है तो आप बॉल के अन्य सभी प्रॉपर्टी में भी खींच लेंगे। हालांकि आपको उनकी जरूरत नहीं है।
कैश उपयोग उदाहरण
कहते हैं कि प्रत्येक गेंद 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();
};
ऐसा करने का कारण यह है कि यदि एक साथ उपयोग किए गए डेटा को अलग-अलग सरणियों में रखा जाता है, तो एक जोखिम है कि वे कैश में एक ही स्लॉट के लिए प्रतिस्पर्धा करेंगे। इस प्रकार एक लोडिंग दूसरे को बाहर फेंक देगा।
तो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की तुलना में, आप जो कक्षाएं बनाते हैं, वे समस्या के आपके मानसिक मॉडल में संस्थाओं से संबंधित नहीं हैं। चूँकि डेटा उपयोग के आधार पर डेटा को एक साथ लम्प किया जाता है, इसलिए आपके पास डेटा ओरिएंटेड डिज़ाइन में अपनी कक्षाएं देने के लिए हमेशा समझदार नाम नहीं होंगे।
संबंधपरक डेटाबेस से संबंध
डेटा ओरिएंटेड डिज़ाइन के पीछे की सोच बहुत कुछ इसी तरह से है कि आप रिलेशनल डेटाबेस के बारे में कैसे सोचते हैं। रिलेशनल डेटाबेस को ऑप्टिमाइज़ करना भी कैश का अधिक कुशलता से उपयोग करना शामिल कर सकता है, हालाँकि इस स्थिति में, कैश CPU कैश नहीं है, बल्कि मेमोरी में पेज हैं। एक अच्छा डेटाबेस डिज़ाइनर भी संभवतः अलग-अलग तालिका में डेटा को अलग-अलग तालिका में विभाजित कर देगा, बड़ी संख्या में स्तंभों के साथ एक तालिका बनाने के बजाय केवल कुछ स्तंभ कभी उपयोग किए जाते हैं। वह कुछ तालिकाओं को अपभ्रंश करना चुन सकता है ताकि डिस्क पर कई स्थानों से डेटा तक पहुंच न हो। डेटा ओरिएंटेड डिज़ाइन के साथ की तरह ये विकल्प डेटा एक्सेस पैटर्न क्या हैं और प्रदर्शन अड़चन कहाँ है, को देखते हुए बनाया गया है।