जवाबों:
पहला उत्तर अच्छा है और कुछ संरचनात्मक उत्तर देता है, लेकिन एक अन्य दृष्टिकोण यह सोचने का है कि आप क्या कर रहे हैं। मॉड्यूल उन तरीकों को प्रदान करने के बारे में हैं जिन्हें आप कई वर्गों में उपयोग कर सकते हैं - उनके बारे में "पुस्तकालयों" के रूप में सोचें (जैसा कि आप एक आरआईएस ऐप में देखेंगे)। कक्षाएं वस्तुओं के बारे में हैं; मॉड्यूल कार्यों के बारे में हैं।
उदाहरण के लिए, प्रमाणीकरण और प्राधिकरण सिस्टम मॉड्यूल के अच्छे उदाहरण हैं। प्रमाणीकरण प्रणालियां कई ऐप-स्तरीय कक्षाओं में काम करती हैं (उपयोगकर्ता प्रमाणित होते हैं, सत्र प्रमाणीकरण का प्रबंधन करते हैं, बहुत सारी अन्य कक्षाएं अलग-अलग रूप से स्थिति के आधार पर कार्य करेंगी), इसलिए प्रमाणीकरण प्रणाली साझा एपीआई के रूप में कार्य करती है।
आप एक मॉड्यूल का उपयोग तब कर सकते हैं जब आपने कई ऐप्स में तरीकों को साझा किया हो (फिर से, लाइब्रेरी मॉडल यहां अच्छा है)।
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ 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) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
मुझे आश्चर्य है कि किसी ने भी अभी तक यह नहीं कहा है।
चूँकि पूछने वाला जावा पृष्ठभूमि से आया था (और इसलिए मैंने), यहाँ एक सादृश्य है जो मदद करता है।
कक्षाएं केवल जावा कक्षाओं की तरह होती हैं।
मॉड्यूल जावा स्थिर वर्गों की तरह हैं। Math
जावा में वर्ग के बारे में सोचो । आप इसे तुरंत नहीं करते हैं, और आप स्टैटिक क्लास में विधियों का पुन: उपयोग करते हैं (जैसे। Math.random()
)।
extend self
), उनके तरीकों को उनके self
मेटाक्लस के लिए उपलब्ध कराते हैं। यह random()
एक Math
मॉड्यूल की तरह एक विधि को भेजने के लिए संभव बनाता है । लेकिन उनकी प्रकृति से, एक मॉड्यूल के तरीकों को मॉड्यूल के स्वयं पर नहीं बुलाया जा सकता है self
। यह रूबी की धारणा self
, उसके मेटाक्लेसेस और विधि खोज कार्य के साथ क्या करना है। विवरण के लिए "मेटाप्रोग्रामिंग रूबी" देखें - पाओलो पेर्लोटा।
मूल रूप से, मॉड्यूल को तत्काल नहीं किया जा सकता है। जब एक वर्ग में एक मॉड्यूल शामिल होता है, तो एक प्रॉक्सी सुपरक्लास उत्पन्न होता है जो सभी मॉड्यूल विधियों के साथ-साथ कक्षा के तरीकों तक पहुंच प्रदान करता है।
एक मॉड्यूल कई वर्गों द्वारा शामिल किया जा सकता है। मॉड्यूल विरासत में नहीं मिल सकते हैं, लेकिन यह "मिक्सिन" मॉडल एक उपयोगी प्रकार "मल्टीपल इनहेरिट्रेंस" प्रदान करता है। OO शुद्धतावादी उस कथन से असहमत होंगे, लेकिन काम पाने के रास्ते में शुद्धता नहीं आने देंगे।
(यह उत्तर मूल रूप से जुड़ा हुआ है http://www.rubycentral.com/pickaxe/classes.html
, लेकिन यह लिंक और इसका डोमेन अब सक्रिय नहीं हैं।)
extend
एक कक्षा को आईएनजी द्वारा "स्थिर"-समान तरीकों पर ले जा सकता है । रूबी वास्तव में "उदाहरण" और "क्लास / स्टैटिक" तरीकों में बिल्कुल भी अंतर नहीं करती है, उनमें से केवल रिसीवर हैं।
Module
रूबी में, एक हद तक, जावा सार वर्ग से मेल खाती है - उदाहरण के तरीके हैं, कक्षाएं इससे प्राप्त कर सकती हैं (के माध्यम से include
, रूबी लोग इसे "मिक्सिन" कहते हैं), लेकिन कोई उदाहरण नहीं है। अन्य छोटे अंतर हैं, लेकिन यह बहुत जानकारी आपको आरंभ करने के लिए पर्याप्त है।
नाम स्थान: मॉड्यूल नामस्थान हैं ... जो जावा में मौजूद नहीं हैं;)
मैंने जावा और अजगर से रूबी में भी स्विच किया, मुझे याद है कि वास्तव में यही सवाल था ...
तो सबसे सरल उत्तर यह है कि मॉड्यूल एक नाम स्थान है, जो जावा में मौजूद नहीं है। जावा में नेमस्पेस के लिए निकटतम मानसिकता एक पैकेज है ।
तो माणिक में एक मॉड्यूल जावा में क्या है:
कक्षा? कोई
इंटरफ़ेस नहीं ? कोई
अमूर्त वर्ग? कोई
पैकेज नहीं ? हाँ शायद)
जावा में कक्षाओं के अंदर स्थिर तरीके: रूबी में मॉड्यूल के अंदर के तरीके
जावा में न्यूनतम इकाई एक वर्ग है, आपके पास एक वर्ग के बाहर एक फ़ंक्शन नहीं हो सकता है। हालांकि माणिक में यह संभव है (जैसे अजगर)।
तो एक मॉड्यूल में क्या जाता है?
कक्षाएं, विधियाँ, स्थिरांक। मॉड्यूल उस नाम स्थान के तहत उनकी रक्षा करता है।
कोई उदाहरण नहीं: इंस्टेंस बनाने के लिए मॉड्यूल का उपयोग नहीं किया जा सकता है
मिश्रित इन्स: कभी-कभी वंशानुक्रम मॉडल कक्षाओं के लिए अच्छे नहीं होते हैं, लेकिन कार्यक्षमता के संदर्भ में एक साथ वर्गों / विधियों / बाधाओं का समूह बनाना चाहते हैं
रूबी में मॉड्यूल के बारे में नियम:
- मॉड्यूल नाम अपरकंपेलकेस हैं
- मॉड्यूल के भीतर स्थिरांक सभी 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
मॉड्यूल के बारे में कुछ अन्य सम्मेलनों:
फ़ाइल में एक मॉड्यूल का उपयोग करें (जैसे रूबी कक्षाएं, रूबी फ़ाइल प्रति एक वर्ग)
नीचे पंक्ति: एक मॉड्यूल एक स्थिर / उपयोगिता वर्ग और एक मिश्रण के बीच एक क्रॉस है।
मिक्सिन "आंशिक" कार्यान्वयन के पुन: प्रयोज्य टुकड़े हैं, जो कि अन्य वर्गों को लिखने में मदद करने के लिए मिक्स एंड मैच फैशन में संयुक्त (या रचना) हो सकते हैं। इन वर्गों के पास निश्चित रूप से अपना राज्य और / या कोड हो सकता है।
कक्षा
जब आप एक वर्ग को परिभाषित करते हैं, तो आप डेटा प्रकार के लिए एक खाका परिभाषित करते हैं। क्लास होल्ड डेटा, मेथड है जो उस डेटा के साथ इंटरैक्ट करता है और ऑब्जेक्ट्स को इंस्टेंट करने के लिए उपयोग किया जाता है।
मापांक
मॉड्यूल एक तरह से समूह बनाने का एक तरीका है, कक्षाएं, और स्थिरांक।
मॉड्यूल आपको दो प्रमुख लाभ देते हैं:
=> मॉड्यूल एक नाम स्थान प्रदान करते हैं और नाम संघर्ष को रोकते हैं। Namespace फ़ंक्शंस और वर्गों के साथ टकराव से बचने में मदद करता है उसी नाम के साथ जो किसी और द्वारा लिखा गया है।
=> मॉड्यूल मिश्रण सुविधा को लागू करते हैं।
(क्लाज में मॉड्यूल सहित मॉड्यूल विधियों के लिए क्लाज एक्सेस का उदाहरण दिया गया है।)
(मॉड के साथ क्लाज का विस्तार करें क्लास मोड्स को क्लाज एक्सेस दे रहा है।)
सबसे पहले, कुछ समानताएं जिनका उल्लेख अभी तक नहीं किया गया है। रूबी खुली कक्षाओं का समर्थन करती है, लेकिन मॉड्यूल भी खुले हैं। आखिरकार, क्लास इनहेरिटेंस चेन में क्लास से मॉड्यूल इनहेरिट करता है और इसलिए क्लास और मॉड्यूल में कुछ समान व्यवहार होता है।
लेकिन आपको खुद से यह पूछने की ज़रूरत है कि प्रोग्रामिंग भाषा में क्लास और मॉड्यूल दोनों होने का क्या उद्देश्य है? एक वर्ग को उदाहरण बनाने के लिए एक खाका बनाने का इरादा है, और प्रत्येक उदाहरण खाका का एक वास्तविक रूपांतर है। एक उदाहरण केवल एक ब्लूप्रिंट (क्लास) का एक वास्तविक रूपांतर है। स्वाभाविक रूप से तब, कक्षाएं ऑब्जेक्ट निर्माण के रूप में कार्य करती हैं। इसके अलावा, चूंकि हम कभी-कभी एक ब्लूप्रिंट को दूसरे ब्लूप्रिंट से प्राप्त करना चाहते हैं, इसलिए कक्षाएं विरासत का समर्थन करने के लिए डिज़ाइन की गई हैं।
मॉड्यूल त्वरित नहीं किया जा सकता है, वस्तुओं का निर्माण नहीं करते हैं, और विरासत का समर्थन नहीं करते हैं। इसलिए याद रखें कि एक मॉड्यूल दूसरे से विरासत में नहीं आता है!
तो फिर एक भाषा में मॉड्यूल होने की बात क्या है? मॉड्यूल का एक स्पष्ट उपयोग एक नाम स्थान बनाने के लिए है, और आप इसे अन्य भाषाओं के साथ भी नोटिस करेंगे। फिर, रूबी के बारे में क्या अच्छा है कि मॉड्यूल को फिर से खोला जा सकता है (सिर्फ कक्षाओं के रूप में)। और यह एक बड़ा उपयोग है जब आप विभिन्न रूबी फ़ाइलों में एक नाम स्थान का पुन: उपयोग करना चाहते हैं:
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
लेकिन रूबी मॉड्यूल के लिए एक और महत्वपूर्ण उपयोग है। यह मिक्सिन सुविधा है, जिसका मैं एसओ पर एक अन्य उत्तर में वर्णन करता हूं। लेकिन संक्षेप में, मिश्रण आपको वस्तुओं की विरासत श्रृंखला में तरीकों को परिभाषित करने की अनुमति देता है। मिश्रण के माध्यम से, आप ऑब्जेक्ट इंस्टेंसेस (शामिल) या स्वयं के सिंगलटन_क्लास की विरासत श्रृंखला में विधियाँ जोड़ सकते हैं (विस्तार करें)।