繁体   English   中英

多态和树结构

[英]Polymorphism and tree structre

在问了以下问题之后: rest api和多态性

我想知道我的整个数据库架构和类结构是否错误。 当前的结构是:

  • 个人基本摘要类别包含姓名和年龄
  • 儿童扩展人员包含最喜欢的电视节目
  • 家长扩展人员包含孩子列表
  • GRANDPARENT EXTENDS PERSON包含父母列表

在db中,表中为每个子类型组织的表

我想到了可能重构类,因为子类没有添加任何有价值的字段,除了为此添加的孩子/父母列表之外,只有一个包含所有字段的类:

 @Entity
 class Person{
  @ManyToOne 
  private Person parent;   //parent==null is a grandparent

  @OneToMany
  private List<Person> children;
}

但是,这样做的问题是,在我的业务逻辑中,父母子女和祖父母的确有不同的行为,因此更难以区分父母子女不能是祖父母。

另一个问题是,例如我坚持使用当前的类结构
分离类并没有真正帮助我,因为我正在使用服务层
而且我无法确定我需要哪个服务类,例如:

class PeopleController extends Controller { 
    public Result savePerson() {
      Person p = objectMapper.readValue.. // deseralizes to correct subtype
      // saving logic is different for each subtype, hence I need to 
      // find correct repository for this subtype but I don't want to use 
      // instance of or switch case, but to use polymorphism, but can't think 

一种不执行我不想要的活动记录的方法}}

类型的确定可以完全根据状态来确定,并且不需要使用多态性,因为您的问题首先没有提供使用它的任何实际依据。 您定义为收集的属性对于所有Person似乎都是合理的。

  1. Parent是包含非空子集的任何人。
  2. 所有Person实例都构成一个Child ,但是对于本练习,这可能意味着任何包含空子集的人。
  3. 一个GrandParent是任何人这是一个Parent ,还要求它在儿童组实例中的至少一个是Parent

考虑到这一点,我们可以考虑如下重组数据模型。

@Entity
public class Person {
  @Id
  @GeneratedValue
  private Integer id;
  private String name;
  private Integer age;
  // any person can have this, not just children imo :)
  private String favoriteShow;

  @OneToMany(mappedBy = "parent")
  private Set<Person> children;

  @ManyToOne
  private Person parent;

  @Transient
  public boolean isChild() {
    return children == null || children.isEmpty();
  }

  @Transient
  public boolean isParent() {
    return !isChild();
  }

  @Transient
  public boolean isGrandParent() {
    return isParent() 
         && children.stream().filter( Person::isParent ).count() > 0;
  }
}

即使采用这种方法,您的逻辑也可以基于布尔瞬态方法检查进行分支。 当然,有很多方法可以优化这些方法,但是我不会太担心,因为这些检查已经在JDK8上进行了优化。

不过,这样做的好处是,您可以简单地让控制器与之交互的Person服务,并且很有可能是Person存储库,因为数据是一种类型。

我知道您的保存逻辑因类型而异,但是我的问题是它真的必须有所不同吗? 也许需要对这些原因进行分解的更深入的推理可以为我们提供更多的背景信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM