5

Incident_Collectionそれぞれがインターフェイスを実装する他のオブジェクトのコレクションを保持するPHP オブジェクト (と呼びます) を設計しようとしていIncidentます。

<?php
class Foo implements Incident {
  protected $incident_date; //DateTime object
  protected $prop1;
  protected $prop2;
  //etc

  public function when(){ //required by Incident interface
    return $this->incident_date;
  }

}
?>

最初は、インシデント オブジェクトをIncident_Collection実装して、コレクションの配列プロパティに格納するだけでよいと考えました。IteratorAggregate

<?php
class Incident_Collection implements IteratorAggregate {
  protected $collection=array();

  public function getIterator(){
    return new ArrayIterator($this->collection);    
  }

  public function sort(){
     //sort by $incident->when() values in $this->collection
  }

  /*also __get($var), __set($var,$value), add(Incident $object), remove(Incident $object) and other functions*/
}
?>

しかし、Incidentオブジェクトには自然な順序があるため、おそらくSPL データ構造の 1 つを拡張する方がより適切/効率的であると考えました。しかし、どれですか?特定のデータ構造をいつ使用するかについてはよくわかりません。

もう 1 つの問題は、Incident_Collection. たとえば、 を持つPersonオブジェクトがあった場合Incident_Collection、次の制限が適用される可能性があります。

  • 1Birth件のみ
  • 存在する場合Birthは、コレクション内の最初のインシデントである必要があります
  • 1Death件のみ
  • 存在する場合Deathは、コレクション内の最後のインシデントである必要があります
  • HS_Graduation後に来なければならないHS_Begin

Incident_Collection所有者からの一連の制限を受け入れるジェネリック(例: Person)、またはサブクラス化した方がよいでしょうPerson_Incident_Collectionか?

4

1 に答える 1

3

チェックアウト

SPL DataStructures の概要、それらが何であり、いつ使用するかを説明しています。ベンチマークもあります。

これがオブジェクト コレクションである場合は、単純な Array の代わりに SplObjectStorage を使用することを検討します。インシデントを LIFO または FIFO の順序にする必要がある場合は、キューとスタックを検討してください。カスタム オーダーでそれらが必要な場合は、プライオリティ キューを検討してください。

制限に関しては、State Patternを使用できます。たとえば、アクセスは一般的な IncidentCollection を介して行われますが、所有者のプロパティに応じて、状態の変更を処理するためにサブクラスが適用されます。ただし、これにはコレクションに所有者プロパティが必要です。とにかく、個々の状態は IncidentCollection のサブクラスであるため、直接使用することもできます。

于 2011-01-27T23:07:25.930 に答える