ℙ𝕚𝕜𝕠𝔹𝕝𝕠𝕘 | プログラミングについて知ろう!

【HTML/CSS/JavaScript/jQuery/Ruby/Swift/MySQL/AWS】 プログラミングを 「今始めたばかりの方」や 「これから始めるか悩んでいる方」、 好きか嫌いかも分からない、 できるかどうかも分からない、 向いてるか向いてないかも分からない、 そんな思いを抱えた方へ届くような ブログを執筆していきます。

スポンサーリンク

Rubyで「 チケット発券システム 」を作る 〜前編〜

スポンサーリンク

f:id:kakikazu:20200205151819j:plain

 

こんにちは!

 

今回は現在勉強中のRuby基礎から参考サイトを元に

映画のチケット発券システムを作りました。 

 

参考サイトはこちら

 

これから順を追って書き進めていきたいと思います。

 

f:id:kakikazu:20200121194720p:plain

 

こんな感じのものです。

 

 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」を作成する。

中身は以下のようにします。

customer.rb
class Customer
end
ticket_vending_machine.rb
class TicketVendingMachine
end
movie.rb
class Movie
end
ticket.rb
class Ticket
end

4.各クラスのインスタンスが持つ特徴を考えコードに反映

チケット発券システムの中身で

それぞれのクラスがどのようなデータを持つか考えて

実際にコードを書いていきます。

 

※各クラス分あるので、少し長くなります。

 ①movieが持つべきデータ

 

データ コード上での名称
タイトル title
金額 fee
上映開始日 start_date
上映終了日 end_date

 上記の内容をmovie.rbに反映させる。

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
end

 ②ticket_vending_machineが持つべきデータ

 

データ コード上での名称
発券できる映画一覧 movies

上記内容をticket_vending_machineへ反映。

ticket_vending_machine.rb
class TicketVendingMachine
  def initialize
    @movies = []
  end
end

 ③ticketが持つべきデータ

 

データ コード上での名称
タイトル title
金額 fee
期限 limit

 

上記の中で「タイトル」と「金額」の情報は、Movieクラスのインスタンスのインスタン変数@title@feeです。これらの情報をTicketクラスの内部から取得したいのですが、Ticketクラスのinitializeメソッドの中では、Movieクラスのインスタンスインスタンス変数を直接参照することはできません。

そこで下にあるゲッターというメソッドを使います。

ゲッター

ゲッターとは、あるクラスのインスタンスインスタンス変数の値を返すだけのメソッドのことです。これを定義することで、インスタンスから自身の持つインスタンス変数の値を取得することができます。

 

 上記を踏まえmovie.rbにゲッターを反映させる。

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内にゲッター追記

ticket_vending_machine.rb
class TicketVendingMachine
  def initialize
    @movies = []
  end

  def movies
    @movies
  end
end

そしてticket.rbを編集。

 ticket.rbを以下のように書き換え

ticket.rb
class Ticket
  def initialize(movie)
    @title = movie.title
    @fee = movie.fee
  end
end

このように記述する事で、ゲッターを定義したmovieクラスのインスタンス変数titlefeeの値を、そのままticketクラスのインスタンス変数に格納する事ができます。

 ④customerが持つべきデータ

 

データ コード上での名称
名前 name
所持金 money
チケット ticket

Customerクラスのインスタンスは、チケットを購入した結果最終的にTicketクラスのインスタンスを自らのインスタンス変数ticketに格納します。

 customer.rbを書き換え。

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」というファイルを作成し、内容を記述していきます。

 

exec.rb
require './customer'
require './movie'
require './ticket'
require './ticket_vending_machine'

require './作成したファイル名'とそれぞれ記述する事で、exec.rbを実行した時に全てのファイルが読み込まれるようになります。

 6. exec.rbを実行した時に必要な情報がセットされるようにする。

exec.rb内で、これまで作ってきたクラスからインスタンスを作ります。

 exec.rbに以下追記。

ruby_ticket_system/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を修正。

ticket_vending_machine.rb
class TicketVendingMachine
  def initialize
    @movies = []
  end

  def movies=(movies)
    @movies = movies
  end
end

moviesという文字が出て来過ぎて混乱。と参考サイトに書いてましたが

ほんとに混乱しました。

 

これは下にあるexec.rbのこの部分のコードと関係しています。

exec.rb
ticket_vending_machine.movies = [titanic, tom_and_jerry, oceans_eleven]

このようにすることでticket_vending_machineのインスタンス変数@moviesの値が[titanic, tom_and_jerry, oceans_eleven]に更新されます。

 

参考サイトを読んでもなかなかしっくりくる理解が得られず、継続課題になりそうです。

 

説明がきちんとできず。。

 セッター

インスタンス変数の値を更新するためのインスタンスメソッドのことを、特別にセッターと呼びます。

 

これが答えかな。

 

これで実行するファイルの準備が完了しました。

 

ここからの理解を深めるために次は実行していき

 

ファイルがどのような動きをするか見ていきます。

 

 

ひとまず今回は、

実行するまでの準備を書いてみました。

 

 

最後まで読んでくださりありがとうございます。

また次回もよろしくお願いします。

 

 

 

スポンサーリンク