diff --git a/cherry.txt b/cherry.txt index cfa1660..571e342 100644 --- a/cherry.txt +++ b/cherry.txt @@ -201,8 +201,29 @@ User.new : オブジェクトを作成する。この際にinitializeメソッ メソッドの表記:インスタンスメソッドを表す場合にクラス名#メソッド名と書くことがある。クラスメソッドの場合はクラス名.メソッド名、またはクラス名::メソッド名と書く 255ページから - - +## 3/25 +例題を通じて: かなりメソッドが使われている印象を受けた +Minitestではsetupメソッドを定義するとテストメソッドの実行前に毎回setupメソッドが呼び出される +メモ化:インスタンス変数とnilガードを使ってデータを保持できる +def twitter_data + @twitter_data ||= begin + 処理 + end +end +こうするとtwitter_dataメソッドを呼び出した時だけAPIからデータを取得する処理が実行される。2回目以降の呼び出しでは@twitter_dataに保存された値が返却されるだけなのでプログラムのパフォーマンスが向上する +遅延処理化:メモ化と同様にインスタンス変数とnilガードを使う。 +class Foo +def bar + @bar ||= なんかむっちゃ重い処理 + end +end +barメソッドを呼び出さない限り重い初期化処理が走らないため、プログラムのパフォーマンスを最適化しやすくなる。 +selfキーワード:インスタンス自身を表すキーワード。Javaにおけるthisキーワードとほぼ同じ。自動的に省略されているが明示的に呼び出すこともできる +セッターメソッドを呼び出す際にはselfを付ける:さもなければローカル変数の呼び出しと解釈される +継承:is-aの関係で理解する。「DVD is a product」は違和感がないのでProductをスーパークラスとしてDVDをサブクラスに置いても適切な継承関係である +標準ライブラリの継承関係:BasicObjectクラスが頂点で次がObjectクラス、次いでString、Numeric、Array、Hashが君臨している。 +なにひとつ定義していないクラスでもObjectクラスを自動的に継承しているため関連するメソッドを呼び出せる +270ページから diff --git a/main.rb b/main.rb index 1538a5a..22a9be8 100644 --- a/main.rb +++ b/main.rb @@ -1,18 +1,30 @@ class Gate + STATIONS = [:umeda, :juso, :mikuni] + FARES = [160, 190] def initialize(name) @name = name end - def enter(ticket) + ticket.stamp(@name) end - def exit(ticket) - true + 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 class Ticket + attr_reader :fare, :stamped_at def initialize(fare) @fare = fare end + def stamp(name) + @stamped_at = name + end end diff --git a/main_test.rb b/main_test.rb index 879c050..ef308a1 100644 --- a/main_test.rb +++ b/main_test.rb @@ -2,21 +2,25 @@ require 'minitest/autorun' require_relative 'main' class GateTest < Minitest::Test - def test_gate - umeda = Gate.new(:umeda) - juso = Gate.new(:juso) - + def setup + @umeda = Gate.new(:umeda) + @juso = Gate.new(:juso) + @mikuni = Gate.new(:mikuni) + end + def test_umeda_to_juso ticket = Ticket.new(160) - umeda.enter(ticket) - assert juso.exit(ticket) + @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(190) + @umeda.enter(ticket) + assert @mikuni.exit(ticket) + end + def test_juso_to_mikuni ticket = Ticket.new(160) - umeda.enter(ticket) - refute mikuni.exit(ticket) + @juso.enter(ticket) + assert @mikuni.exit(ticket) end end