Crystal में मॉड्यूल के दो उद्देश्य हैं:
पहला उद्देश्य है नामों के टकराव से बचने के लिए एक नेमस्पेस बनाना। लेकिन यह कोड को समूहों में भी बाँटता है, जिससे यह समझना आसान हो जाता है कि कोड किस काम का है।
दूसरा उद्देश्य है टाइप के साथ कोड साझा करने के लिए मिक्सिन परिभाषित करना।
मॉड्यूल क्लास जैसे होते हैं, लेकिन मुख्य अंतर यह है कि इनका इंस्टेंस नहीं बनाया जा सकता, और इसलिए इनमें इंस्टेंस वेरिएबल नहीं होते।
मॉड्यूल घोषित करने के लिए module कीवर्ड लिखा जाता है, जिसके बाद मॉड्यूल का नाम आता है।
module Foo
end
नेमस्पेस कोड को समूहों में बाँटने का एक तरीका है।
इससे नामों का टकराव टलता है और यह समझना आसान हो जाता है कि कोड किस काम का है।
जब किसी नेमस्पेस के अंदर रखे गए कॉन्स्टेंट या क्लास को एक्सेस करना हो, तो :: ऑपरेटर का उपयोग किया जाता है।
module Foo
class Bar
end
end
Foo::Bar.new
यह तब काम आता है जब, उदाहरण के लिए, कई क्लासों को एक ही "बेस" फंक्शनलिटी चाहिए हो, या जब असंबंधित क्लासों के बीच कोड साझा करना हो। या जब ऐसी क्लासों के बीच कोड साझा करना हो जिनका आपस में कोई संबंध नहीं है।
किसी मॉड्यूल को मिक्सिन के रूप में इस्तेमाल करने के दो तरीके हैं: पहला है include कीवर्ड का उपयोग करना, और दूसरा है extend कीवर्ड का उपयोग करना।
दोनों तरीके उस टाइप के लिए कॉन्स्टेंट उपलब्ध करा देते हैं जो मॉड्यूल को include या extend करता है।
Include करने पर मॉड्यूल के सारे मेथड उस टाइप पर इंस्टेंस मेथड के रूप में उपलब्ध हो जाते हैं।
include कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।
module Foo
def foo
"foo"
end
end
class Bar
include Foo
end
Bar.new.foo # => "foo"
extend भी include की तरह ही काम करता है, लेकिन मेथड को इंस्टेंस मेथड के रूप में उपलब्ध कराने के बजाय यह उन्हें क्लास मेथड के रूप में उपलब्ध कराता है।
extend कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।
module Foo
def foo
"foo"
end
end
class Bar
extend Foo
end
Bar.foo # => "foo"
Crystal में एक आम पैटर्न यह है कि मॉड्यूल के अंदर extend self पैटर्न का उपयोग किया जाए।
इससे मॉड्यूल के सारे मेथड मॉड्यूल पर ही क्लास मेथड के रूप में उपलब्ध हो जाते हैं।
इसका मतलब है कि आपको def self.method_name सिंटैक्स का उपयोग करके हर मेथड को मॉड्यूल में असाइन नहीं करना पड़ता।
module Foo
extend self
def foo
"foo"
end
end
Foo.foo # => "foo"
Bellebrook Basketball League कई टीमों की एक लीग है, और हर टीम के पास खिलाड़ियों की एक सूची होती है। नया सीज़न शुरू होने वाला है, और मैचों के टिकट बेचने के लिए उन्हें एक नया टिकट सिस्टम बनाना है। पिछले सीज़न में वे स्टेडियम के प्रवेश द्वार पर टिकट बेचते थे, लेकिन लोकप्रियता बहुत बढ़ गई है, इसलिए बढ़ती माँग को संभालने के लिए उन्होंने इस सीज़न टिकट ऑनलाइन बेचने का फैसला किया है।
लीग ने आपसे संपर्क किया है और टिकट बिक्री संभालने के लिए एक सिस्टम बनाने को कहा है।
सबसे पहले आपको टिकट बिक्री संभालने के लिए एक टिकट सिस्टम बनाना है। टिकट सिस्टम को यह बताना होगा कि किसी मैच के लिए कितने टिकट उपलब्ध हैं।
हर मैच के लिए TicketSystem नाम की क्लास का एक इंस्टेंस बनाया जाना चाहिए।
इनिशियलाइज़ की गई स्थिति में ये जानकारियाँ होनी चाहिए:
उन आर्गुमेंट्स से इनिशियलाइज़ की गई स्थिति बनाइए जो बताते हैं कि कितने टिकट उपलब्ध हैं और मैच किस स्टेडियम में खेला जाता है।
इनिशियलाइज़ की गई स्थिति में @tickets_available और @stadium इंस्टेंस वेरिएबल होने चाहिए।
इनमें क्रमशः पहला और दूसरा आर्गुमेंट रखा जाना चाहिए।
TicketSystem.new(100, "Bellebrook")
# => #<TicketSystem:0x10f0b8 @tickets_available=100, @stadium="Bellebrook">
सबसे पहले आपको एक मेथड बनाना है जो किसी दिए गए मैच के लिए उपलब्ध टिकटों की संख्या लौटाता है।
पहले से बनाई गई क्लास के ऊपर TicketingReservation नाम का मॉड्यूल बनाइए।
इस मॉड्यूल को TicketSystem क्लास में शामिल किया जाना चाहिए।
मॉड्यूल के अंदर tickets_available नाम का मेथड बनाइए।
यह मेथड उपलब्ध टिकटों की संख्या लौटाना चाहिए।
ticket_system = TicketSystem.new(100)
ticket_system.tickets_available
#=> 100
आपको एक ऐसा मेथड बनाना है जो जाँचता है कि किसी दिए गए मैच के लिए टिकट उपलब्ध हैं या नहीं। हर मैच के लिए 100 टिकट बचाकर रखने होते हैं। इससे यह सुनिश्चित होता है कि स्टेडियम के प्रवेश द्वार पर टिकट खरीदने वाले लोगों के लिए हमेशा टिकट उपलब्ध रहें।
मॉड्यूल TicketingReservation, के अंदर order_ticket? नाम का मेथड बनाइए।
अगर कम से कम 100 टिकट उपलब्ध हैं तो यह मेथड true लौटाना चाहिए, वरना false।
अगर कम से कम 100 टिकट उपलब्ध हैं, तो मेथड को उपलब्ध टिकटों की संख्या 1 कम भी करनी चाहिए।
ticket_system = TicketSystem.new(100)
ticket_system.order_ticket?
#=> true
टिकट सिस्टम के संदेश ऐसे होने चाहिए जिन्हें उपयोगकर्ता आसानी से समझ सकें। संदेशों में अपनापन लगना चाहिए, इसलिए उनमें उपयोगकर्ता का नाम भी होना चाहिए।
अगर टिकट की खरीद सफल रही, तो उपयोगकर्ता को एक संदेश मिलना चाहिए जिसमें बताया जाए कि खरीद सफल रही, उसका टिकट नंबर क्या है, और मैच किस स्टेडियम में खेला जाता है। टिकट नंबर ऑर्डर से पहले उपलब्ध टिकटों की संख्या होनी चाहिए।
अगर खरीद सफल रही, तो संदेश ऐसा दिखना चाहिए: {name}, your purchase was successful, your ticket number is #{ticket_number}, and the game is played at the {stadium_name} stadium..
अगर खरीद सफल नहीं रही, तो संदेश ऐसा दिखना चाहिए: {name}, your purchase was unsuccessful, there are not enough tickets available..
मॉड्यूल TicketingReservation, के अंदर order_message नाम का मेथड बनाइए, जो एक आर्गुमेंट name लेता है और उसमें खरीदने वाले का नाम होता है।
मेथड को संदेश वाली एक स्ट्रिंग लौटानी चाहिए।
ticket_system = TicketSystem.new(100, "Bellebrook")
ticket_system.order_message("John")
#=> "John, your purchase was successful, your ticket number is #100, and the game is played at the Bellebrook stadium."
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।