繁体   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