オブジェクト指向設計ガイドを読んでいて、依存を減らすテクニックの一つ。 今3章を読んでいるけど、『隠れた依存はあぶない』って感じの内容。
例
まずは簡単に依存が分かる例。
class Foo attr_reader :bar, :baz, :birthday def initialize(bar, baz, birthday) @bar = bar @baz = baz @birthday = birthday end def change ratio * alice.age ★ end def ratio bar / baz end def alice @alice = Alice.new(birthday) end end class Alice attr_reader :birthday def initialize(birthday) @birthday = birthday end def age Data.today - birthday end end p Foo.new(10, 20, Alice.new('2000.01.01'))
オブジェクト指向関係なく、ざっくり処理の流れは分かる。 ★マークがついている処理も、「あ、aliceっていうインスタンス使っているんだな~」と分かる。つまり、他のクラスと依存関係にあることが把握できるので、変更があっても何とかなる。
でも例えば、★マークの処理がもっと複雑になると、、、
def change bob.bar.ratio(baz, from) * (alice.age / years) ★ end
もうこうなるとどれがインスタンスで、どれが自分のクラスで定義しているメソッドで・・・と処理を終えなくなる。
ここで著者はメソッドの抜き出しを薦めている。
すすめ
def change calculate.ratio(baz, from) * divide ★ end def calculate bob.bar end def divide alice.age / years end
メインの処理であるchabge
から、aliceとbobへの依存を切り出せた。change
メソッドの中の処理は、全てselfに送るメソッドだけになった。
初めの小さいコードのころは付け足していくだけでも何とかなったかもしれないけど、アプリが肥大化するにつれて目で追える量じゃなくなるかも。 全部が全部メソッドとして切り出せるわけではないけど、切り出せるか自問自答するのは一考の余地があるとのこと。