2011-01-27 23 views
5

Tôi đang cố thiết kế đối tượng PHP (gọi là Incident_Collection) sẽ giữ một bộ sưu tập các đối tượng khác, mỗi đối tượng này triển khai giao diện Incident.chọn cơ sở dữ liệu cho tập hợp các đối tượng ngày

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

} 
?> 

Lúc đầu, tôi figured tôi chỉ muốn làm cho tôi Incident_Collection thực hiện IteratorAggregate và lưu trữ các đối tượng cố trong một tài sản hàng loạt các bộ sưu tập:

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

Nhưng vì Incident đối tượng có một trật tự tự nhiên, tôi nghĩ rằng có lẽ việc mở rộng một trong số SPL Data Structures có thể phù hợp/hiệu quả hơn. Nhưng cái nào? Tôi không rõ lắm về thời điểm sử dụng cấu trúc dữ liệu cụ thể.

Một nếp nhăn khác là có thể có các hạn chế đối với một số Incident_Collection. Ví dụ, nếu có một đối tượng Person người đã có một Incident_Collection, có lẽ là hạn chế sau đây có thể áp dụng:

  • chỉ 1 Birth cố
  • nếu Birth tồn tại, nó phải là sự cố đầu tiên trong bộ sưu tập
  • chỉ có 1 Death cố
  • nếu Death tồn tại, nó phải là sự cố mới nhất trong bộ sưu tập
  • HS_Graduation phải đến sau HS_Begin

Sẽ tốt hơn nếu bạn có chung một hạn chế Incident_Collection chấp nhận một nhóm hạn chế từ chủ sở hữu của nó (ví dụ: Person) hoặc được phân loại là Person_Incident_Collection?

Trả lời

3

Check-out

Nó cung cấp một cái nhìn tổng quan tốt của datastructures SPL, những gì họ đang có và khi bạn muốn sử dụng chúng. Ngoài ra còn có điểm chuẩn.

Nếu đây là một bộ sưu tập đối tượng, tôi chắc chắn sẽ xem xét sử dụng SplObjectStorage thay vì mảng đồng bằng. Nếu sự cố phải theo thứ tự LIFO hoặc FIFO, hãy xem xét các hàng đợi và ngăn xếp. Nếu bạn cần chúng theo thứ tự tùy chỉnh, hãy xem xét Priority Queue.

Về các hạn chế, bạn có thể sử dụng State Pattern, ví dụ: truy cập xảy ra thông qua IncidentCollection chung, nhưng tùy thuộc vào thuộc tính owner của nó, một lớp con được áp dụng để xử lý việc thay đổi trạng thái. Điều này đòi hỏi các bộ sưu tập để có một tài sản chủ sở hữu mặc dù. Bởi vì các trạng thái cá thể là các lớp con của IncidentCollection, bạn cũng có thể sử dụng chúng trực tiếp.

+0

liên kết tuyệt vời. Cảm ơn! – dnagirl

+1

Hình như Hàng đợi ưu tiên là anh chàng của tôi. Tôi đã suy nghĩ về mô hình Nhà nước và tự hỏi liệu nó có mạ vàng cây huệ không. Vui mừng khi biết suy nghĩ của bạn. – dnagirl

+0

@dnagirl bạn được chào đón. Re State Pattern Tôi muốn đưa ra quyết định về việc liệu chủ sở hữu có thực sự là một trạng thái thực tế hay không (chỉ là một tham chiếu/liên kết) của IncidentCollection hoặc nếu nó là một SpecialCase. Nếu sau này, tôi sẽ không sử dụng nhà nước.Không chắc chắn làm thế nào để đặt rằng bất kỳ ít mờ. Lấy làm tiếc :) – Gordon

Các vấn đề liên quan