2011-08-17 14 views
1

新しいクラスのインターフェイスを最もうまく構築する方法について疑問があります。新しいクラスと通信する他の2つのクラス、PlatformSensorがあります。新しいクラスPathfinderは、センサデータをSensorから受信し、パスを計算するときに新しいデータを考慮に入れます。 PlatformPathfinderによって作成されたパスに沿って移動していますが、Sensorが脅威を検出した場合は、Platformによって自動的に使用される新しいパスが生成されます。クラスのインターフェイス設計の苦境

私が今まで描いてきたインタフェースは、擬似C++で次のようになります。

class Sensor { 
    Detect() { 
     // Get Data 
     Pathfinder.Process(Data) 
    } 
} 

class Platform { 
    Move() { 
     while(Can move further) 
      Waypoint w = Pathfinder.GetNextWaypoint() 
      // Move towards w 
      if(Arrived at w) 
       Pathfinder.PassedWaypoint() 
    } 
} 

class Pathfinder { 
    Process(Data) { 
     // Adapt path to accomodate Data 
     RecalculatePath() 
    } 
    GetNextWaypoint() { 
     if(!Path calculated) 
      RecalculatePath() 
     return Path.front() 
    } 
    PassedWaypoint() { 
     Path.pop_front() 
    } 
    RecalculatePath() { 
     // Do pathfinding 
    } 
    vector<Waypoint> Path 
} 

は、私は、プラットフォームは、パスファインダーと対話する方法と、本当に満足していません。一方、プラットフォーム全体をフェッチすると、何かが変更されたかどうか定期的にチェックする必要があります。

このデザインをどのように改善できますか?

+0

Pathfinderは、ルートが変更されたことをプラットフォームに通知するためにコールバックを使用できます。これにより、データのコピーが最小限に抑えられ、ポーリングが冗長になります。 – RedX

+0

または、コールバックのアイデアを少し一般化すると、メッセージを扱うことができます。フレームワークを使用していますが、すでにメッセージが渡されている可能性がありますか? –

答えて

1

デザインパターン"Observer"を使用できます。

PlatformオブジェクトはPathfindersイベント "Started recalculation"(直ちに移動を停止または戻るか...)と "Calculation finished"を購読することができます。 Pathfinderオブジェクトに新しいパスがある場合、Platformオブジェクトは一度にすべてのデータを要求できます。

関連する問題