ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
Bellebrook बास्केट लीग
Bellebrook बास्केट लीग

Bellebrook बास्केट लीग

सीखने का अभ्यास

परिचय

Crystal में मॉड्यूल के दो उद्देश्य हैं:

पहला उद्देश्य है नामों के टकराव से बचने के लिए एक नेमस्पेस बनाना। लेकिन यह कोड को समूहों में भी बाँटता है, जिससे यह समझना आसान हो जाता है कि कोड किस काम का है।

दूसरा उद्देश्य है टाइप के साथ कोड साझा करने के लिए मिक्सिन परिभाषित करना।

मॉड्यूल क्लास जैसे होते हैं, लेकिन मुख्य अंतर यह है कि इनका इंस्टेंस नहीं बनाया जा सकता, और इसलिए इनमें इंस्टेंस वेरिएबल नहीं होते।

मॉड्यूल घोषित करने के लिए module कीवर्ड लिखा जाता है, जिसके बाद मॉड्यूल का नाम आता है।

module Foo
end

नेमस्पेस

नेमस्पेस कोड को समूहों में बाँटने का एक तरीका है। इससे नामों का टकराव टलता है और यह समझना आसान हो जाता है कि कोड किस काम का है। जब किसी नेमस्पेस के अंदर रखे गए कॉन्स्टेंट या क्लास को एक्सेस करना हो, तो :: ऑपरेटर का उपयोग किया जाता है।

module Foo
  class Bar
  end
end

Foo::Bar.new

इसे मिक्सिन के रूप में इस्तेमाल कीजिए

यह तब काम आता है जब, उदाहरण के लिए, कई क्लासों को एक ही "बेस" फंक्शनलिटी चाहिए हो, या जब असंबंधित क्लासों के बीच कोड साझा करना हो। या जब ऐसी क्लासों के बीच कोड साझा करना हो जिनका आपस में कोई संबंध नहीं है।

किसी मॉड्यूल को मिक्सिन के रूप में इस्तेमाल करने के दो तरीके हैं: पहला है include कीवर्ड का उपयोग करना, और दूसरा है extend कीवर्ड का उपयोग करना।

दोनों तरीके उस टाइप के लिए कॉन्स्टेंट उपलब्ध करा देते हैं जो मॉड्यूल को include या extend करता है।

Include

Include करने पर मॉड्यूल के सारे मेथड उस टाइप पर इंस्टेंस मेथड के रूप में उपलब्ध हो जाते हैं। include कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

extend भी include की तरह ही काम करता है, लेकिन मेथड को इंस्टेंस मेथड के रूप में उपलब्ध कराने के बजाय यह उन्हें क्लास मेथड के रूप में उपलब्ध कराता है। extend कीवर्ड टाइप के सबसे ऊपर लिखा जाना चाहिए, और उसके बाद मॉड्यूल का नाम।

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Crystal में एक आम पैटर्न यह है कि मॉड्यूल के अंदर extend self पैटर्न का उपयोग किया जाए। इससे मॉड्यूल के सारे मेथड मॉड्यूल पर ही क्लास मेथड के रूप में उपलब्ध हो जाते हैं। इसका मतलब है कि आपको def self.method_name सिंटैक्स का उपयोग करके हर मेथड को मॉड्यूल में असाइन नहीं करना पड़ता।

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"

निर्देश

Bellebrook Basketball League कई टीमों की एक लीग है, और हर टीम के पास खिलाड़ियों की एक सूची होती है। नया सीज़न शुरू होने वाला है, और मैचों के टिकट बेचने के लिए उन्हें एक नया टिकट सिस्टम बनाना है। पिछले सीज़न में वे स्टेडियम के प्रवेश द्वार पर टिकट बेचते थे, लेकिन लोकप्रियता बहुत बढ़ गई है, इसलिए बढ़ती माँग को संभालने के लिए उन्होंने इस सीज़न टिकट ऑनलाइन बेचने का फैसला किया है।

