web-dev-qa-db-ja.com

メディエーターパターンまたはファサードまたは...?

デバイスの位置を追跡し、いくつかの要因(ユーザーが割り当てを取得)に基づいて、位置追跡の設定(頻度など)を変更する必要があるアプリを作成しています。

これを設計する方法に問題があります。

_// I left out methods to start\stop tracking
interface ILocationTracker
{
    event EventHandler LocationChanged(Position pos);

    void UpdateTrackingSettings(TrackingSettings settings);
}

interface IUser
{
    event EventHandler AssignmentAdded(Assignment a);
}
_

IUserILocationTrackerに結合したくないので、これを追加しました(フィールドを省略しているので、読みやすくなっています)。

_class UpdateLocationTrackingSettings
{ 
     public UpdateLocationTrackingSettings(ILocationTracker tracker, IUser user)
     {
     }

     // I need to somehow start/stop it listening to AssignmendAdded event
     public void Start() {
          // Subscribe to IUser:AssignmentAdded
     }

     public void Stop() {
          // Unsubscribe from IUser:AssignmentAdded
     }

      void OnAssignmentAdded(Assignment a)
      {
          TrackingSettings settings = GetSettingsByAssignment(a); 
          _tracker.UpdateTrackingSettings(settings);
      }
}
_

私が持っている質問:

  • UpdateLocationTrackingSettingsを「開始」する方法は? ILocationTrackingUpdateLocationTrackingSettingsを含み、それぞれでStart()を呼び出す位置追跡用のファサードが必要ですか?

  • GetSettingsByAssignmentのように感じます。戦略パターンを使用する必要があります。割り当てに基づいて追跡設定を計算して返すITrackingSettingProviderのようなものを実装することを考えています。

  • これは考えすぎですか?

  • 別のまたはより良いデザインの提案はありますか?

2
Daniel

これは考えすぎですか?

[〜#〜] yes [〜#〜]。この選択をするのは時期尚早です。あなたが明確なアイデアを持っている場合は、それで行ってください。そうでない場合は、いくつかのテストを作成し、可能な限り単純なコードで合格させます。循環クラス依存関係が発生した場合は、インターフェースを導入してそれを破ります。コードが反復的または醜い場合、リファクタリングします。その時点で、いくつかのデザインパターンがニーズに合う場合があります。

2
kevin cline