マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

Proxyパターン

使いどころ

  • オブジェクトに対する操作の間に何らかの操作を挟み込みたいとき
  • 間に挟み込まれている処理に関する詳細を、対象のオブジェクトとそれを操作するオブジェクト隠蔽したいとき

構造

商品を表すItemを考える。ItemImplはItemそのものを表すクラスである。ItemProxyは、Itemインターフェースを実装していて、ItemImplに対する参照を持つ。

f:id:ytnk531:20210507184126p:plain

DBアクセスするItemProxyを、ItemImplと同じインターフェースを提供する状態にして定義する。 こうすることで、ItemImplはDBアクセスについて何も知らない状態を作れる。

何が嬉しいのか

  • Proxyが行っている処理を、Itemから完全に分離できる。いわゆるビジネスロジックが、データの永続化に関わるロジックの影響を受けない。
  • Proxyを入れ替えるだけで異なる処理を挟み込める。例えば、DBアクセスによるデータ取得をAPI取得によるものに変更する場合もProxyを入れ替えるだけで良い。

注意点

  • Proxyを常にItemに追従させないといけないので実装はけっこう面倒
  • データアクセスをともなうなどの処理が、本当に普通のオブジェクトと全く同じインターフェースできれいに実装できるのかは怪しい
  • 単にデータベースにアクセスしたいだけなら、少しやりすぎな感はある。ビジネスロジックに多少侵食していいなら、データアクセスオブジェクトをコールするなどもう少し単純なやり方がある。