लीग ने आपसे संपर्क किया है और टिकट बिक्री संभालने के लिए एक सिस्टम बनाने को कहा है।

1. टिकट सिस्टम बनाइए

सबसे पहले आपको टिकट बिक्री संभालने के लिए एक टिकट सिस्टम बनाना है। टिकट सिस्टम को यह बताना होगा कि किसी मैच के लिए कितने टिकट उपलब्ध हैं।

हर मैच के लिए TicketSystem नाम की क्लास का एक इंस्टेंस बनाया जाना चाहिए। इनिशियलाइज़ की गई स्थिति में ये जानकारियाँ होनी चाहिए:

  1. मैच के लिए कितने टिकट उपलब्ध हैं।
  2. मैच किस स्टेडियम में खेला जाता है।

उन आर्गुमेंट्स से इनिशियलाइज़ की गई स्थिति बनाइए जो बताते हैं कि कितने टिकट उपलब्ध हैं और मैच किस स्टेडियम में खेला जाता है। इनिशियलाइज़ की गई स्थिति में @tickets_available और @stadium इंस्टेंस वेरिएबल होने चाहिए। इनमें क्रमशः पहला और दूसरा आर्गुमेंट रखा जाना चाहिए।

TicketSystem.new(100, "Bellebrook")
# => #<TicketSystem:0x10f0b8 @tickets_available=100, @stadium="Bellebrook">

2. उपलब्ध टिकटों की संख्या जानिए

सबसे पहले आपको एक मेथड बनाना है जो किसी दिए गए मैच के लिए उपलब्ध टिकटों की संख्या लौटाता है।

पहले से बनाई गई क्लास के ऊपर TicketingReservation नाम का मॉड्यूल बनाइए। इस मॉड्यूल को TicketSystem क्लास में शामिल किया जाना चाहिए।

मॉड्यूल के अंदर tickets_available नाम का मेथड बनाइए। यह मेथड उपलब्ध टिकटों की संख्या लौटाना चाहिए।

ticket_system = TicketSystem.new(100)
ticket_system.tickets_available
#=> 100

3. टिकट ऑर्डर कीजिए

आपको एक ऐसा मेथड बनाना है जो जाँचता है कि किसी दिए गए मैच के लिए टिकट उपलब्ध हैं या नहीं। हर मैच के लिए 100 टिकट बचाकर रखने होते हैं। इससे यह सुनिश्चित होता है कि स्टेडियम के प्रवेश द्वार पर टिकट खरीदने वाले लोगों के लिए हमेशा टिकट उपलब्ध रहें।

मॉड्यूल TicketingReservation, के अंदर order_ticket? नाम का मेथड बनाइए। अगर कम से कम 100 टिकट उपलब्ध हैं तो यह मेथड true लौटाना चाहिए, वरना false। अगर कम से कम 100 टिकट उपलब्ध हैं, तो मेथड को उपलब्ध टिकटों की संख्या 1 कम भी करनी चाहिए।

ticket_system = TicketSystem.new(100)
ticket_system.order_ticket?
#=> true

4. ऑर्डर का संदेश

टिकट सिस्टम के संदेश ऐसे होने चाहिए जिन्हें उपयोगकर्ता आसानी से समझ सकें। संदेशों में अपनापन लगना चाहिए, इसलिए उनमें उपयोगकर्ता का नाम भी होना चाहिए।

अगर टिकट की खरीद सफल रही, तो उपयोगकर्ता को एक संदेश मिलना चाहिए जिसमें बताया जाए कि खरीद सफल रही, उसका टिकट नंबर क्या है, और मैच किस स्टेडियम में खेला जाता है। टिकट नंबर ऑर्डर से पहले उपलब्ध टिकटों की संख्या होनी चाहिए।

अगर खरीद सफल रही, तो संदेश ऐसा दिखना चाहिए: {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."
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

Bellebrook बास्केट लीग शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।