Execute Around Method

必ず対で実行しなければならない処理がある場合は、ブロックを受け取るメソッドを定義しましょう。

振る舞いの実現に関するパターンです。
ファイルをオープンしたら最後に必ずクローズしなければいけないといった、必ず対で実行しなければならない処理を実現したい場合、最も単純な実現方法は対の処理をそれぞれ独立したメソッドとして公開することです。

class File
  def open
    ...
  end

  def close
    ...
  end
end

f = File.new
f.open
...
f.close

しかし、この実現方法だと、インタフェースとして以下のような問題が残ります。

  • 対で実行する必要があることを利用者が知らなければならない
  • どのようなケースでも処理が対で実行されることをそれぞれの利用者が保証しなければいけない

このような問題は、対の処理の間で実行したい処理をブロックとして受け取るメソッドを定義することで解決出来ます。
具体的には、メソッド名を最初に実行する必要がある処理の名前として、メソッドの中身は

  • 一番目に実行する必要がある処理
  • ブロックで渡された処理
  • 二番目に実行する必要がある処理

の順で処理を記述するようにします。

class File
  def open
    open_file
    yield
    close_file
  end
end

f = File.new
f.open{
...
}

このようにすることで、利用者は本当に関心のある処理の記述に集中できるようになり、利用者に易しいインタフェースを実現することが出来ます。