Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计多个类,实现多个类_Oop - Fatal编程技术网

Oop 设计多个类,实现多个类

Oop 设计多个类,实现多个类,oop,Oop,我正在寻找一种模式来设计我的应用程序。 我有固定数量的实体类。例如PostEntity、ArticleEntity、DocumentEntity。它们都是抽象类“实体”的子类。 到目前为止,它看起来很简单。今天我得到了一个新的要求:实体类的实现在不同的系统中是不同的,这意味着,我们将有几个系统:SystemA、SystemB、SystemC。每个系统都应该实现自己的PostEntity、ArticleEntity、DocumentEntity类 如何以合理的方式创建类 简单的方法是为每个系统创建

我正在寻找一种模式来设计我的应用程序。 我有固定数量的实体类。例如PostEntity、ArticleEntity、DocumentEntity。它们都是抽象类“实体”的子类。 到目前为止,它看起来很简单。今天我得到了一个新的要求:实体类的实现在不同的系统中是不同的,这意味着,我们将有几个系统:SystemA、SystemB、SystemC。每个系统都应该实现自己的PostEntity、ArticleEntity、DocumentEntity类

如何以合理的方式创建类

简单的方法是为每个系统创建一个文件夹,并以这种方式放置类:SystemAPostEntity、SystemAArticleEntity、SystemAdDocumentEntity。等等 然后,可能使用工厂方法来创建对象。例如,要获取“SystemA”的“PostEntity”对象,工厂应使用实体类型的开关/案例,并在此开关/案例中使用系统的另一个开关/案例。我觉得这种方式不对。我希望你有另一个想法


谢谢

如果您必须处理多个实体,并且每个实体在每个系统中都有不同的行为集,那么很可能会出现指数级爆炸。我不认为这部分是错的,它只是代表了事物的现状。IMHO这里唯一需要注意的警告是,如果您开始复制代码

首先,我认为采用子类化方法是可以的(即拥有
Entity
>>
PostEntity
>
SystemAPostEntity
)。然后,您可以实现,为每个系统创建一个具体的工厂。你会得到这样的结果:

abstract class SystemFactory
{
public createPost(params);
...
}

class SystemAFactory extends SystemFactory
{
public createPost(params) 
  {
      return new SystemAPostEntity(params);
  }
}
这样,每个系统都会有一个工厂来为其创建对象

一个要考虑的是,如果给定系统的所有实体共享一些共同的行为(例如,它们必须携带一个时间戳和与之相关的行为)。在这种情况下,您应该尝试将常见行为分组到一个类中,并使用委派,而不是在每个

SystemX*
类中复制代码。有些语言提供了支持,这可能会帮助您避免对委派进行编码


HTH

如果一次只能有一种系统,则可能适用。PostEntity在系统上有何不同?换一下怎么样?雷,谢谢,我来看看这个。Bob,假设实体类有一个“mapData”方法,每个系统都应该实现这个特定系统和中心平台之间的映射。在我的例子中,大约80%的实体代码将由系统更改。非常感谢您的回答。对我担心班级爆炸,但似乎没有其他选择。按照你提到的方式使用抽象工厂,对我来说有意义,我想我会走这条路。关于trait,我使用的是PHP5.3,所以很遗憾我没有它,我担心我需要它。谢谢@user2023637如果答案对你有帮助,那么最好是升级投票或将其标记为已解决。谢谢Andres,我不知道我可以将其标记为已修复。不幸的是,我不能投票,因为我的分数不足15分。@user2023637当然,没问题!