检索嵌套对象列表的方法属于哪个服务 class?

Which service class do methods retrieving lists of nested objects belong to?

这适用于任何语言,但我为此使用 Java 所以...

public class Egg {
    ...
}

public class BirdNest {

    private List<Egg> eggs;

    ...
}

我也有匹配这些 类 的数据库实体。基本上,BirdNestEgg 有 1:M 关系。

要对这些 类 执行 persistence/retrieval 操作,我还有一个 BirdNestService 和一个 EggService

假设我想从给定的鸟巢中检索鸡蛋列表。

我可以有一个像 List<Egg> getEggs (int birdNestId);

这样的方法

我的问题是,这样的方法应该属于哪个服务?

它根据特定的鸟巢执行操作,因此您可以说它应该是 BirdNestService 的一部分。

然后你又可以争辩说它正在检索的项目是 Egg 的,所以它应该属于 EggService

我认为它是 BirdNestService 的一部分,因为 Egg 只是一个实体,它不依赖于 Nest。但是 Nest 包含 Eggs,否则没有 Eggs Nest 是无用的。 Nest 依赖于 Eggs 但 eggs 不依赖于 Nest。在我看来,Nest 必须有关于他拥有哪些鸡蛋的信息,并且它已经包含了您在 class 中描述的鸡蛋列表,并且 eggs 不需要记住它们的 Nest Id,除非您有一个非常复杂的场景你想通过他们的 Eggs 或一些特定的要求找到 nest Id。

如果您将其放入 EggService,则该服务知道 BirdNest 概念 (birdNestId),这不是您想要的。

所以答案是BirdNestService

BirdNestService 不需要像 List<Egg> getEggs (int birdNestId); 这样的方法。
如果你想从给定的燕窝中取出鸡蛋,那么应该很简单:List<Egg> myEggs = myBirdNest.getEggs()
BirdNestService 应该有你想在鸟巢上使用的操作(方法),例如BirdNest buildBirdNest(int amountStems, Bird byBird).

我会说应该是EggService。

原因是目前您的查询只需要 Eggs by Birds Nest,但情况可能并非总是如此。明天您可能需要根据某些特征(例如大小、颜色等)寻找鸡蛋...

因此我会选择 EggService,因为毕竟您要尝试识别具有特定特征的鸡蛋 - 在这种情况下属于特定燕窝。

List getEggs (int birdNestId) 方法正在询问特定鸟巢中包含的鸟蛋。我的想法:

  • 从概念上讲,鸟巢存储鸡蛋的句柄 (id)。从数据库的角度来看,egg table 的外键。实际的鸡蛋存储在 egg table.
  • 因此,向 BirdNestService 询问鸟巢的蛋更有意义,它可以进行一些验证,例如它是否是有效的鸟巢 ID,然后检索蛋的句柄。
  • 然后它可以咨询 EggService 以提供与 id 列表匹配的鸡蛋列表。

因此,我更愿意在 BirdNestService 中使用 List getEggs (int birdNestId) 方法方法,并将在 EggService 中添加这样的方法: 列出 getEggs(列出 eggIds).

但同样,没有正确或错误的答案。这将取决于是什么让您的设计简洁、连贯和可维护。

您检索了实体的属性,因此它是嵌套的一部分。没有脑子。

现在,如果您有属性 birdnestid 并且您通过该属性过滤了您的鸡蛋数据库,它将成为鸡蛋实体的一部分,因此您可以将其放入鸡蛋服务中。

经验法则:只要是属性就可以。

通过这种方式,您可以在两种不同的服务中同时使用这两种方法。

这也适用于多层属性:这取决于您用作基础的实体

你应该使用哪个?根据经验,使用从上到下的方法:当你需要 child

时总是选择 parent