Tan*_*ner 5 php oop design-patterns
我正在编写的应用程序包含用户组,我们称之为社区.每个社区都有会议,这些会议还有一些与之相关的对象(与会者,目标,任务,成就等).
我有点困惑的是,在创建父项时实现初始化子对象的最佳方法是什么.这是一个简化的类设置.
第一次实施
<?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;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这种方法将初始化的责任放在每个对象上,在我看来这对于可维护性和模块性更好,但我可以看到这是一个巨大的级联瓶颈,因为每次会议的子对象也会负责初始化自己.
我能想到的另一种方法是使用单个数据库调用填充$ 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;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
我相信第二课的执行速度要快得多,但我现在将会议课程与社区课程相结合,感觉它不是最好的解决方案.
我的问题是应该将这些类别(社区,会议,目标,成就,任务等)脱钩的库存量是多少?我个人的感觉是,我应该使用第一次实施,直到它被证明不适合我的流量负载,然后转向类似第二次实施的东西.我想知道有更多经验的人发现是最好的做法.我觉得这是一个兔子洞,一旦我下来可能很难重构.另外,我不相信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
}
}
Run Code Online (Sandbox Code Playgroud)您有一个用例,您需要操纵社区的所有会议。在你的方法中,你会这样做:
$community = new Community();
$community->doSomethingToAllMeetings();
Run Code Online (Sandbox Code Playgroud)
但您也可以使用示例 1 中的方法来实现此目的。而不是输出您执行操作所需的操作。
但是,如果您确实需要会议,那么您应该在社区外部创建它们,并将它们作为依赖项传递到社区对象中(如果在创建过程中需要,则在控制器中,或者如果稍后可能添加它们,则作为设置器)。
class Community {
public function __construct($meetings) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
通过上述方法你有什么收获?