[読書メモ]オブジェクト指向設計実践ガイド/2. 3 変更を歓迎するコードを書く
Metadata
Date: April 10th, 2022
Category: プログラミングを通して面白い課題を解決したい
本
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
2.3章の要約
変更を歓迎するためのコードを書くためのテクニックが紹介されている
インスタンス変数の隠蔽
インスタンス変数をラッパーメソッドで隠蔽することで、変更する必要が出てきたときにラッパーメソッドの1箇所のみ修正すればよくなる。
データ構造の隠蔽
複雑なデータ構造はRubyのStructクラスを使って隠蔽する
メソッドを単一責任にする
メソッドに対しても、単一責任は有効。複数の責任を持つメソッドは分割する。
データ構造を隠蔽するStructクラスは便利そう
2.3章の中でも便利そうだと思ったStructクラスについて深ぼってみる。
書籍で紹介されている例だは、dataには下記のような二次元配列が入ってくる。
そのときに、色んなところでこの二次元配列の構造を知っていなきゃいけない実装になるため辛い。
じゃあどうするかということでStructが使われていた。
data
@data = [[622, 20], [622, 23], [559, 30], [559, 40]]
Struct
Wheel = Struct.new(:rim, :tire)
def wheelify(data)
data.collect {|cell|
Wheel.new(cell[0], cell[1])}
end
wheelifyした結果は、Wheelのインスタンスのリストが返る。
Structを使うことで、構造に意味を持たせることができる。
[#<struct Wheel rim=622, tire=20>,
#<struct Wheel rim=622, tire=23>,
#<struct Wheel rim=559, tire=30>,
#<struct Wheel rim=559, tire=40>]
Wheelのインスタンスはそれぞれ、rimとtireという属性を持ちアクセスすることができるのでcell[0]
やcell[1]
としていた箇所がwheel.rim
やwheel.tire
とすることで可読性があがりメンテしやすいコードになった!
irb(main):001:0> Wheel = Struct.new(:rim, :tire)
=> Wheel
irb(main):002:0> wheel = Wheel.new
=> #<struct Wheel rim=nil, tire=nil>
irb(main):003:0> wheel.rim
=> nil
irb(main):004:0> wheel.tire
=> nil