2012-10-15 29 views
5

Ứng dụng tôi đang viết có các nhóm người dùng, hãy gọi cho họ là cộng đồng. Mỗi cộng đồng có các cuộc họp cũng có một số đối tượng liên kết với họ (người tham dự, mục tiêu, nhiệm vụ, thành tích, v.v.).Mô-đun Php trong mối quan hệ cha-con và thực thi tập lệnh nhanh

Tôi hơi bối rối về cách tốt nhất để triển khai thực hiện các đối tượng con khi cha mẹ được tạo. Đây là một thiết lập lớp đơn giản.

Thực hiện Đầu tiên

<?php 
class community 
{ 
    public $id; 
    public $name; 
    //Store an array of meeting objects 
    public $meetings = array(); 
    //Store an array of member objects 
    public $members = array(); 
    //etc 

    public function getProperties() 
    { 
     //hit database for community properties including ids of meetings 
     //and members associated with this community 
     //Set community properties 

     //Use returned ids to populate community properties 
     foreach($returnedMeetingIds as $meetingId) 
     { 
       //The meeting class is responsible for its own init. 
       $newMeeting = new Meeting(); 
       $newMeeting->id = $meetingId; 
       $newMeeting->getProperties(); 
       $this->meetings[$meetingId] = $newMeeting; 
     } 
    } 
} 
?> 

Phương pháp này đặt trách nhiệm khởi tạo trên từng đối tượng mà theo ý kiến ​​của tôi là tốt hơn cho khả năng bảo trì và mô đun nhưng tôi có thể thấy điều này trở thành một nút cổ chai tầng khổng lồ như nhiều cuộc họp được thêm bởi vì các đối tượng con của mỗi cuộc họp cũng sẽ chịu trách nhiệm tự khởi tạo.

Cách khác tôi có thể nghĩ để làm điều này là điền vào mảng $ họp với một cuộc gọi cơ sở dữ liệu duy nhất. Tất cả các cuộc họp được lưu trữ trong một bảng duy nhất với một trường id cộng đồng.

Thứ hai Thực hiện

<?php 
class community 
{ 
    public $id; 
    public $name; 
    //Store an array of meeting objects 
    public $meetings = array(); 
    //Store an array of member objects 
    public $members = array(); 
    //etc 

    public function getProperties() 
    { 
     $sql = 'SELECT * 
       FROM meetings 
       WHERE community_id = :community' 
     //etc 
     $stmt->execute(); 
     while($meeting = $stmt->fetch()) 
     { 
       $newMeeting = new Meeting(); 
       $newMeeting->id = $meeting['id']; 
       //etc 
       $this->meetings[$newMeeting->id] = $newMeeting; 
     } 

    } 
} 
?> 

Tôi tin rằng lớp thứ hai sẽ thực hiện nhanh hơn nhiều nhưng bây giờ tôi đã cùng lớp họp lớp cộng đồng và cảm thấy như nó không phải là tốt nhất các giải pháp.

Câu hỏi của tôi là nên đặt bao nhiêu cổ phiếu trong việc tách các nhóm lớp này (cộng đồng, cuộc họp, mục tiêu, thành tích, nhiệm vụ, v.v.)? Cảm giác cá nhân của riêng tôi là tôi nên đi theo Thực hiện đầu tiên cho đến khi nó chứng minh là không phù hợp với lưu lượng truy cập của tôi và sau đó chuyển đến một cái gì đó như Thực hiện thứ hai. Tôi muốn biết một người nào đó có nhiều kinh nghiệm hơn một chút đã trở thành phương pháp hay nhất. Tôi cảm thấy đây là một lỗ thỏ mà một khi tôi đi xuống có thể khó khăn để tái cấu trúc sau này. Ngoài ra tôi không tin rằng Hoặc là phương pháp là cách phù hợp để tiếp cận điều này. Cảm ơn bạn rất nhiều vì đã giúp đỡ!

+0

