1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyのデザインパターン開発におけるProxyパターンの利用について

2022-01-31 11:16:50

プロキシパターン
Proxyパターンは、アクセスするオブジェクトがリモートマシンにある場合など、オブジェクトに直接アクセスする際に発生する問題に対処するための構造設計パターンである。オブジェクト指向システムでは、何らかの理由で(オブジェクトの作成のオーバーヘッド、またはいくつかの操作は、セキュリティ制御を必要とする、またはプロセス外のアクセスを必要とする)、直接アクセスすると、ユーザやシステム構造に多くのトラブルをもたらすいくつかのオブジェクトは、我々はこのオブジェクトにアクセスするときに、アクセス層を追加することができます。次の図です。

  例えば、CとAが同じサーバー上になく、Aが頻繁にCを呼び出す必要がある場合、A上にProxyクラスを作り、CへのアクセスをProxyに与えることで、AにとってはCのオブジェクトに直接アクセスするのと同じことになります。Aの開発では、ビジネスの実装に全面的に集中することができます。
GoFデザインパターンにはこうあります。このオブジェクトへのアクセスを制御するために、他のオブジェクトのためのプロキシを提供する。
Proxyパターンの構造。

プロキシパターンを介して、クライアントから見えない形でターゲットオブジェクトの動作を動的に制御する。

インスタンス

class BankAccount
 
 def deposit
  p "store the money"
 end
 
end

class Proxy
 
 attr_accessor :bankAccount
 
 def initialize bankAccount
  @bankAccount = bankAccount
 end
 
 def deposit
  @bankAccount.deposit
 end
 
end



 銀行口座クラスを作成し、次に銀行口座クラスを集約し、同じ動作構造を提供するプロキシクラスを作成します。顧客にとってプロキシクラスは擬似口座クラスであり、プロキシクラスに対して操作を行うと、実際には本物の銀行クラスに対して操作を行っていることになります。
動作制御を追加する。

class Proxy
 
 attr_accessor :bankAccount
 
 def initialize bankAccount
  @bankAccount = bankAccount
 end
 
 def deposit
  check_something
  @bankAccount.deposit
 end
 
 def check_something
  #do some checking code
 end
 
end


 これにより、ターゲットオブジェクトの呼び出しに制御コードを追加することができますが、通常のBankAccountオブジェクトのメソッドを呼び出すのと同じように、クライアントにはすべて透過的に表示されます。

bankAccount = BankAccount.new
bankAccount.deposit
proxy = Proxy.new bankAccount
proxy.deposit


  Proxyパターンのキーポイント。
1.quot;インダイレクトの層を追加する"は、ソフトウェアシステムにおける多くの責任ある問題に対する一般的な解決策である。オブジェクト指向システムでは、特定のオブジェクトを直接使用すると多くの問題が発生することがあり、間接層としてのプロキシオブジェクトはこの問題を解決するための一般的な手段である。
それから、例えば、少し前にAOPとRemotingを調べたとき、アプリケーションドメインをまたいだアクセスのために、TransparentProxyをクライアントアプリケーションに提供し、クライアントアプリケーションはこのproxyにアクセスすることで実際の型オブジェクトに実際にアクセスするのです。
2. 具体的なプロキシデザインパターンの実装方法や粒度は様々で、個々のオブジェクトを細かく制御するものもあれば、コンポーネントモジュールがアーキテクチャレベルでオブジェクトのプロキシを作るための抽象的なプロキシレイヤーを提供する場合もある。
例えば、上記の例では、プロキシ型ProxyClassとプロキシ型LongDistanceClassは同じインターフェースを継承する必要はない。GoFデザインパターンのように、他のオブジェクトにプロキシを提供し、そのオブジェクトへのアクセスを制御するのである。プロキシ型は、ある意味でプロキシされた型へのアクセスを制御する役割を果たすこともできる。