【问题标题】:Is there good usecases of crossreferenced classes in OOP ? (A class referencing B, B referencing A)OOP 中是否有很好的交叉引用类用例? (A类引用B,B引用A)
【发布时间】:2019-11-14 11:20:05
【问题描述】:

我正在用 Java 做一个个人项目,我想做一个真正“干净”的代码和类设计。

我问自己这种设计在这种情况下是否可以:

public class Team {
  private String teamName;
  private List<Employee> team;
}

public class Employee {
  private String name;
  private Team parent;
}

我做这个设计是因为我可以通过 Team 对象直接检索给定团队的所有员工,也可以直接获取给定员工的链接团队。但我发现的缺点是它会创建不连贯的引用。

是否有任何“更清洁的方式”来实现这一目标? 每当我遇到这种问题时,我应该问什么问题?

我知道这是一个非常笼统的问题,但我没有关于 OOP 中实体关系的方法。

感谢您的帮助,

【问题讨论】:

标签: java oop design-patterns


【解决方案1】:

是否有任何“更清洁的方式”来实现这一目标?

示例 1:

常见做法 - 只有 Team 知道它拥有哪些员工。

public class Team {
  private String teamName;
  private List<Employee> employees;
}

public class Employee {
  private String name;
}

示例 2:

TeamEmployee 完全分开,并创建一个新类来处理它们之间的关系。这样一来,只有一个真实的地方,如果您愿意,您可以将一名员工分配给多个团队。

public class Team {
  private String teamName;
}

public class Employee {
  private String name;
}

public class Membership {
  private Team team;
  private List<Employee> employees;
}

【讨论】:

  • @LostReality,您已接受此答案,但正如您在问题中解释的那样,它不能满足您“直接获取给定员工的关联团队”的需求。此外,你给这个问题的标题似乎是在问是否有任何好的用例来交叉引用类。这个答案并没有明确地对那个问题说“是”或“不是”。最后,您问“每当我遇到这种问题时,我应该问什么问题?”,但您没有得到答案。你对这个答案真的满意吗?
【解决方案2】:

您对此感到不舒服是对的。第一个问题是您是否需要双向参考?一个团队有很多员工,但一个员工只能在一个团队中。这是正确的,还是可以多对多的关联?由于这个关联变得相当复杂,我倾向于为它创建一个单独的类,可能称为TeamMemberhip。这是 OOP 中的典型实践——当某些事情变得复杂时,尝试将这种复杂性单独分离到一个类中。例如,在 GoF Design Patterns 一书中,当观察者-主题关联变为多对多时,这是推荐的方法。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多