Bạn có thể giải thích một chút về thời điểm bạn thực sự gọi mã này không? Chắc chắn bạn không muốn luôn luôn xây dựng toàn bộ hệ thống phân cấp. Bạn có thể nghĩ về một trường hợp sử dụng mà bạn cần tất cả các cuộc họp trong một cộng đồng cùng một lúc? Nếu vậy, bạn có thực sự cần cộng đồng trong trường hợp sử dụng đó không? Nó có thể là tốt hơn để bỏ qua cộng đồng và đi thẳng cho các cuộc họp đôi khi. – Dan

+0

@Dan - Người dùng đăng nhập vào trang cộng đồng liệt kê tất cả các cộng đồng mà họ thuộc về. (người dùng có thể thuộc về nhiều cộng đồng) Chọn một cộng đồng sẽ tải một trang hiển thị tất cả các cuộc họp cộng đồng, các thành viên và các thuộc tính cộng đồng khác. Khi một cuộc họp được chọn, một trang sẽ được tải chứa tất cả thông tin liên quan đến cuộc họp đó. Có những trường hợp sử dụng mà tôi nghĩ rằng tôi có thể bỏ qua tải cộng đồng, tức là một cuộc gọi ajax để tải thuộc tính cuộc họp được chỉnh sửa, nhưng tôi không nghĩ rằng tôi có thể loại bỏ hoàn toàn nó. Tôi nghĩ Triển khai đầu tiên sẽ hoạt động tốt với đề xuất của bạn. – Tanner

+0

Xem câu trả lời của tôi cho một gợi ý cho một cách tiếp cận thay thế. Hãy cho tôi biết nếu bạn có thắc mắc hoặc nghi ngờ. – Dan

Trả lời

2

Bạn phải tự hỏi mình liệu bạn có thực sự yêu cầu tất cả các cuộc họp đó trong cộng đồng hay không. Chúng ta hãy xem xét trường hợp sử dụng sau đây.

  1. Bạn muốn xuất tất cả thông tin của cộng đồng bao gồm danh sách cuộc họp. Điều này có vẻ giống như một trường hợp hợp lệ nơi bạn muốn xây dựng một cộng đồng và tất cả các cuộc họp của cộng đồng. Nhưng có một cách hiệu quả hơn cho việc này.

    class Controller { 
    
        public function showCommunity($id) { 
         $community = $this->communityGateway->findCommunity($id); 
         $meetings = $this->meetingGateway->findMeetings($community->getCommunityId()); 
    
         // output your community information and meeting information 
        } 
    } 
    
  2. Bạn có trường hợp sử dụng nơi bạn cần thao tác tất cả các cuộc họp của cộng đồng. Trong cách tiếp cận của bạn, bạn sẽ làm như sau:

    $community = new Community(); 
    $community->doSomethingToAllMeetings(); 
    

    Nhưng bạn cũng có thể sử dụng cách tiếp cận từ ví dụ số 1 cho điều này. Thay vì xuất ra, bạn thực hiện các hành động cần thiết cho thao tác.


Tuy nhiên nếu bạn không yêu cầu các cuộc họp sau đó bạn nên tạo cho họ bên ngoài cộng đồng và chuyển chúng vào đối tượng cộng đồng như một sự phụ thuộc (hoặc trong bộ điều khiển nếu được yêu cầu trong quá trình tạo, hoặc là một setter nếu chúng có thể được thêm vào sau).

class Community { 

    public function __construct($meetings) { 
    ... 
    } 
} 

Bạn đạt được gì từ cách tiếp cận trên?

  • Bạn không phải lúc nào cũng tải tất cả thông tin cuộc họp cho từng cộng đồng.
  • Bạn tách lớp học. Người ta có thể tồn tại mà không có người khác và có thể được thay thế để thử nghiệm.
  • Bạn không làm quá tải logic nghiệp vụ của mình với việc tạo đối tượng. Điều đó sẽ xảy ra ở cấp độ Bộ điều khiển chứ không phải trong các đối tượng kinh doanh của bạn.
  • Bạn thậm chí có thể thay thế các cổng đó và tải dữ liệu của bạn từ nơi khác nếu bạn muốn.
+1

Tôi không thể tìm thấy một đối số chống lại điều này. Cảm ơn bạn! Sẽ chấp nhận như là câu trả lời. – Tanner

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