बधाई हो! आपने अभी-अभी प्रोग्रामिंग लैंग्वेज / टाइप सिस्टम ग्लोब को सर्कुलेट किया है, जो आपने विदा ली दुनिया की दूसरी ओर पहुंची है। आप सिर्फ गतिशील भाषा / प्रोटोटाइप-आधारित वस्तु भूमि की सीमा पर आ गए हैं!
कई गतिशील भाषाएं (जैसे जावास्क्रिप्ट, पीएचपी, पायथन) किसी को रनटाइम पर ऑब्जेक्ट गुण का विस्तार करने या बदलने की अनुमति देती हैं।
इसका चरम रूप स्व या जावास्क्रिप्ट जैसी प्रोटोटाइप आधारित भाषा है । उनके पास कक्षाएं नहीं हैं, सख्ती से बोल रहा हूं। आप उन चीजों को कर सकते हैं जो वंशानुक्रम के साथ वर्ग-आधारित, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग जैसी दिखती हैं, लेकिन जावा और C # जैसी अधिक तेजी से परिभाषित, वर्ग-आधारित भाषाओं की तुलना में नियमों में बहुत ढील दी गई है।
PHP और Python जैसी लैंगगॉज बीच मैदान में रहती हैं। उनके पास नियमित, मुहावरेदार वर्ग-आधारित प्रणालियाँ हैं। लेकिन ऑब्जेक्ट विशेषताओं को रनटाइम पर जोड़ा, बदला या हटाया जा सकता है - कुछ प्रतिबंधों के साथ (जैसे "अंतर्निहित प्रकारों को छोड़कर") जो आपको जावास्क्रिप्ट में नहीं मिलते हैं।
इस गतिशीलता के लिए बड़ा व्यापार प्रदर्शन है। भूल जाएं कि भाषा कितनी दृढ़ता से या कमजोर रूप से टाइप की गई है, या इसे मशीन कोड में कितनी अच्छी तरह संकलित किया जा सकता है। सरल वस्तुओं के बजाय गतिशील वस्तुओं को लचीले नक्शे / शब्दकोशों के रूप में दर्शाया जाना चाहिए। यह प्रत्येक ऑब्जेक्ट एक्सेस के लिए ओवरहेड जोड़ता है। कुछ कार्यक्रम इस ओवरहेड को कम करने के लिए बहुत अधिक लंबाई तक जाते हैं (जैसे कि पायथन क्वरग असाइनमेंट और पायथन में स्लॉट-आधारित कक्षाएं), लेकिन अतिरिक्त ओवरहेड आमतौर पर पाठ्यक्रम और प्रवेश की कीमत के बराबर है।
अपने डिज़ाइन पर वापस आ रहे हैं, आप अपनी कक्षाओं के सबसेट पर गतिशील गुण रखने की क्षमता तैयार कर रहे हैं। A Product
में परिवर्तनशील गुण हो सकते हैं; मुमकिन है कि Invoice
कोई Order
ऐसा कर सकता है या नहीं। यह एक बुरा तरीका नहीं है। यह आपको एक सख्त, अनुशासित भाषा और प्रकार प्रणाली में रहते हुए, जहाँ आपको इसकी आवश्यकता है, वहाँ भिन्नता प्रदान करने की सुविधा देता है। नीचे की तरफ, आप उन लचीले गुणों को प्रबंधित करने के लिए जिम्मेदार हैं, और आपको संभवतः ऐसा तंत्र के माध्यम से करना होगा जो अधिक देशी विशेषताओं से थोड़ा अलग दिखता है। p.prop('tensile_strength')
इसके बजाय p.tensile_strength
, उदाहरण के लिए, और p.set_prop('tensile_strength', 104.4)
इसके बजायp.tensile_strength = 104.4
। लेकिन मैंने पास्कल, एडा, सी, जावा और यहां तक कि गतिशील भाषाओं में कई कार्यक्रमों के साथ काम किया है और गैर-मानक विशेषता प्रकारों के लिए बिल्कुल ऐसे गेट्टर-सेटर का उपयोग किया है; दृष्टिकोण स्पष्ट रूप से व्यावहारिक है।
वैसे, स्थैतिक प्रकारों और अत्यधिक विविध दुनिया के बीच यह तनाव बेहद सामान्य है। डेटाबेस स्कीमा को डिजाइन करते समय एक विशेष समस्या अक्सर देखी जाती है, खासकर रिलेशनल और प्री-रिलेशनल डेटा स्टोर के लिए। कभी-कभी यह "सुपर-पंक्तियों" को बनाकर निपटा दिया जाता है जिसमें सभी कल्पित विविधताओं के मिलन को परिभाषित करने या परिभाषित करने के लिए पर्याप्त लचीलापन होता है, फिर उन क्षेत्रों में आने वाले किसी भी डेटा को भरा जाता है। वर्डप्रेस wp_posts
तालिका , उदाहरण के लिए, जैसे क्षेत्रों है comment_count
, ping_status
, post_parent
और post_date_gmt
है कि केवल कुछ परिस्थितियों में दिलचस्प हैं, और व्यवहार में अक्सर खाली जाना है। एक और दृष्टिकोण एक बहुत ही अतिरिक्त, सामान्यीकृत तालिका है wp_options
, जैसे बहुत कुछProperty
कक्षा। हालांकि इसके लिए अधिक स्पष्ट प्रबंधन की आवश्यकता होती है, लेकिन इसमें आइटम शायद ही कभी खाली होते हैं। ऑब्जेक्ट-ओरिएंटेड और डॉक्यूमेंट डेटाबेस (जैसे MongoDB) में अक्सर बदलते विकल्पों के साथ काम करने का एक आसान समय होता है, क्योंकि वे अपनी इच्छानुसार विशेषताओं को बना और सेट कर सकते हैं।