This is IT

技術、日常

ながーいメソッドになったら、一部を別メソッドに切り出そう

オブジェクト指向設計ガイドを読んでいて、依存を減らすテクニックの一つ。 今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に送るメソッドだけになった。

初めの小さいコードのころは付け足していくだけでも何とかなったかもしれないけど、アプリが肥大化するにつれて目で追える量じゃなくなるかも。 全部が全部メソッドとして切り出せるわけではないけど、切り出せるか自問自答するのは一考の余地があるとのこと。