如何避免执行错误的域概念

问题描述 投票:0回答:1

我们的应用程序中包含以下概念(由UI和REST后端组成):

ContainerlineItems的父母

如果没有有效的lineItem就无法创建Container,并且这两个实体都通过spring数据保存在DB中。

UI在两页中列出了lineItems

  • 列表视图:显示单个lineItemContainers
  • 搜索页面:显示不同lineItems的Containers

我们为这两个UI页面提供了单一的数据源。数据来自一个通用的REST后端,它返回一个包含在POJOview对象中的lineItems列表(以及其他信息) - 当前状态。

需要更改 - 在搜索页面上,现在,我们需要显示来自ContainerlineItem的一些信息。所以,现在我们需要在搜索页面上提供与Container相关的lineItem的数据。我们目前正在讨论两种可能的方法:

方法1:POJOview { List<LineItem> List<Container> }

  • 该方法避免了在方法2中实现的错误概念(下面描述)的实现。
  • List<LineItem>List<Container>是单独发送的,因此,更少的数据被传输到UI。如果发送属于1个lineItem的20个Containers,那么Container中只有一个对象与方法2中的20个Container对象相比。
  • 代码更易于理解和维护
  • 缺点是它需要一些额外的逻辑在UI的搜索页面中将lineItem映射到其他列表中的Container

方法2:POJOview { List<LineItem> //insert Container of a lineItem as a member variable in the lineItem itself. Container instance is annotated with @Transient to avoid persistence in DB. }

  • 这种方法在后端实现了一个错误的概念,因为lineItem现在包含与域概念相反的ContainerContainerlineItems的父亲),因此它不直观并且使代码难以理解和保持。
  • 每个lineItem现在包含Container,所以,如果我们在属于同一个lineItem的页面上有20个Containers,那么Container数据现在是lineItem的一部分被加载20次(性能命中)
  • 这具有快速修复的优点

问题在于,尽管存在所有这些事实,我的同事仍然认为方法2是最佳方式,因为它是一个快速解决方案,并且他认为没有任何错误。我在这里错过了什么吗?

software-design
1个回答
0
投票

根据我的观点,实施的一个好方法如下:

REST服务可以按以下格式返回数据:

a)LineItem对象列表,其中每个LineItem对象只包含其容器的ID(注意:它不是一个错误的方法,因为只要父数据不重复,子对象就可以很好地包含对其父对象的引用)每个孩子)。 b)容器对象列表。显然,只应返回行项引用的那些容器。

前端逻辑可以遍历订单项列表,并在容器列表中查找容器详细信息。

数据项a)和b)可以通过单独的呼叫或单个呼叫发送。理想情况下,如果要严格遵循REST原则并使两个调用不影响性能,则应进行两次单独调用,因此根据REST原则,LineItem资源在一次调用中检索,而Container资源在另一次调用中检索。

通过使用这种方法,不重复容器信息,在行项目对象中仅重复容器ID,在大多数情况下这应该是可以的。

因此,除了lineitems可以包含其父项(容器)的ID之外,这种方法基本上与您描述的方法1)类似。

根据我的理解,问题中提到的方法2重复每个lineitem对象的完整容器信息,这绝对是错误的。无论是从DB检索数据还是在后端传递数据或者将数据发送到前端,都可以重复ID而不是完整对象。

希望这提供了一些清晰度。

© www.soinside.com 2019 - 2024. All rights reserved.