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

时间:2018-11-09 03:56:50

标签: java design-patterns language-agnostic

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

public class Egg {
    ...
}

public class BirdNest {

    private List<Egg> eggs;

    ...
}

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

要对这些类执行持久性/检索性操作,我还具有一个BirdNestService和一个EggService

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

我可以使用类似List<Egg> getEggs (int birdNestId);

的方法

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

它是基于特定的鸟巢执行操作的,因此您可以认为它应该是BirdNestService的一部分。

然后您又可以说它正在检索的项目是Egg,因此它应该属于EggService

6 个答案:

答案 0 :(得分:9)

如果将其放入using System.Windows; using Microsoft.Office.Interop.Word; using Application = Microsoft.Office.Interop.Word.Application; public class MainWindowViewModel : BaseViewModel { ... ... some view model initialization ... public bool AreControlsEnabled { get; set; } = true; private void OpenWord () { AreControlsEnabled = false; var app = new Application() { Visible = true }; var doc = app.Documents.Open("pathtofile.docx"); var docClass = app.ActiveDocument as DocumentClass; docClass.DocumentEvents2_Event_Close += DocClass_DocumentEvents2_Event_Close; docClass.DocumentEvents_Event_Close += DocClass_DocumentEvents_Event_Close; app.DocumentBeforeClose += new ApplicationEvents4_DocumentBeforeCloseEventHandler(DocBeforeClose); app.DocumentBeforeSave += new ApplicationEvents4_DocumentBeforeSaveEventHandler(DocBeforeSave); } private void DocClass_DocumentEvents2_Event_Close () { MessageBox.Show("DocClass_DocumentEvents2_Event_Close"); AreControlsEnabled = true; } private void DocClass_DocumentEvents_Event_Close () { MessageBox.Show("DocClass_DocumentEvents_Event_Close"); AreControlsEnabled = true; } private void DocBeforeClose (Document doc, ref bool cancel) { MessageBox.Show("DocBeforeClose"); AreControlsEnabled = true; } private void DocBeforeSave (Document doc, ref bool SaveAsUI, ref bool cancel) { MessageBox.Show("DocBeforeSave"); AreControlsEnabled = true; } } ,则此服务会知道您不需要的EggService概念(BirdNest)。

答案是birdNestId

答案 1 :(得分:0)

我认为它是BirdNestService的一部分,因为Egg只是一个实体,并不依赖Nest。但是Nest包含鸡蛋,否则Nest没有鸡蛋就没有用。巢取决于鸡蛋,但鸡蛋并不取决于巢。我认为Nest必须掌握他所拥有的鸡蛋的信息,并且已经包含了您在课堂上所描述的鸡蛋清单,并且除非您有一个非常复杂的场景要查找,否则鸡蛋不需要记住它们的Nest ID。根据其卵或某些特定要求嵌套ID。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我想应该是EggService。

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

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

答案 4 :(得分:0)

列表getEggs(int birdNestId)方法要求包含在特定巢中的卵。我的想法:

  • 从概念上讲,鸟巢存储着鸡蛋的手柄(id)。从数据库角度来看,外键指向鸡蛋表。实际的鸡蛋存储在鸡蛋表中。
  • 因此,向BirdNestService索要巢中的卵更有意义,该卵可以进行一些验证(例如是否为有效的巢id),然后检索卵的句柄。
  • 然后可以咨询EggService给出与ID列表匹配的鸡蛋列表。

因此,我希望在BirdNestService中使用List getEggs(int birdNestId)方法,并在EggService中添加如下方法: 列出getEggs(列出eggIds)。

但同样,没有正确或错误的答案。这取决于使您的设计干净,连贯和可维护的原因。

答案 5 :(得分:0)

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

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

经验法则:没关系,只要它是属性即可。

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

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

您应该使用哪个?根据经验,请使用自上而下的方法:在需要孩子时始终选择父母