टीएल; डीआर: ऐसा करने का सबसे पारंपरिक और सबसे अच्छा तरीका बेस क्लास और इसके उप-वर्ग वाले मॉड्यूल के साथ है। लेकिन चलो सब कुछ खत्म हो जाओ।
इस पर कई आधिकारिक स्रोत नहीं हैं; हालांकि, पुस्तकालयों, कोड, और कक्षाओं के समूहों को रखने के लिए मॉड्यूल का उपयोग करने की शैली है।
उपवर्गों सुपर क्लास
में
पेशेवरों:
- स्व निहित: पूरे वर्ग प्रणाली एक नाम के अंतर्गत निहित है
विपक्ष:
- अप्राकृतिक: उप-वर्ग के लिए सुपरक्लास के अंदर कौन दिखने वाला लगता है?
सुपरक्लास में सबक्लास वास्तव में स्थिति पर निर्भर करता है। हालांकि, मॉड्यूल विधि द्वारा इस विधि के किसी भी लाभ को भी हासिल किया जाता है। लेकिन व्यवहार में, यह अभी नहीं किया गया है। कक्षाएं विधियों, आवृत्ति चर, कक्षा विधियों इत्यादि को शामिल करने के लिए यहां हैं, लेकिन वर्गों को घोंसले के अंतिम स्तर के रूप में माना जा सकता है - आपके पास कक्षा में कक्षा नहीं है जब तक कि यह एक बहुत ही विशिष्ट परिस्थिति न हो।
एक मामले में जहां मैं इस बनाने भावना के बारे में सोच सकते हैं एक मामले में जहां एक ही रास्ता उपवर्गों उपयोग किया जाता है, उदाहरण के लिए एक Formatter
वर्ग XML
, PDF
, आदि जैसे आंतरिक subclassses है कि मान लीजिए सुपर क्लास के माध्यम से है केवल Formatter.new(:xml)
जैसी चीजें करके इन कक्षाओं का उपयोग करें। लेकिन अगर हम ऐसा कर रहे हैं, तो सबक्लास निजी हो सकते हैं और बाहरी दुनिया के लिए सुलभ नहीं हो सकते हैं। और उस समय, विरासत एक बहुत सी ++ वाई रास्ता है और बिल्कुल रूबीश नहीं है।
बेस कक्षा के बाहर मॉड्यूल, भीतर
पेशेवरों उपवर्गों:
विपक्ष के बारे में सोच नहीं सकते हैं:
- गैर तात्पर्य - माना जाता है: यदि तत्व अपने नाम के समान नामस्थान में नहीं है, तो नाम से परे, मुझे यह भी बताता है कि यह भी संबंधित है?
यह विधि बहुत ही अप्राकृतिक है। यह ऐसा लगता है कि Element
के पास इसके बच्चों के साथ कुछ लेना देना नहीं है, या यदि अलग-अलग देखा जाता है, तो यह बच्चे आंतरिक कार्यान्वयन विवरण हैं जिनके साथ निपटाया जाना नहीं है। किसी भी तरह से यह शर्मीली, मैला नामकरण और खराब कोड संरचना योजना की तरह दिखता है। अगर मैं इसका उपयोग कर कोड पढ़ रहा था, तो मुझे यह देखने के लिए Elements
मॉड्यूल की सामग्री को देखना होगा कि Element
बिल्कुल उपclassed था - और यह करने के लिए सबसे स्वाभाविक बात नहीं है।
क्लास और मॉड्यूल में उपवर्गों (सबसे अच्छा समाधान)
सकारात्मक:
- निहित: सुपर क्लास और सभी तत्व कक्षाएं एक नाम स्थान में निहित हैं, उन्हें आसानी से आयात करने के लिए अनुमति देता है, के लिए आवश्यक , पुनरावृत्त, आदि मेटाप्रोग्रामिंग की भी सहायता करता है।
- शामिल: कक्षाएं किसी भी कोड में
include
एड आसानी से हो सकती हैं।
- साफ़ करें:
Element
और उप-वर्गों के बीच एक स्पष्ट सहयोग है। वे स्पष्ट रूप से कार्यक्षमता का एक बंडल हैं।
विपक्ष:
- प्रोत्साहित आलसी नामकरण: यह
Base
की तरह नाम कक्षाएं चीजें हैं जो बहुत अस्पष्ट हैं करने के लिए प्रोत्साहित करता है।
यह सबसे अच्छा तरीका है। यह कक्षाओं को एक साफ बंडल बनाता है, जबकि अभी भी एक स्पष्ट सहयोग और एक स्पष्ट दिखा रहा है "यहां, मेरे Div
वर्ग का उपयोग करें" (उप-वर्ग-श्रेणी में रणनीति के विपरीत)। साथ ही, यह मेटाप्रोग्रामिंग के लिए वास्तव में सहायक है, जहां चीजों को काम करने के लिए मॉड्यूल में सब कुछ महत्वपूर्ण है। अंत में, यह autoload
, require_relative
, include
इत्यादि जैसी संरचनाओं के साथ अच्छी तरह से काम करता है। ये दिखाते हैं कि इस तरह से भाषा का उपयोग करने के लिए डिज़ाइन किया गया था।
सेना एक नामकरण परंपरा
सकारात्मक:
- सरल: यहाँ कोई जटिलता।
- अस्पष्टता को हटाता है:
Div
या Para
जैसे छोटे नामों से अस्पष्टता को DivElement
और ParaElement
में बदलकर हटा देता है।
विपक्ष:
- पुरातन: नामकरण समूह वर्ग या तरीकों के सम्मेलनों केवल भाषाओं कि यह करने के लिए, सी या ऑब्जेक्टिव-सी की तरह एक बेहतर तरीका नहीं है में मौजूद होना चाहिए। सी ++ ने इसे नामस्थान के रूप में जल्द ही गिरा दिया।
- नहीं programatic समूह: ये नामकरण रिवाजों का है, जबकि मनुष्य के लिए स्पष्ट, वर्ग संरचना बहुत कोड metaprograming को बादल छाए रहेंगे, और यह असंभव एक समूह
- के रूप में कक्षाओं से निपटने के लिए कार्यक्रम के लिए बनाने के ग्लोबल नेम स्पेस को प्रदूषित करता है: यह बनाता है वैश्विक नामस्थान में कई नाम, जो हमेशा एक बुरा विचार है।
यह एक बहुत, बहुत बुरा समाधान है। यह छोटे संगठन और थोड़ी सी समझ के साथ मैला, सी-शैली कोड लिखने को प्रोत्साहित करता है। इन प्रकार के नामकरण सम्मेलनों का केवल उन भाषाओं में उपयोग किया जाना चाहिए जहां कोई बेहतर समाधान नहीं है, और रूबी के पास बहुत अच्छे समाधान हैं।एक सरणी में सभी वर्गों को परिभाषित करना भी नामकरण सम्मेलन से बेहतर है।
नोट: हालांकि, अगर तुम सच में करने के लिए, आप जब तक Div
या Para
जैसे छोटे नाम पर एक नामकरण परंपरा परिभाषित कर सकते हैं के रूप में आप अभी भी एक मॉड्यूल में उन्हें रखना इतना है कि यह Elements::DivElement
है चाहते हैं। हालांकि, यह डीआरवाई का उल्लंघन करता है, और मैं इसका सुझाव नहीं दूंगा।
निष्कर्ष
तो, आपके पास वास्तव में दो विकल्प हैं। बस एक मॉड्यूल में सब कुछ डाल दिया:
module Elements
class Element; end
class Div < Element; end
#etc...
end
या, एक नामकरण परंपरा के साथ एक मॉड्यूल में सब कुछ डाल दिया:
module Elements
class Element; end
class DivElement < Element; end
#etc...
end
मैं स्पष्टता, मानक तरीकों का उपयोग, और metaprogramming कारणों के लिए पूर्व sugest।