Треки
/
Crystal
Crystal
/
Вправи
/
Баскетбольна ліга Беллбрук
Баскетбольна ліга Беллбрук

Баскетбольна ліга Беллбрук

Навчальна вправа

Вступ

Модулі у Crystal мають два призначення:

Перше призначення - створювати простір імен, щоб уникати збігів назв. Однак він також групує код, завдяки чому легше зрозуміти, для чого цей код потрібен.

Друге призначення - визначати міксини, щоб ділитися кодом із типами.

Модулі схожі на класи, але головна відмінність у тому, що їх не можна інстанціювати, а отже, вони не мають змінних екземпляра.

Щоб оголосити модуль, ми використовуємо ключове слово module, а потім назву модуля.

module Foo
end

Простір імен

Простір імен - це спосіб групувати код. Це дає змогу уникати збігів назв і полегшує розуміння, для чого призначений код. Коли треба звернутися до константи або класу, розміщених усередині простору імен, ми використовуємо оператор ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Використання як міксина

Це може стати в пригоді, наприклад, коли кільком класам потрібна однакова «базова» функціональність або коли код треба поділити між неповʼязаними класами. Або коли ми хочемо поділитися кодом між класами, які не повʼязані між собою.

Є два різні способи використати модуль як міксин: перший - використати ключове слово 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?. Метод має повертати true, якщо доступно щонайменше 100 квитків, і 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 з імʼям покупця. Метод має повертати рядок тексту (англ. string) із цим повідомленням.

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

Час розпочати Баскетбольна ліга Беллбрук?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.