2013-02-19 10 views
8

क्या यह नीचे की तरह अपने मूल वर्ग के तहत एक सबक्लास को परिभाषित करने के लिए पारंपरिक है?क्या यह अपने मूल वर्ग के भीतर एक सबक्लास को परिभाषित करने के लिए अपरंपरागत है?

class Element 

    class Div < Element 

    end 

    class Paragraph < Element 

    end 

end 

या उप-वर्गों को रखने के लिए मॉड्यूल बनाने के लिए यह अधिक उपयुक्त है?

class Element 

end 

module Elements 

    class Div < Element 

    end 

    class Paragraph < Element 

    end 

end 

या मॉड्यूल में "आधार" वर्ग बनाने और उसी मॉड्यूल के भीतर उप-वर्गों को परिभाषित करने के लिए?

module Element 

    class Base 

    end 

    class Div < Base 

    end 

    class Paragraph < Base 

    end 

end 

या नामकरण सम्मेलन को मजबूर करना बेहतर है?

class Element 

end 

class DivElement < Element 

end 

class ParagraphElement < Element 

end 

ऐसा लगता है कि प्रत्येक लाइब्रेरी एक अलग नेमस्पेसिंग/नामकरण सम्मेलन चुनती है।

उपयोग करने के लिए सबसे अच्छा कौन सा है?
प्रत्येक के पेशेवर और विपक्ष क्या हैं?

उत्तर

9

टीएल; डीआर: ऐसा करने का सबसे पारंपरिक और सबसे अच्छा तरीका बेस क्लास और इसके उप-वर्ग वाले मॉड्यूल के साथ है। लेकिन चलो सब कुछ खत्म हो जाओ।

इस पर कई आधिकारिक स्रोत नहीं हैं; हालांकि, पुस्तकालयों, कोड, और कक्षाओं के समूहों को रखने के लिए मॉड्यूल का उपयोग करने की शैली है।

उपवर्गों सुपर क्लास

में

पेशेवरों:

  • स्व निहित: पूरे वर्ग प्रणाली एक नाम के अंतर्गत निहित है

विपक्ष:

  • अप्राकृतिक: उप-वर्ग के लिए सुपरक्लास के अंदर कौन दिखने वाला लगता है?

सुपरक्लास में सबक्लास वास्तव में स्थिति पर निर्भर करता है। हालांकि, मॉड्यूल विधि द्वारा इस विधि के किसी भी लाभ को भी हासिल किया जाता है। लेकिन व्यवहार में, यह अभी नहीं किया गया है। कक्षाएं विधियों, आवृत्ति चर, कक्षा विधियों इत्यादि को शामिल करने के लिए यहां हैं, लेकिन वर्गों को घोंसले के अंतिम स्तर के रूप में माना जा सकता है - आपके पास कक्षा में कक्षा नहीं है जब तक कि यह एक बहुत ही विशिष्ट परिस्थिति न हो।

एक मामले में जहां मैं इस बनाने भावना के बारे में सोच सकते हैं एक मामले में जहां एक ही रास्ता उपवर्गों उपयोग किया जाता है, उदाहरण के लिए एक 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।

1

नाम स्थान और विरासत विभिन्न उद्देश्यों के लिए हैं। एक मॉड्यूल को दूसरे के भीतर encapsule करने के लिए नाम स्थान का उपयोग करें। एक डिफ़ॉल्ट के रूप में विधियों/चर/स्थिरांक का उपयोग कर मॉड्यूल को परिभाषित करने के लिए विरासत का उपयोग करें।

यह सिद्धांत रूप में हो सकता है कि आप एक मॉड्यूल को एक ही मॉड्यूल से नाम और उत्तराधिकारी के नाम के भीतर हो सकते हैं, लेकिन यह आपके उपयोग के मामले पर निर्भर करता है। किसी विशेष उपयोग मामले पर चर्चा किए बिना, यह तय नहीं किया जा सकता कि आपके द्वारा प्रस्तुत किए गए लोगों में से कौन सा तरीका सबसे अच्छा है।

3

यह एक समस्या है जिसे मैंने कई बार सामना किया है - आपके पास कुछ साझा कार्यक्षमता और कुछ अलग कार्यान्वयन कक्षाएं हैं जो इसका उपयोग करती हैं - यह साझा कार्यक्षमता के लिए प्राकृतिक है और कार्यान्वयन कक्षाओं के लिए नामस्थान समान नाम है। तथ्य यह है कि यह अन्य डेवलपर्स अपनी टीम पर कभी कभी भ्रमित किया गया है के लिए छोड़कर -

मैं एक समस्या अपना पहला उदाहरण के रूप में अपनी मूल वर्ग के तहत एक उपवर्ग को परिभाषित करने के लिए किया था कभी नहीं किया है। तो इस बात पर निर्भर करता है कि आप किसके साथ काम कर रहे हैं और उनकी प्राथमिकताओं क्या हैं, मुझे नहीं लगता कि इस दृष्टिकोण के साथ कोई समस्या है।

नामस्थान के लिए एक अलग नाम के साथ, मैं अभी भी दूसरा दृष्टिकोण पसंद करूंगा, अगर कोई नाम समझ गया हो। यदि नहीं है, तो मैं पहले दृष्टिकोण का उपयोग करता हूं।

मैं Base जैसे नामों का उपयोग करने से बचूंगा, क्योंकि मेरी राय में इस प्रकार का सामान्य नाम आपको वहां पुरानी चीजें फेंकने के लिए प्रोत्साहित करता है, जबकि एक नाम जो कक्षा का वर्णन करता है (उम्मीद है) आपको हर बार सोचता है यदि आप वास्तव में वहां हैं तो आप एक विधि जोड़ते हैं।

और मैं वास्तव में आपके नामकरण सम्मेलन उदाहरण के रूप में यौगिक नामों का प्रशंसक नहीं हूं, जो मैं अपने आप को अस्पष्ट महसूस कर रहा हूं कि यह डेटाबेस सामान्यीकरण की तरह है - प्रत्येक फ़ील्ड (या कक्षा का नाम) में केवल एक होना चाहिए जानकारी का अंश।

वैसे भी, मुझे उम्मीद है कि यह आपकी मदद करेगा। मैं वास्तव में अपने अनुभव के अलावा किसी अन्य स्रोत से नहीं खींच सकता (यह आपके लिए यह तय करना है कि क्या आपको लगता है कि यह 'विश्वसनीय' है), क्योंकि मुझे लगता है कि इस प्रश्न का कोई पूर्ण जवाब नहीं है। यह एक बड़े हिस्से में व्यक्तिपरक है।

संबंधित मुद्दे