Rubyで「 チケット発券システム 」を作る 〜前編〜
スポンサーリンク
こんにちは!
今回は現在勉強中のRuby基礎から参考サイトを元に
映画のチケット発券システムを作りました。
これから順を追って書き進めていきたいと思います。
こんな感じのものです。
1.要件定義
まずはどんなプログラムを作るのか整理。
流れは2つ。
(1)実行すると、選択できる映画の一覧が表示され入力待ちになる
(2)どれか選択するとどのチケットを買っていくら所持金が残ったのか表示される
2.プログラム内の登場人物を考える。
発券機は誰かが利用するので、まずは「お客さん」と「発券機」。
次に上映中の「映画」と、発券する「チケット」。
今回必要な登場人物はこの4人です。
3.それぞれの要素にクラスを用意。
相当するクラスとして
「お客さん」→「Customer」
「発券機」→ 「TicketVendingMachine」
「映画」→ 「Movie」
「チケット」→「Ticket」
をそれぞれ用意します。
次に任意の場所にフォルダを作成。
$mkdir ruby_ticket_system
今回は「ruby_ticket_system」という名前にしてます。
次にコードエディタで先ほど作成したディレクトリ
「ruby_ticket_system」を開く。
開いたら、この中に
「customer.rb」「ticket_vending_machine.rb」「movie.rb」「ticket.rb」を作成する。
中身は以下のようにします。
class Customer
end
class TicketVendingMachine
end
class Movie
end
class Ticket
end
4.各クラスのインスタンスが持つ特徴を考えコードに反映
チケット発券システムの中身で
それぞれのクラスがどのようなデータを持つか考えて
実際にコードを書いていきます。
※各クラス分あるので、少し長くなります。
①movieが持つべきデータ
データ | コード上での名称 |
---|---|
タイトル | title |
金額 | fee |
上映開始日 | start_date |
上映終了日 | end_date |
class Movie
def initialize(title, fee, start_date, end_date)
@title = title
@fee = fee
@start_date = start_date
@end_date = end_date
end
end
②ticket_vending_machineが持つべきデータ
データ | コード上での名称 |
---|---|
発券できる映画一覧 | movies |
上記内容をticket_vending_machineへ反映。
class TicketVendingMachine
def initialize
@movies = []
end
end
データ | コード上での名称 |
---|---|
タイトル | title |
金額 | fee |
期限 | limit |
上記の中で「タイトル」と「金額」の情報は、Movieクラスのインスタンスのインスタン変数@title
や@fee
です。これらの情報をTicketクラスの内部から取得したいのですが、Ticketクラスのinitialize
メソッドの中では、Movieクラスのインスタンスのインスタンス変数を直接参照することはできません。
そこで下にあるゲッターというメソッドを使います。
ゲッター
ゲッターとは、あるクラスのインスタンスのインスタンス変数の値を返すだけのメソッドのことです。これを定義することで、インスタンスから自身の持つインスタンス変数の値を取得することができます。
上記を踏まえmovie.rbにゲッターを反映させる。
class Movie
def initialize(title, fee, start_date, end_date)
@title = title
@fee = fee
@start_date = start_date
@end_date = end_date
end
def title
return @title
end
def fee
return @fee
end
end
ticket_vending_machineも後にゲッターが必要になるので先に記述。
ticket_vending_machine.rb内にゲッター追記
class TicketVendingMachine
def initialize
@movies = []
end
def movies
@movies
end
end
そしてticket.rbを編集。
ticket.rbを以下のように書き換え
class Ticket
def initialize(movie)
@title = movie.title
@fee = movie.fee
end
end
このように記述する事で、ゲッターを定義したmovieクラスのインスタンス変数title
とfee
の値を、そのままticketクラスのインスタンス変数に格納する事ができます。
④customerが持つべきデータ
データ | コード上での名称 |
---|---|
名前 | name |
所持金 | money |
チケット | ticket |
Customerクラスのインスタンスは、チケットを購入した結果最終的にTicketクラスのインスタンスを自らのインスタンス変数ticketに格納します。
customer.rbを書き換え。
class Customer
def initialize(name, money, ticket=nil)
@name, @money, @ticket = name, money, ticket
end
end
1行で複数の変数に値をセットし、変数代入をする時は、名前ではなく記述した順番に沿って格納されていくので注意が必要です。
ticket=nil
という書き方はデフォルト引数といい、該当する引数が無い場合に代わりに=の右側の値が代入されるという記述になります。
5.プログラム起動用ファイル「exec.rb」を用意。
今まで作ってきたプログラムをこの中にまとめ、実行(execute)し動かします。新しく「exec.rb」というファイルを作成し、内容を記述していきます。
require './customer'
require './movie'
require './ticket'
require './ticket_vending_machine'
require './作成したファイル名'とそれぞれ記述する事で、exec.rbを実行した時に全てのファイルが読み込まれるようになります。
6. exec.rbを実行した時に必要な情報がセットされるようにする。
exec.rb内で、これまで作ってきたクラスからインスタンスを作ります。
exec.rbに以下追記。
require './customer'
require './movie'
require './ticket'
require './ticket_vending_machine'
#以下追記
require 'date'
customer = Customer.new("kazuki", 5000)
ticket_vending_machine = TicketVendingMachine.new
titanic = Movie.new(
"Titanic",
2000,
Date.new(2017, 2, 20),
Date.new(2017, 4, 20)
)
tom_and_jerry = Movie.new(
"tom_and_jerry",
1500,
Date.new(2017, 3, 18),
Date.new(2017, 5, 10)
)
oceans_eleven = Movie.new(
"Ocean's Eleven",
1800,
Date.new(2017, 4, 18),
Date.new(2017, 6, 10)
)
ticket_vending_machine.movies = [titanic, tom_and_jerry, oceans_eleven]
newメソッドに渡している引数について
これらはinitialize(初期値)メソッドの引数として渡す、そのクラスのインスタンスが必ず持っていなければならない値の事です。
Dateクラスについて
以下参照
https://docs.ruby-lang.org/ja/latest/method/Date/s/new.html
ticket_vending_machine.rbを修正。
class TicketVendingMachine
def initialize
@movies = []
end
def movies=(movies)
@movies = movies
end
end
moviesという文字が出て来過ぎて混乱。と参考サイトに書いてましたが
ほんとに混乱しました。
これは下にあるexec.rbのこの部分のコードと関係しています。
ticket_vending_machine.movies = [titanic, tom_and_jerry, oceans_eleven]
このようにすることでticket_vending_machineのインスタンス変数@movies
の値が[titanic, tom_and_jerry, oceans_eleven]
に更新されます。
参考サイトを読んでもなかなかしっくりくる理解が得られず、継続課題になりそうです。
説明がきちんとできず。。
セッター
インスタンス変数の値を更新するためのインスタンスメソッドのことを、特別にセッターと呼びます。
これが答えかな。
これで実行するファイルの準備が完了しました。
ここからの理解を深めるために次は実行していき
ファイルがどのような動きをするか見ていきます。
ひとまず今回は、
実行するまでの準備を書いてみました。
最後まで読んでくださりありがとうございます。
また次回もよろしくお願いします。