2011-01-27 7 views
5

Я пытаюсь создать объект 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 и хранить объекты происшествий в собственности массива коллекции:

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

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

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

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

ответ

3

Заканчивать

Это дает хороший обзор SPL DataStructures, что они есть, и когда вы хотите использовать их. Есть также контрольные показатели.

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

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

+0

отличная связь. Благодаря! – dnagirl

+1

Похож на приоритет Очередь - мой парень. Я думал о государственной схеме и задавался вопросом, позолота ли лилия. Рад узнать ваши мысли. – dnagirl

+0

@dnagirl, пожалуйста. Re State Pattern Я бы основал решение о том, действительно ли владелец является фактическим состоянием (по сравнению с ссылкой или ссылкой) IncidentCollection или если это скорее SpecialCase. Если последнее, я не буду использовать государство.Не уверен, как сделать это менее размытым. Извини :) – Gordon

Смежные вопросы