2

短い質問

C++ドメイン モデルが 1 つあります。内部 API で使用されるいくつかのメソッドと、その他のパブリック メソッドがあります。これらの API メソッドを公開したくありません。これらのメソッドを隠すためにプロキシ パターンを使用することを考えています。これは良い考えだと思いますか?これを達成するための設計パターンはありますか?

長い例

ソフトウェアで制御できるが、一部の技術者が手動で動かすこともできるロボット アームが遠隔地にあるとします。それは、それが保持しているオブジェクトの種類を知ることを可能にするいくつかのセンサーを持っています. 私のプロジェクトでは、これはまったく異なるものですが、これは例として使用しているだけです。したがって、 RoboticHeldObject抽象クラスを含む1 つのRoboticArmクラスが必要です。RoboticArmは、腕を動かすだけでなく、どの RoboticHeldObject を保持しているかを知らせます。ただし、オブジェクトをピックアップしてリリースすることはできません。これは、ロボットを操作する技術者によって決定されます。したがって、次のようになります。

---------------------------------------------
RoboticArm
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService

実装は非常に複雑なので、実際に難しい作業を実行する外部クラスRobotServiceを使用します。ただし、実際にRobotServiceを使用するのはRoboticArmであり(したがって機能を備えています)、残りの世界は RobotService について何も知らないため、Anemic Domain Model ではありません。

ここでの問題は、 releaseObject()holdObject()は、ここではRobotServiceのみが使用する API メソッドです。これらは、技術者がアームに保持されているオブジェクトを解放するか、新しいオブジェクトを配置するたびに、RobotServiceによってのみ呼び出されます。したがって、ネットワーク イベントがRobotServiceによって処理されるときに呼び出されます(アームは離れた場所にあるため、イベントはネットワーク経由で受信されることに注意してください)。例えば:

RobotService::handleObjectReleaseEvent(event)
{
 RoboticArm *arm = correspondingRoboticArm(event);
 arm->releaseObject();
}

私のアプローチ

これらのメソッドを非表示にするには、RoboticArm の名前RealRoboticArmに変更し、 RoboticArmプロキシ クラスを作成します。

---------------------------------------------
RoboticArm        (the proxy)
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
---------------------------------------------
- realArm                  RoboticArm*



---------------------------------------------
RealRoboticArm    (the real object)
---------------------------------------------
+ heldObject()             RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject               RoboticHeldObject*
- service                  RobotService

RoboticArmはプロキシであるため、RoboticArm::heldObject() は realArm->heldObject()、RoboticArm::moveUp() realArm->moveUp() などを呼び出します。

RobotServiceはRealRoboticArmインスタンスへのポインタを持つため、 releaseObject () などの API メソッドを呼び出すことができます。ただし、アプリケーションの他の部分は、 RealRoboticArm へのポインタを持たないため、 RoboticArm のメソッドしか使用できませ。したがって、 releaseObject()holdObject()は、効果的に聴衆から隠されます。

質問

これがプロキシ パターンなのかアダプター パターンなのかは 100% わかりません。これは、そのようなシステムをモデル化する適切な方法だと思いますか? より良いパターンはありますか?

4

2 に答える 2

0

インターフェイスを使用して問題を解決できます。API 用と using クラス用の 2 つのインターフェイスを実装する 1 つのオブジェクト、RobotArm があります。

using クラスは、API メソッドのないインターフェイスを使用するため、API メソッドを呼び出すことはできません。

于 2010-08-22T11:04:11.297 に答える
0

同じことを行うクラスを持つことは一般的ですが、抽象化のレベルは異なります。

例、抽象化のレベルを下げる場合:

  • GrabbingRobot.GrabBottle();
  • SpaciousRobotArm.MoveToCoordinates(x, y);
  • RobotBase.Turn(度)、RobotArm.Extend(インチ)
  • RobotElbow.Bend(度)
  • RobotServoMotor.Turn(サイクル)
  • RobotServoRelais.TurnOn(秒)

あなたの例では、RoboticArm は RealRoboticArm から物を保持することを抽象化しています。物をセットして解放する代わりに、RoboticArm は何かを持っているかどうか、何を持っているかを魔法のように認識します。これはプロキシでもアダプタでもありません。

GrabbingRobot が RobotElbow を直接呼び出すのを防ぐのに十分な精巧な権限構造はありません。

于 2010-08-22T11:01:23.843 に答える