3/25
This commit is contained in:
parent
8961093ec7
commit
fda9196898
3 changed files with 53 additions and 16 deletions
25
cherry.txt
25
cherry.txt
|
@ -201,8 +201,29 @@ User.new : オブジェクトを作成する。この際にinitializeメソッ
|
||||||
メソッドの表記:インスタンスメソッドを表す場合にクラス名#メソッド名と書くことがある。クラスメソッドの場合はクラス名.メソッド名、またはクラス名::メソッド名と書く
|
メソッドの表記:インスタンスメソッドを表す場合にクラス名#メソッド名と書くことがある。クラスメソッドの場合はクラス名.メソッド名、またはクラス名::メソッド名と書く
|
||||||
255ページから
|
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
18
main.rb
|
@ -1,18 +1,30 @@
|
||||||
class Gate
|
class Gate
|
||||||
|
STATIONS = [:umeda, :juso, :mikuni]
|
||||||
|
FARES = [160, 190]
|
||||||
def initialize(name)
|
def initialize(name)
|
||||||
@name = name
|
@name = name
|
||||||
end
|
end
|
||||||
|
|
||||||
def enter(ticket)
|
def enter(ticket)
|
||||||
|
ticket.stamp(@name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def exit(ticket)
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
class Ticket
|
class Ticket
|
||||||
|
attr_reader :fare, :stamped_at
|
||||||
def initialize(fare)
|
def initialize(fare)
|
||||||
@fare = fare
|
@fare = fare
|
||||||
end
|
end
|
||||||
|
def stamp(name)
|
||||||
|
@stamped_at = name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
26
main_test.rb
26
main_test.rb
|
@ -2,21 +2,25 @@ require 'minitest/autorun'
|
||||||
require_relative 'main'
|
require_relative 'main'
|
||||||
|
|
||||||
class GateTest < Minitest::Test
|
class GateTest < Minitest::Test
|
||||||
def test_gate
|
def setup
|
||||||
umeda = Gate.new(:umeda)
|
@umeda = Gate.new(:umeda)
|
||||||
juso = Gate.new(:juso)
|
@juso = Gate.new(:juso)
|
||||||
|
@mikuni = Gate.new(:mikuni)
|
||||||
|
end
|
||||||
|
def test_umeda_to_juso
|
||||||
ticket = Ticket.new(160)
|
ticket = Ticket.new(160)
|
||||||
umeda.enter(ticket)
|
@umeda.enter(ticket)
|
||||||
assert juso.exit(ticket)
|
assert @juso.exit(ticket)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_umeda_to_mikuni_when_fare_is_not_enough
|
def test_umeda_to_mikuni_when_fare_is_not_enough
|
||||||
umeda = Gate.new(:umeda)
|
ticket = Ticket.new(190)
|
||||||
mikuni = Gate.new(:mikuni)
|
@umeda.enter(ticket)
|
||||||
|
assert @mikuni.exit(ticket)
|
||||||
|
end
|
||||||
|
def test_juso_to_mikuni
|
||||||
ticket = Ticket.new(160)
|
ticket = Ticket.new(160)
|
||||||
umeda.enter(ticket)
|
@juso.enter(ticket)
|
||||||
refute mikuni.exit(ticket)
|
assert @mikuni.exit(ticket)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue