एक वर्ग और एक मॉड्यूल के बीच अंतर


437

मैं जावा से आया था, और अब मैं रूबी के साथ अधिक काम कर रहा हूं।

एक भाषा सुविधा मैं से परिचित नहीं हूँ module। मैं सोच रहा हूँ कि वास्तव में क्या है moduleऔर आप एक का उपयोग कब करते हैं, और एक moduleओवर का उपयोग क्यों करते हैं class?


जवाबों:


398

पहला उत्तर अच्छा है और कुछ संरचनात्मक उत्तर देता है, लेकिन एक अन्य दृष्टिकोण यह सोचने का है कि आप क्या कर रहे हैं। मॉड्यूल उन तरीकों को प्रदान करने के बारे में हैं जिन्हें आप कई वर्गों में उपयोग कर सकते हैं - उनके बारे में "पुस्तकालयों" के रूप में सोचें (जैसा कि आप एक आरआईएस ऐप में देखेंगे)। कक्षाएं वस्तुओं के बारे में हैं; मॉड्यूल कार्यों के बारे में हैं।

उदाहरण के लिए, प्रमाणीकरण और प्राधिकरण सिस्टम मॉड्यूल के अच्छे उदाहरण हैं। प्रमाणीकरण प्रणालियां कई ऐप-स्तरीय कक्षाओं में काम करती हैं (उपयोगकर्ता प्रमाणित होते हैं, सत्र प्रमाणीकरण का प्रबंधन करते हैं, बहुत सारी अन्य कक्षाएं अलग-अलग रूप से स्थिति के आधार पर कार्य करेंगी), इसलिए प्रमाणीकरण प्रणाली साझा एपीआई के रूप में कार्य करती है।

आप एक मॉड्यूल का उपयोग तब कर सकते हैं जब आपने कई ऐप्स में तरीकों को साझा किया हो (फिर से, लाइब्रेरी मॉडल यहां अच्छा है)।


7
क्या मॉड्यूल जावा में इंटरफेसेस के समान है?
साद रहमान शाह

14
@ कैफीन वास्तव में नहीं है क्योंकि रूबी मॉड्यूल में वास्तव में कार्यान्वयन शामिल हैं, जबकि जावा में इंटरफेस अमूर्त हैं
जोर्ज इज़राइल पेना

8
नहीं, मॉड्यूल और जावा पैकेज / JAR पूरी तरह से अलग जानवर हैं।
कारोली होर्वाथ

9
मैं विधि कार्यान्वयन के साथ अमूर्त वर्गों को अधिक पसंद करता हूं।
Automatico

2
दरअसल, @ ढोल मॉड्यूल के बारे में अच्छी चीजों में से एक पर हिट करता है: नेमस्पेसिंग। इसलिए जब मॉड्यूल जावा में संकुल के समतुल्य नहीं होते हैं, तो इसका उपयोग कुछ समान हासिल करने के लिए किया जा सकता है: blog.rubybestpractices.com/posts/gregory/…
michaelok

513
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ class                     ║ module                          ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated       ║ can *not* be instantiated       ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage         ║ object creation           ║ mixin facility. provide         ║
║               ║                           ║   a namespace.                  ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass    ║ module                    ║ object                          ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods       ║ class methods and         ║ module methods and              ║
║               ║   instance methods        ║   instance methods              ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance   ║ inherits behaviour and can║ No inheritance                  ║
║               ║   be base for inheritance ║                                 ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion     ║ cannot be included        ║ can be included in classes and  ║
║               ║                           ║   modules by using the include  ║
║               ║                           ║   command (includes all         ║
║               ║                           ║   instance methods as instance  ║
║               ║                           ║   methods in a class/module)    ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension     ║ can not extend with       ║ module can extend instance by   ║
║               ║   extend command          ║   using extend command (extends ║
║               ║   (only with inheritance) ║   given instance with singleton ║
║               ║                           ║   methods from module)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

'क्लास' क्लास का सुपरक्लास क्या है?
आशीष पी।

10
मुझे पदानुक्रम मिला, क्लास -> मॉड्यूल -> ऑब्जेक्ट -> बेसिकऑब्जेक्ट। ठंडा!!
आशीष पी।

"मॉड्यूल में" ओबिट वेरिएबल्स क्यों होते हैं, जब क्लास और मॉड्यूल दोनों क्लास वेरिएबल का समर्थन करते हैं? करने के लिए स्वीकार किए जाते हैं जवाब देखें stackoverflow.com/questions/5690458/...
kaleidic

