Track
/
Crystal
Crystal
/
Esercizi
/
La lega di basket di Bellebrook
La lega di basket di Bellebrook

La lega di basket di Bellebrook

Esercizio di apprendimento

Introduzione

I moduli in Crystal hanno due scopi:

Il primo è creare un namespace per evitare collisioni di nomi. Tuttavia, raggruppano anche il codice, rendendo più facile capire a cosa serve.

Il secondo è definire dei mixin per condividere codice tra i tipi.

I moduli sono simili alle classi, ma la differenza principale è che non possono essere istanziati e quindi non hanno variabili di istanza.

Per dichiarare un modulo, si usa la parola chiave module seguita dal nome del modulo.

module Foo
end

Namespace

Un namespace è un modo per raggruppare il codice. Questo evita conflitti di nomi e rende più facile capire a cosa serve il codice. Per accedere a una costante o a una classe inserita in un namespace, si usa l'operatore ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Usarlo come mixin

Questo può essere utile quando, per esempio, più classi hanno bisogno della stessa funzionalità di «base» o quando il codice deve essere condiviso tra classi non correlate. O quando si vuole condividere codice tra classi che non hanno alcuna relazione tra loro.

Ci sono due modi diversi per usare un modulo come mixin: il primo è usare la parola chiave include, il secondo è usare la parola chiave extend.

Entrambi i metodi rendono le costanti disponibili al tipo che include o estende il modulo.

Include

Include rende tutti i metodi del modulo disponibili come metodi di istanza sul tipo che include il modulo. La parola chiave include va inserita all'inizio del tipo, seguita dal nome del modulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

Extend funziona in modo simile a include, ma invece di rendere i metodi disponibili come metodi di istanza, li rende disponibili come metodi di classe. La parola chiave extend va scritta all'inizio del tipo, seguita dal nome del modulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Un pattern tipico in Crystal è usare il pattern extend self in un modulo. Questo rende tutti i metodi del modulo disponibili come metodi di classe sul modulo stesso. Vuol dire che non devi assegnare ogni metodo al modulo usando la sintassi def self.method_name.

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"

Istruzioni

Bellebrook Basketball League è una lega composta da diverse squadre, ognuna con una rosa di giocatori. Sta per iniziare una nuova stagione e la lega deve creare un nuovo sistema di biglietteria per vendere i biglietti delle partite. La scorsa stagione vendeva i biglietti all'ingresso dello stadio, ma la popolarità è esplosa e ha deciso di venderli online quest'anno, per gestire la domanda crescente.

La lega ti ha contattato e ti ha chiesto di creare un sistema per gestire la vendita dei biglietti.

1. Creare un sistema di biglietteria

Per prima cosa, devi creare un sistema di biglietteria per gestire la vendita dei biglietti. Il sistema di biglietteria deve indicare quanti biglietti sono disponibili per una partita.

Per ogni partita va creata un'istanza di una classe chiamata TicketSystem. Lo stato inizializzato deve contenere le seguenti informazioni:

  1. Quanti biglietti sono disponibili per la partita.
  2. In quale stadio si gioca la partita.

Costruisci uno stato inizializzato a partire da argomenti che indicano il numero di biglietti disponibili e lo stadio in cui si gioca la partita. Lo stato inizializzato deve essere composto dalle variabili di istanza @tickets_available e @stadium. Queste devono contenere rispettivamente il primo e il secondo argomento fornito.

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

2. Ottenere la quantità di biglietti disponibili

Per prima cosa, devi creare un metodo che restituisca la quantità di biglietti disponibili per una determinata partita.

Definisci un modulo chiamato TicketingReservation sopra la classe già definita. Questo modulo deve essere incluso nella classe TicketSystem.

All'interno del modulo, definisci un metodo chiamato tickets_available. Questo metodo deve restituire la quantità di biglietti disponibili.

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

3. Ordinare i biglietti

Devi creare un metodo che controlli se i biglietti sono disponibili per una determinata partita. La partita deve mantenere 100 biglietti in riserva. Così si garantisce che ci siano sempre biglietti disponibili per chi li acquista all'ingresso dello stadio.

All'interno del modulo TicketingReservation, definisci un metodo chiamato order_ticket?. Il metodo deve restituire true se sono disponibili almeno 100 biglietti e false altrimenti. Se sono disponibili almeno 100 biglietti, il metodo deve anche diminuire di 1 il numero di biglietti disponibili.

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

4. Il messaggio dell'ordine

Il sistema di biglietteria deve avere messaggi facili da capire per gli utenti. Inoltre i messaggi devono sembrare personali, quindi devono includere il nome dell'utente.

Se l'acquisto del biglietto è andato a buon fine, l'utente deve ricevere un messaggio che gli dice che l'acquisto è riuscito, qual è il suo numero di biglietto e in quale stadio si gioca la partita. Il numero del biglietto deve essere il numero di biglietti disponibili prima dell'ordine.

Se l'acquisto è andato a buon fine, il messaggio deve essere simile a questo: {name}, your purchase was successful, your ticket number is #{ticket_number}, and the game is played at the {stadium_name} stadium.. Se l'acquisto non è andato a buon fine, il messaggio deve essere simile a questo: {name}, your purchase was unsuccessful, there are not enough tickets available..

All'interno del modulo TicketingReservation, definisci un metodo chiamato order_message che prende un argomento name contenente il nome di chi acquista. Il metodo deve restituire una stringa con il messaggio.

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."
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Crystal Exercism

Vuoi iniziare La lega di basket di Bellebrook?

Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.