山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

プロを目指す人のためのRuby入門 その9

第7章 クラスの作成を理解する

前回に引き続き、第7章をやっていきます。

改札機プログラム

電車の運賃を計算するプログラムをクラスを使って作成します。

Gate クラス
class Gate
  # 駅名と運賃
  STATIONS = [:umeda, :juso, :mikuni]
  FARES = [150, 190]
  
  def initialize(name)
    @name = name
  end

  def enter(ticket)
    ticket.stamp(@name)
  end

  def exit(ticket)
    fare = calc_fare(ticket)
    fare <= ticket.fare
  end

  # 配列のインデックスの違いで運賃が決まる
  def calc_fare(ticket)
    from = STATIONS.index(ticket.stamped_at)
    to = STATIONS.index(@name)
    distance = to - from
    FARES[distance - 1]
  end
end

駅名や運賃を定義し、運賃を計算する。

Ticket クラス
class Ticket
  attr_reader :fare, :stamped_at
  def initialize(fare)
    @fare = fare
  end

  def stamp(name)
    @stamped_at = name
  end
end

どこでチケットが発券されたかを管理します。

テスト
require './lib/gate'
require './lib/ticket'

class GateTest < Minitest::Test
  def test_gate
    umeda = Gate.new(:umeda)
    juso = Gate.new(:juso)
    ticket = Ticket.new(150)
    umeda.enter(ticket)
    assert juso.exit(ticket)
  end

  def test_umeda_to_mikuni_when_fare_is_not_enough
    umeda = Gate.new(:umeda)
    mikuni = Gate.new(:mikuni)
    ticket = Ticket.new(150)
    umeda.enter(ticket)
    # false であるとき正常
    refute mikuni.exit(ticket)
  end
end

感想

駅名が大阪なのでなじみが薄いですが、オブジェクト指向のプログラミングをしていると思いました。今は切符じゃなくて、定期とか Suica とかの電子マネーしか使うことがないですね。

チケットじゃなくて…切符か!と一瞬名前が出てこないくらいには使ってないです。

まあ、本来のシステムはとても複雑なんだろうね。