This commit is contained in:
Rikuoh Tsujitani 2024-03-25 22:14:46 +09:00
parent 8961093ec7
commit fda9196898
Signed by: riq0h
GPG key ID: 010F09DEA298C717
3 changed files with 53 additions and 16 deletions

View file

@ -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ページから

18
main.rb
View file

@ -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

View file

@ -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