簡體   English   中英

父子關系中的Php模塊化與快速腳本執行

[英]Php modularity in parent-child relationship vs quick script execution

我正在編寫的應用程序包含用戶組,我們稱之為社區。 每個社區都有會議,這些會議還有一些與之相關的對象(與會者,目標,任務,成就等)。

我有點困惑的是,在創建父項時實現初始化子對象的最佳方法是什么。 這是一個簡化的類設置。

第一次實施

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

這種方法將初始化的責任放在每個對象上,在我看來,這對於可維護性和模塊性更好,但我可以看到這是一個巨大的級聯瓶頸,因為每次會議的子對象也會負責初始化自己。

我能想到的另一種方法是使用單個數據庫調用填充$ meetings數組。 所有會議都存儲在具有社區ID字段的單個表中。

第二次實施

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

     }
}
?>

我相信第二課的執行速度要快得多,但我現在將會議課程與社區課程相結合,感覺它不是最好的解決方案。

我的問題是應該將這些類別(社區,會議,目標,成就,任務等)脫鈎的庫存量是多少? 我個人的感覺是,我應該使用第一次實施,直到它被證明不適合我的流量負載,然后轉向類似第二次實施的東西。 我想知道有更多經驗的人發現是最好的做法。 我覺得這是一個兔子洞,一旦我下來可能很難重構。 另外,我不相信Either方法是解決這個問題的正確方法。 非常感謝您提供的任何幫助!

您必須問自己,您是否真的需要社區中的所有會議。 我們來看看下面的用例。

  1. 您希望輸出社區的所有信息,包括會議列表。 這似乎是一個有效的案例,您希望構建一個社區及其所有會議。 但是有一種更有效的方法。

     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. 您有一個用例,您需要操縱社區的所有會議。 在你的方法中你會這樣做:

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

    但你也可以使用示例#1中的方法。 而不是輸出您執行操作所需的操作。


但是,如果您確實需要會議,則應在社區外創建它們,並將它們作為依賴項傳遞到社區對象中(如果在創建期間需要,則在控制器中,或者如果稍后可能添加,則作為setter)。

class Community {

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

你從上述方法中獲得了什么?

  • 您並不總是加載每個社區的所有會議信息。
  • 你解耦了這些課程。 現在可以不存在另一個,可以替換進行測試。
  • 您不會通過創建對象來使您的業務邏輯負擔過重。 這應該發生在控制器級別而不是業務對象中。
  • 如果需要,您甚至可以替換這些網關並從其他地方加載數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM