выбор структуры данных для коллекции датированных объектов - PullRequest
5 голосов
/ 28 января 2011

Я пытаюсь спроектировать объект PHP (назовите его Incident_Collection), который будет содержать коллекцию других объектов, каждый из которых реализует интерфейс 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 и сохранить объекты Incident в свойстве массива коллекции:

<?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 может быть более подходящим / эффективным. Но какой именно? Мне не очень понятно, когда следует использовать конкретную структуру данных.

Еще одна проблема заключается в том, что могут быть ограничения на Incident_Collection.Например, если был объект Person с Incident_Collection, возможно, могут применяться следующие ограничения:

  • только 1 Birth инцидент
  • , если Birthсуществует, это должен быть самый ранний инцидент в коллекции
  • только 1 Death инцидент
  • если Death существует, это должен быть последний инцидент в коллекции
  • HS_Graduation должен идти после HS_Begin

Было бы лучше иметь универсальный Incident_Collection, который принимает набор ограничений от своего владельца (например, Person), или подкласс Person_Incident_Collection

1 Ответ

3 голосов
/ 28 января 2011

Выезд

Он дает хороший обзор структур данных SPL, что они из себя представляют и когда вы хотите их использовать. Также есть отметки.

Если это коллекция объектов, я бы определенно рассмотрел использование SplObjectStorage вместо обычного массива. Если инциденты должны быть в порядке LIFO или FIFO, рассмотрите очереди и стеки. Если они вам нужны в произвольном порядке, рассмотрите Priority Queue .

Что касается ограничений, вы можете использовать State State , например, доступ осуществляется через общую коллекцию IncidentCollection, но в зависимости от свойства ее владельца применяется подкласс для обработки изменения состояния. Это требует, чтобы коллекция имела свойство владельца. Поскольку индивидуальные состояния в любом случае являются подклассами IncidentCollection, вы также можете использовать их напрямую.

...