5

我正在编写的应用程序有一组用户,我们称他们为社区。每个社区都有会议,会议也有一些与之相关的对象(与会者、目标、任务、成就等)。

对于在创建父对象时实现初始化子对象的最佳方法,我有点困惑。这是一个简化的类设置。

首次实施

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

     }
}
?>

我相信第二堂课会执行得更快,但我现在将会议班与社区班结合起来,感觉这不是最好的解决方案。

我的问题是在将这些类组(社区、会议、目标、成就、任务等)解耦时应该放置多少库存?我个人的感觉是,我应该使用第一个实现,直到证明它不适合我的流量负载,然后再转向第二个实现。我想知道有更多经验的人发现什么是最佳实践。我觉得这是一个兔子洞,一旦我下去,以后可能很难重构。此外,我不相信任何一种方法都是解决这个问题的正确方法。非常感谢您提供的任何帮助!

4

1 回答 1

2

您必须问自己是否真的需要社区中的所有这些会议。让我们看一下以下用例。

  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 中的方法。而不是输出您执行操作所需的操作。


但是,如果您确实需要会议,那么您应该在社区之外创建它们并将它们作为依赖项传递给社区对象(如果在创建期间需要,则在控制器中,或者如果稍后可能添加它们,则作为设置器)。

class Community {

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

您从上述方法中获得了什么?

  • 您并不总是加载每个社区的所有会议信息。
  • 你解耦类。一个现在可以在没有另一个的情况下存在,并且可以被替换以进行测试。
  • 您不会因创建对象而使业务逻辑负担过重。这应该发生在控制器级别而不是您的业务对象中。
  • 如果需要,您甚至可以替换这些网关并从其他地方加载数据。
于 2012-10-15T16:16:39.100 回答