इन सभी उत्तरों में बहुत सारे आरेख। एक छोटा सा चल उदाहरण: rubyfiddle.com/riddles/06081
Donato

16
कैसे एक मॉड्यूल "त्वरित नहीं किया जा सकता" और अभी तक उदाहरण के तरीके हैं?
devius

91

मुझे आश्चर्य है कि किसी ने भी अभी तक यह नहीं कहा है।

चूँकि पूछने वाला जावा पृष्ठभूमि से आया था (और इसलिए मैंने), यहाँ एक सादृश्य है जो मदद करता है।

कक्षाएं केवल जावा कक्षाओं की तरह होती हैं।

मॉड्यूल जावा स्थिर वर्गों की तरह हैं। Mathजावा में वर्ग के बारे में सोचो । आप इसे तुरंत नहीं करते हैं, और आप स्टैटिक क्लास में विधियों का पुन: उपयोग करते हैं (जैसे। Math.random())।


11
लेकिन मॉड्यूल शामिल वर्ग में उदाहरण के तरीके भी जोड़ सकते हैं, जबकि जावा में स्थिर वर्ग नहीं कर सकते।
मोनिका को बहाल करें -

4
यह कथन भी भारी C # पृष्ठभूमि से आने वाला सच है।
डेमॉन ड्रेक

5
यह पूरी तरह सच नहीं है; मॉड्यूल में स्थिर विधियां नहीं हैं, उनके पास सिर्फ विधियां हैं। मॉड्यूल "खुद को विस्तारित कर सकते हैं" (वाक्यविन्यास वास्तव में है extend self), उनके तरीकों को उनके selfमेटाक्लस के लिए उपलब्ध कराते हैं। यह random()एक Mathमॉड्यूल की तरह एक विधि को भेजने के लिए संभव बनाता है । लेकिन उनकी प्रकृति से, एक मॉड्यूल के तरीकों को मॉड्यूल के स्वयं पर नहीं बुलाया जा सकता है self। यह रूबी की धारणा self, उसके मेटाक्लेसेस और विधि खोज कार्य के साथ क्या करना है। विवरण के लिए "मेटाप्रोग्रामिंग रूबी" देखें - पाओलो पेर्लोटा।
scottburton11

मैं कहता हूं कि मॉड्यूल उन तरीकों के इंटरफेस के समान हैं (जावा 8 इंटरफेस डिफ़ॉल्ट रूप से निहित हैं), लेकिन जावा इंटरफेस के विपरीत एक दूसरे से विरासत में नहीं मिल सकता है
divideByZero

इस जवाब के पास इतने वोट कैसे हैं? btw कि बेहतर शब्दों में 1mo से पहले कहा गया था: stackoverflow.com/a/17027346/986862
आंद्रे Figueiredo

39

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

एक मॉड्यूल कई वर्गों द्वारा शामिल किया जा सकता है। मॉड्यूल विरासत में नहीं मिल सकते हैं, लेकिन यह "मिक्सिन" मॉडल एक उपयोगी प्रकार "मल्टीपल इनहेरिट्रेंस" प्रदान करता है। OO शुद्धतावादी उस कथन से असहमत होंगे, लेकिन काम पाने के रास्ते में शुद्धता नहीं आने देंगे।


(यह उत्तर मूल रूप से जुड़ा हुआ है http://www.rubycentral.com/pickaxe/classes.html, लेकिन यह लिंक और इसका डोमेन अब सक्रिय नहीं हैं।)


हाँ, यह इस तरह से काम करता है। जैसे, मॉड्यूल जावा की "स्थिर" कक्षाओं के लिए तुलनीय नहीं हैं; प्रॉक्सी सुपरक्लास (कुछ इसे "मेटाक्लास" कहते हैं) मॉड्यूल की विधि प्रेषण संदेशों का रिसीवर बन जाता है, जो इसे जावा में एक स्थिर वर्ग के लिए अधिक तुलनीय बनाता है , और इसके तरीके स्थिर तरीकों की तरह काम करते हैं। यह सच है, हालांकि, रूबी की कक्षाओं के लिए, जो extendएक कक्षा को आईएनजी द्वारा "स्थिर"-समान तरीकों पर ले जा सकता है । रूबी वास्तव में "उदाहरण" और "क्लास / स्टैटिक" तरीकों में बिल्कुल भी अंतर नहीं करती है, उनमें से केवल रिसीवर हैं।
22 सितंबर को scottburton11

7

Moduleरूबी में, एक हद तक, जावा सार वर्ग से मेल खाती है - उदाहरण के तरीके हैं, कक्षाएं इससे प्राप्त कर सकती हैं (के माध्यम से include, रूबी लोग इसे "मिक्सिन" कहते हैं), लेकिन कोई उदाहरण नहीं है। अन्य छोटे अंतर हैं, लेकिन यह बहुत जानकारी आपको आरंभ करने के लिए पर्याप्त है।


6

नाम स्थान: मॉड्यूल नामस्थान हैं ... जो जावा में मौजूद नहीं हैं;)

