[英]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方法是解決這個問題的正確方法。 非常感謝您提供的任何幫助!
您必須問自己,您是否真的需要社區中的所有會議。 我們來看看下面的用例。
您希望輸出社區的所有信息,包括會議列表。 這似乎是一個有效的案例,您希望構建一個社區及其所有會議。 但是有一種更有效的方法。
class Controller { public function showCommunity($id) { $community = $this->communityGateway->findCommunity($id); $meetings = $this->meetingGateway->findMeetings($community->getCommunityId()); // output your community information and meeting information } }
您有一個用例,您需要操縱社區的所有會議。 在你的方法中你會這樣做:
$community = new Community(); $community->doSomethingToAllMeetings();
但你也可以使用示例#1中的方法。 而不是輸出您執行操作所需的操作。
但是,如果您確實需要會議,則應在社區外創建它們,並將它們作為依賴項傳遞到社區對象中(如果在創建期間需要,則在控制器中,或者如果稍后可能添加,則作為setter)。
class Community {
public function __construct($meetings) {
...
}
}
你從上述方法中獲得了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.