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

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

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

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

前回に引き続きクラスについて学びます。

テストケースのリファクタリング

各駅のインスタンスはテストケースに依存しないので、setup() メソッドで定義しておきます。

require 'minitest/autorun'
require './lib/gate'
require './lib/ticket'

class GateTest < Minitest::Test
  # テストメソッドが実行される前にこのメソッドが毎回呼ばれる
  def setup
    @umeda = Gate.new(:umeda)
    @juso = Gate.new(:juso)
    @mikuni = Gate.new(:mikuni)
  end

  def test_umeda_to_juso
    ticket = Ticket.new(150)
    @umeda.enter(ticket)
    assert @juso.exit(ticket)
  end

  # 190円の切符で梅田で入場し、三国で出場
  def test_umeda_to_mikuni_when_fare_is_not_enough
    ticket = Ticket.new(150)
    @umeda.enter(ticket)
    # false であるとき正常
    refute @mikuni.exit(ticket)
  end

  # 150円の切符で十三で入場し、三国で出場
  def test_umeda_to_mikuni_when_fare_is_enough
    ticket = Ticket.new(190)
    @umeda.enter(ticket)
    assert @mikuni.exit(ticket)
  end

  def test_juso_to_mikuni
    ticket = Ticket.new(150)
    @juso.enter(ticket)
    assert @mikuni.exit(ticket)
  end
end

クラスメソッド

クラスメソッドを定義して使用します。インスタンスメソッドとの違いは次の記事から。

【Ruby】クラスメソッドとインスタンスメソッドについてザクッと分かりやすく説明してみる - Qiita

class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end

  # 金額を整形するクラスメソッド
  def self.format_price(price)
    "#{price}"
  end

  def to_s
    # インスタンスメソッドからクラスメソッドを呼び出す
    formatted_price = Product.format_price(price)
    "name: #{name}, price: #{formatted_price}"
  end
end

product = Product.new('A great movie', 1000)
p product.to_s

感想

大体本の中間までの内容をやり終えました。引き続き頑張ります。