मैंने जावा और अजगर से रूबी में भी स्विच किया, मुझे याद है कि वास्तव में यही सवाल था ...

तो सबसे सरल उत्तर यह है कि मॉड्यूल एक नाम स्थान है, जो जावा में मौजूद नहीं है। जावा में नेमस्पेस के लिए निकटतम मानसिकता एक पैकेज है

तो माणिक में एक मॉड्यूल जावा में क्या है:
कक्षा? कोई
इंटरफ़ेस नहीं ? कोई
अमूर्त वर्ग? कोई
पैकेज नहीं ? हाँ शायद)

जावा में कक्षाओं के अंदर स्थिर तरीके: रूबी में मॉड्यूल के अंदर के तरीके

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

तो एक मॉड्यूल में क्या जाता है?
कक्षाएं, विधियाँ, स्थिरांक। मॉड्यूल उस नाम स्थान के तहत उनकी रक्षा करता है।

कोई उदाहरण नहीं: इंस्टेंस बनाने के लिए मॉड्यूल का उपयोग नहीं किया जा सकता है

मिश्रित इन्स: कभी-कभी वंशानुक्रम मॉडल कक्षाओं के लिए अच्छे नहीं होते हैं, लेकिन कार्यक्षमता के संदर्भ में एक साथ वर्गों / विधियों / बाधाओं का समूह बनाना चाहते हैं

रूबी में मॉड्यूल के बारे में नियम:
- मॉड्यूल नाम अपरकंपेलकेस हैं
- मॉड्यूल के भीतर स्थिरांक सभी CAPS हैं (यह नियम सभी रूबी स्थिरांक के लिए समान है, मॉड्यूल के लिए विशिष्ट नहीं है)
- उपयोग के तरीके: उपयोग। ऑपरेटर
- पहुंच स्थिरांक: उपयोग :: प्रतीक

एक मॉड्यूल का सरल उदाहरण:

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

मॉड्यूल के अंदर तरीकों का उपयोग कैसे करें:

puts MySampleModule.method_one(1) # prints: 3

एक मॉड्यूल के स्थिरांक का उपयोग कैसे करें:

puts MySampleModule::CONST1 # prints: some constant

मॉड्यूल के बारे में कुछ अन्य सम्मेलनों:
फ़ाइल में एक मॉड्यूल का उपयोग करें (जैसे रूबी कक्षाएं, रूबी फ़ाइल प्रति एक वर्ग)


"- उपयोग के तरीके: उपयोग। ऑपरेटर - पहुंच स्थिरांक: उपयोग :: प्रतीक ”केवल इस उत्तर ने इसका उल्लेख किया!
किउलंग

4

नीचे पंक्ति: एक मॉड्यूल एक स्थिर / उपयोगिता वर्ग और एक मिश्रण के बीच एक क्रॉस है।

मिक्सिन "आंशिक" कार्यान्वयन के पुन: प्रयोज्य टुकड़े हैं, जो कि अन्य वर्गों को लिखने में मदद करने के लिए मिक्स एंड मैच फैशन में संयुक्त (या रचना) हो सकते हैं। इन वर्गों के पास निश्चित रूप से अपना राज्य और / या कोड हो सकता है।


1

कक्षा

जब आप एक वर्ग को परिभाषित करते हैं, तो आप डेटा प्रकार के लिए एक खाका परिभाषित करते हैं। क्लास होल्ड डेटा, मेथड है जो उस डेटा के साथ इंटरैक्ट करता है और ऑब्जेक्ट्स को इंस्टेंट करने के लिए उपयोग किया जाता है।

