在阅读了如何构建UML类图并使用SOLID principles之后,我尝试整理了一个UML类图表,我很满意我正在进行的一个新的Symfony项目开始。
然而,我定义了接口 - 例如:
我不清楚它们是否应该如何实现为Symfony抽象实体。从我所读到的内容来看,似乎存在相互矛盾的观点:
Symfony Docs: How to Define Relationships with Abstract Classes and Interfaces ,但这似乎只适用于从其他包中访问抽象类时?
Questions such as this人们建议不要使用抽象类,而不是创造正常的'实体(即教授和学生) - 虽然不是这样,而忽视了SOLID的好处?
答案 0 :(得分:1)
您应该查看Doctrine文档的Inheritance Mapping部分...它允许您拥有一个抽象的“Person”类,然后扩展它以使其成为“学生”或“教师”你可以通过几种不同的方式解决这个问题...最简单的是SINGLE_TABLE
继承,它使用数据库中的“鉴别器”来了解它所属的实体类型。
答案 1 :(得分:1)
您的类似乎表示在表示应用程序的数据模型的UML类图中定义的普通(业务)对象类型。在您的示例中,考虑由根类Person
在数据模型中具有两个子类Professor
和Student
形成的类层次结构是很自然的。现在,当你必须在某个框架中实现这样的数据模型(具有类之间的子类和/或关系/关联)时,问题是如何定义相应的模型类(也称为"实体类"),答案取决于框架对这些概念的支持。
通常,当您必须在应用程序中处理类层次结构时,并且您的OO框架支持模型/实体类之间的继承/特化,那么主要问题是如何将类层次结构映射到一组表中基础SQL DBMS作为对象关系映射(ORM)的一部分。
在数据模型中,您不会使用接口,因为它们是OO编程概念,而不是数据语义概念。但是,在数据模型中,您可以将Person定义为抽象类,这意味着它没有任何直接实例,其唯一目的是定义子类继承的特性(属性,方法和约束)。顺便说一句,这个假设/决定意味着除了学生和教授之外,没有Person
的其他实例。
如果您的框架(例如, Symfony )不支持从抽象类继承,而是支持某种形式的接口,那么您可以使用接口来获取类似于仅定义抽象方法的抽象类。接口Person
将为firstname
和lastName
定义getter / setter。
由于在很多情况下,以及在您的简单示例的情况下,给定的类层次结构非常简单,因此最好消除子级关系并将数据模型的概念类层次结构简化为平面使用class hierarchy merge design pattern的一组类。这避免了定义接口和维护它们与实现它们的类之间的关系所带来的所有开销。它等同于将类层次结构保留在模型/实体类中并使用单表继承ORM模式。