Small Changes

[読書メモ]オブジェクト指向設計実践ガイド/2. 3 変更を歓迎するコードを書く

オブジェクト指向設計実践ガイド ~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.rimwheel.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