【问题标题】:Multiple entity extension多实体扩展
【发布时间】:2016-06-18 17:36:37
【问题描述】:

假设我有一个定义实体的类,例如 Product。

我的框架是在可切换模块中构建的,因此某些模块可以扩展默认类,即:

  • Module1 让我定义一个 ColoredProduct
  • Module2 让我定义一个 ShapedProduct

如何定义ColoredProduct、ShapedProduct 和Product 之间的关系?如何确保我可以获得动态关系(在没有代码干预的情况下切换一个或另一个)?

我是否扩展类产品?我是否在每个子类中都引用它?

我正在使用 PHP。感谢您的意见。

【问题讨论】:

  • 在您的情况下,“在没有代码干预的情况下切换一个或另一个”短语是什么意思?
  • 这意味着我可以启用或禁用我的模块。
  • 您能说明您主要如何在技术上启用/禁用其中一个模块吗?
  • 从技术上讲,我有一个包含已启用模块列表的数据库表。我的界面显示我的模块是否启用取决于此表,以及我的模块文件夹中的存在。添加模块会动态修改作曲家自动加载器,然后加载我的类 ($classLoader->addPsr4...)
  • 那么,在哪里找到了这样的方法?每次您的代码运行并启动数据库查询时,以验证当前模块是启用还是禁用。有什么好处?

标签: php oop architecture modularity conceptual


【解决方案1】:

这听起来像是在寻找类层次结构:

  • Product 是超类
  • ColoredProduct 和 ShapedProduct 是子类。

您不需要额外的代码,因为子类继承了Product 超类的方法和属性。

根据您实现模块的方式,这也可以使用接口或特征来解决。

如果您的问题更多是关于设计相关的应用程序模块,可能会感兴趣:what is the difference between loose coupling and tight coupling in object oriented paradigm?。

有关如何在 PHP 中设计独立模块的一个很好的示例,您必须查看Modules in Yii2 Framework。

【讨论】:

  • 我对子类的唯一问题是我不确定子类在通用范围内如何相互交互。我怎样才能同时从这两种行为中受益?无论如何,也许这会强制将我的应用程序逻辑放到正确的位置。谢谢
  • 为了让子类相互交互,在 Product 超类中定义交互方法。或者使用事件在发送和接收事件的子类对象之间进行通信。事件模式支持对象的松散耦合,而不是直接调用方法。 Yii2 再次为此提供了一些很好的工具(尽管必须使用框架作为整体)。
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多