मापांक

  • मॉड्यूल एक तरह से समूह बनाने का एक तरीका है, कक्षाएं, और स्थिरांक।

  • मॉड्यूल आपको दो प्रमुख लाभ देते हैं:

    => मॉड्यूल एक नाम स्थान प्रदान करते हैं और नाम संघर्ष को रोकते हैं। Namespace फ़ंक्शंस और वर्गों के साथ टकराव से बचने में मदद करता है उसी नाम के साथ जो किसी और द्वारा लिखा गया है।

    => मॉड्यूल मिश्रण सुविधा को लागू करते हैं।

(क्लाज में मॉड्यूल सहित मॉड्यूल विधियों के लिए क्लाज एक्सेस का उदाहरण दिया गया है।)

(मॉड के साथ क्लाज का विस्तार करें क्लास मोड्स को क्लाज एक्सेस दे रहा है।)


0

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

लेकिन आपको खुद से यह पूछने की ज़रूरत है कि प्रोग्रामिंग भाषा में क्लास और मॉड्यूल दोनों होने का क्या उद्देश्य है? एक वर्ग को उदाहरण बनाने के लिए एक खाका बनाने का इरादा है, और प्रत्येक उदाहरण खाका का एक वास्तविक रूपांतर है। एक उदाहरण केवल एक ब्लूप्रिंट (क्लास) का एक वास्तविक रूपांतर है। स्वाभाविक रूप से तब, कक्षाएं ऑब्जेक्ट निर्माण के रूप में कार्य करती हैं। इसके अलावा, चूंकि हम कभी-कभी एक ब्लूप्रिंट को दूसरे ब्लूप्रिंट से प्राप्त करना चाहते हैं, इसलिए कक्षाएं विरासत का समर्थन करने के लिए डिज़ाइन की गई हैं।

मॉड्यूल त्वरित नहीं किया जा सकता है, वस्तुओं का निर्माण नहीं करते हैं, और विरासत का समर्थन नहीं करते हैं। इसलिए याद रखें कि एक मॉड्यूल दूसरे से विरासत में नहीं आता है!

तो फिर एक भाषा में मॉड्यूल होने की बात क्या है? मॉड्यूल का एक स्पष्ट उपयोग एक नाम स्थान बनाने के लिए है, और आप इसे अन्य भाषाओं के साथ भी नोटिस करेंगे। फिर, रूबी के बारे में क्या अच्छा है कि मॉड्यूल को फिर से खोला जा सकता है (सिर्फ कक्षाओं के रूप में)। और यह एक बड़ा उपयोग है जब आप विभिन्न रूबी फ़ाइलों में एक नाम स्थान का पुन: उपयोग करना चाहते हैं:

module Apple
  def a
    puts 'a'
  end
end

module Apple 
  def b
    puts 'b'
  end
end

class Fruit
  include Apple
end

 > f = Fruit.new
 => #<Fruit:0x007fe90c527c98> 
 > f.a
 => a
 > f.b
 => b

लेकिन मॉड्यूल के बीच कोई विरासत नहीं है:

module Apple
  module Green
    def green
      puts 'green'
    end
  end
end

class Fruit
  include Apple
end

> f = Fruit.new
 => #<Fruit:0x007fe90c462420> 
> f.green
NoMethodError: undefined method `green' for #<Fruit:0x007fe90c462420>

Apple मॉड्यूल को हरे रंग के मॉड्यूल से कोई भी विधि विरासत में नहीं मिली और जब हमने Apple को फलों की श्रेणी में शामिल किया, तो Apple मॉड्यूल की विधियों को Apple उदाहरणों की पूर्वज श्रृंखला में जोड़ा जाता है, लेकिन ग्रीन मॉड्यूल के तरीकों को नहीं, भले ही ग्रीन मॉड्यूल को एप्पल मॉड्यूल में परिभाषित किया गया था।

तो हम हरे रंग की विधि तक कैसे पहुंचें? आपको इसे स्पष्ट रूप से अपनी कक्षा में शामिल करना होगा:

class Fruit
  include Apple::Green
end
 => Fruit 
 > f.green
=> green

लेकिन रूबी मॉड्यूल के लिए एक और महत्वपूर्ण उपयोग है। यह मिक्सिन सुविधा है, जिसका मैं एसओ पर एक अन्य उत्तर में वर्णन करता हूं। लेकिन संक्षेप में, मिश्रण आपको वस्तुओं की विरासत श्रृंखला में तरीकों को परिभाषित करने की अनुमति देता है। मिश्रण के माध्यम से, आप ऑब्जेक्ट इंस्टेंसेस (शामिल) या स्वयं के सिंगलटन_क्लास की विरासत श्रृंखला में विधियाँ जोड़ सकते हैं (विस्तार करें)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.