2011-01-27 7 views
5

Estoy tratando de diseñar un objeto PHP (llámelo Incident_Collection) que contendrá una colección de otros objetos cada uno de los cuales implementa una interfaz Incident.elegir una estructura de datos para una colección de objetos fechados

<?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; 
    } 

} 
?> 

Al principio pensé que acababa de hacer mi Incident_Collection aplicar IteratorAggregate y almacenar los objetos incidente en una propiedad de matriz de la colección:

<?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*/ 
} 
?> 

Pero debido Incident objetos tienen un orden natural, me Tal vez la idea de ampliar uno de los SPL Data Structures sea más apropiado/eficiente. ¿Pero cuál? No tengo muy claro cuándo usar una estructura de datos particular.

Otra arruga es que puede haber restricciones en un Incident_Collection. Por ejemplo, si había un objeto Person que tenía un Incident_Collection, tal vez podrían aplican las siguientes restricciones:

  • sólo el 1 Birth incidente
  • si Birth existe, debe ser el primer incidente en la colección
  • Sólo 1 Death incidente
  • Death si existe, debe ser el último incidente en la colección
  • HS_Graduation debe venir después HS_Begin

¿Sería mejor tener un genérico Incident_Collection que acepta un conjunto de restricciones de su propietario (p. Ej. Person), o una subclase Person_Incident_Collection?

Respuesta

3

Salida

Se da una buena visión general de las estructuras de datos de SPL, lo que son y cuando se desea usarlos. También hay puntos de referencia.

Si se trata de una colección de objetos, definitivamente consideraría usar SplObjectStorage en lugar de la matriz simple. Si los incidentes deben estar en orden LIFO o FIFO, considere colas y pilas. Si los necesita en un pedido personalizado, considere un Priority Queue.

En cuanto a las restricciones, puede usar State Pattern, p. Ej. el acceso ocurre a través de IncidentCollection general, pero dependiendo de su propiedad propietaria, se aplica una subclase para controlar el cambio de estado. Esto requiere que la colección tenga una propiedad del propietario. Debido a que los estados individuales son subclases de IncidentCollection de todos modos, podrías usarlos directamente.

+0

excelente enlace. ¡Gracias! – dnagirl

+1

Parece que Priority Queue es mi tipo. He estado pensando en el patrón del estado y preguntándome si estaba dorando el lirio. Me alegra saber tus pensamientos. – dnagirl

+0

@dnagirl de nada. Re State Pattern Basaría la decisión sobre si el propietario es realmente un estado real (frente a una referencia/enlace) de IncidentCollection o si es más bien un SpecialCase. Si es lo último, no usaría State.No estoy seguro de cómo poner eso menos borroso. Lo siento :) – Gordon

Cuestiones relacionadas