Last active
August 29, 2015 14:11
-
-
Save ieda/adb6c9bc2a97f9020412 to your computer and use it in GitHub Desktop.
イミュータブルオブジェクトと、そうではないオブジェクトの違いを掴む
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
=begin | |
以下のコードでは、数値を表すモデルを、 | |
イミュータブルなオブジェクトになるような定義と、 | |
イミュータブルではないオブジェクトになるような定義の | |
2つで実装している。 | |
2つのオブジェクトに対して、ほぼ同じ操作を行い、 | |
その振る舞いの違いから知見を得ることを想定している。 | |
=end | |
class ImmutableNumber | |
attr_reader :value | |
def initialize(init_value) | |
@value = init_value | |
end | |
def plus(other_value) | |
ImmutableNumber.new(@value + other_value) | |
end | |
def to_s | |
@value.to_s | |
end | |
end | |
class MutableNumber | |
attr_reader :value | |
def initialize(init_value) | |
@value = init_value | |
end | |
def plus!(other_value) | |
@value += other_value | |
end | |
def to_s | |
@value.to_s | |
end | |
end | |
immutable_number = ImmutableNumber.new(1) | |
reference_immutable_number = immutable_number | |
immutable_number.plus(1) | |
puts immutable_number # => 1 | |
puts reference_immutable_number # => 1 | |
=begin | |
immutable_number = ImmutableNumber.new(1) | |
immutable_number.plus(1) | |
puts immutable_number # => 1 | |
の一連の流れは、直感に反するかもしれない。 | |
そうだとしたら、イメージしたものはこちらに近いかもしれない。 | |
immutable_number = ImmutableNumber.new(1) | |
reference_immutable_number = immutable_number | |
immutable_number = immutable_number.plus(1) | |
puts immutable_number # => 2 | |
puts reference_immutable_number # => 1 | |
=end | |
mutable_number = MutableNumber.new(1) | |
reference_mutable_number = mutable_number | |
mutable_number.plus!(1) | |
puts mutable_number # => 2 | |
puts reference_mutable_number # => 2 | |
=begin | |
reference_mutable_numberに対しては、一度代入を行っただけである。 | |
それにも関わらず、出力結果が代入時のmutable_numberの値から変わっている。 | |
=end | |
=begin | |
ImmutableNumberクラスは説明用のクラス。 | |
Integerクラスの振る舞いの一部を切り出しただけ。 | |
=end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment