【问题标题】:Polymorphic Domain Objects Based On Data Mapper基于数据映射器的多态域对象
【发布时间】:2010-10-04 01:30:50
【问题描述】:

我有一个基本的域对象,比如由数据库中的单个表表示的 Person、Campaign 或 Event。但是,我也有这些对象的更复杂版本,例如 PersonCampaign 或 PersonEvent 甚至是理论上可以扩展基础对象之一的 CampaignEvent。

但是,由于多种原因,这变得复杂了,因为 PHP 不支持多重继承(例如 PersonEvent 扩展了 Person 或 Event)。还因为一些域对象实际上是具有不同属性和功能的工厂对象(例如,事件实际上是按电子邮件、电话、传真等事件类型的子类)。

我能看到的最简单的解决方案是根据从数据访问层返回的数据来改变对象的实际性质。

有人对更好的处理方法有任何建议吗?或者创建可以根据数据访问层当前可用的内容更改属性和行为的统一域对象是否正确?

【问题讨论】:

    标签: php oop dns data-access-layer


    【解决方案1】:

    解决方案是封装其他对象:

    PersonEvent 类包含一个 Person 和一个 Event。

    可通过函数 $PersonEvent->get_event() 或属性 $PersonEvent->Event 访问;

    【讨论】:

      【解决方案2】:

      从 OOP 的角度来看,PersonEvent 并不是一个真正的对象,而是一个关系。

      Person 类可以得到如下函数:

      get_events()
      add_event($Event)
      remove_event($Event)
      

      和事件类

      get_person()
      set_person($Person)
      unset_person() // set person_id to NULL
      

      (假设人和事件之间的关系是 1:N)

      不好的是,这会使数据映射器复杂化,或者根本不会使用数据映射器。

      【讨论】:

        【解决方案3】:

        有这样的设置怎么样:

        表:人员、销售人员、客户人员等。 人员表存储有关人员的所有子类型的通用信息。然后还有其他表 FK'd 到 person 表。它存储有关该子类型的其他唯一信息。

        您的对象要么扩展,要么调用通用“人”对象来访问主要数据,然后调用它的唯一类型对象来访问该子类型的唯一数据?

        【讨论】:

          猜你喜欢
          • 2016-10-10
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2016-12-04
          相关资源
          最近更新 更多