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ónHS_Graduation
debe venir despuésHS_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
?
excelente enlace. ¡Gracias! – dnagirl
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
@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