3/27
This commit is contained in:
parent
19140234a0
commit
6c6404c4c0
3 changed files with 25 additions and 49 deletions
14
cherry.txt
14
cherry.txt
|
@ -260,8 +260,18 @@ respond+to?:そのオブジェクトに対して特定のメソッドが呼び
|
||||||
316ページから
|
316ページから
|
||||||
|
|
||||||
## 3/27
|
## 3/27
|
||||||
|
モジュールの用途:継承を使わずにクラスにインスタンスメソッドを追加する。もしくは上書きする。2つ目は複数のクラスに対して共通の特異メソッドを追加する。3つ目はクラス名や定数名の衝突を防ぐために名前空間を作る。4つ目は関数的メソッドを定義する。5つ目はシングルトンオブジェクトのように扱って設定値などを保持する
|
||||||
|
モジュールの作り方:module モジュール名 定義 end
|
||||||
|
モジュールの特徴:モジュールからインスタンスを作成することはできない。また、ほかのモジュールやクラスを継承することもできない
|
||||||
|
ミックスイン:モジュールをクラスにincludeして機能を追加すること
|
||||||
|
extend:モジュール内のメソッドをそのクラスの特異メソッドにすることができる
|
||||||
|
特殊な呼び出し方:クラス名.includeまたはクラス名.extendの形式でも呼び出せる
|
||||||
|
文字列を1文字ずつループ処理する場合はeach_charメソッドを使う:これ知らなんだ
|
||||||
|
例題を通して:リファクタリングの一部を先に実践できたところにほのかな成長を感じた
|
||||||
|
include_modules:includeされているモジュールの配列が返る
|
||||||
|
ancestors:モジュールのみならずスーパークラスの情報も返る
|
||||||
|
|
||||||
|
333ページから
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
34
main.rb
34
main.rb
|
@ -1,30 +1,8 @@
|
||||||
class Gate
|
module Rainbowable
|
||||||
STATIONS = [:umeda, :juso, :mikuni]
|
def rainbow
|
||||||
FARES = [160, 190]
|
to_s.each_char.map.with_index do |char, count|
|
||||||
def initialize(name)
|
color = 31 + count % 6
|
||||||
@name = name
|
"\e[#{color}m#{char}"
|
||||||
end
|
end.join + "\e[0m"
|
||||||
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
|
|
||||||
|
|
||||||
class Ticket
|
|
||||||
attr_reader :fare, :stamped_at
|
|
||||||
def initialize(fare)
|
|
||||||
@fare = fare
|
|
||||||
end
|
|
||||||
def stamp(name)
|
|
||||||
@stamped_at = name
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
26
main_test.rb
26
main_test.rb
|
@ -1,26 +1,14 @@
|
||||||
require 'minitest/autorun'
|
require 'minitest/autorun'
|
||||||
require_relative 'main'
|
require_relative 'main'
|
||||||
|
|
||||||
class GateTest < Minitest::Test
|
class RainbowableTest < Minitest::Test
|
||||||
def setup
|
def setup
|
||||||
@umeda = Gate.new(:umeda)
|
Object.include Rainbowable
|
||||||
@juso = Gate.new(:juso)
|
|
||||||
@mikuni = Gate.new(:mikuni)
|
|
||||||
end
|
end
|
||||||
def test_umeda_to_juso
|
def test_rainbow
|
||||||
ticket = Ticket.new(160)
|
expected = "\e[31mH\e[32me\e[33ml\e[34ml\e[35mo\e[36m,\e[31m \e[32mw\e[33mo\e[34mr\e[35ml\e[36md\e[31m!\e[0m"
|
||||||
@umeda.enter(ticket)
|
assert_equal expected, 'Hello, world!'.rainbow
|
||||||
assert @juso.exit(ticket)
|
expected = "\e[31m[\e[32m1\e[33m,\e[34m \e[35m2\e[36m,\e[31m \e[32m3\e[33m]\e[0m"
|
||||||
end
|
assert_equal expected, [1, 2, 3].rainbow
|
||||||
|
|
||||||
def test_umeda_to_mikuni_when_fare_is_not_enough
|
|
||||||
ticket = Ticket.new(190)
|
|
||||||
@umeda.enter(ticket)
|
|
||||||
assert @mikuni.exit(ticket)
|
|
||||||
end
|
|
||||||
def test_juso_to_mikuni
|
|
||||||
ticket = Ticket.new(160)
|
|
||||||
@juso.enter(ticket)
|
|
||||||
assert @mikuni.exit(ticket)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue