如何避免实施错误的域概念

时间:2019-03-26 12:10:25

标签: software-design

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

ContainerlineItem的父母

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

用户界面在两页中列出了lineItem

  • 列表视图:显示单个lineItem的{​​{1}}

  • 搜索页面:显示Container个不同的lineItem

这两个UI页面都有一个数据源。数据来自公共REST后端,该后端返回包装在POJOview对象中的Container列表(以及其他信息)-当前状态。

需要更改-现在,在搜索页面上,我们需要显示lineItemContainer的一些信息。因此,现在我们需要在搜索页面上提供与lineItem关联的Container的数据。我们目前正在讨论两种可行的方法:

方法1: lineItem

  • 此方法避免了方法2中实现的错误概念(如下所述)的实现。
  • POJOview { List<LineItem> List<Container> }List<LineItem>分别发送,因此较少的数据被传输到UI。如果发送了20个属于1 List<Container>的{​​{1}},则与方法2中的lineItem的20个对象相比,Container仅有一个对象。
  • 代码更易于理解和维护
  • 一个缺点是,UI需要在搜索页面中添加一些逻辑,才能将Container映射到其他列表中的Container

方法2: lineItem

  • 这种方法在后端实现了一个错误的概念,即Container现在包含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是{ {1}} s,因此它不直观,并且使代码难以理解和维护。
  • 每个Container现在包含Container,因此,如果页面上有20个lineItem属于同一lineItem,则Container数据现在lineItem的一部分被加载了20次(性能受到影响)
  • 这具有快速修复的优点

问题是,尽管有所有这些事实,我的同事仍然认为方法2是最佳方法,因为它是一种快速修复方法,并且他认为其中没有错误。我在这里想念东西吗?

1 个答案:

答案 0 :(得分:0)

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

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

a)LineItem对象的列表,其中每个LineItem对象仅包含其容器的ID(注意:这不是错误的方法,因为只要父数据是子对象,子对象就可以很好地包含对其父对象的引用不会在每个孩子中重复)。

b)容器对象列表。显然,仅应返回订单项引用的那些容器。

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

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

通过这种方法,容器信息不会重复,仅在订单项对象中重复容器ID,这在大多数情况下是可以的。

因此,此方法与您所描述的方法1)基本相似,不同之处在于,行项目可以包含其父代(容器)的ID。

据我了解,问题中提到的方法2重复了每个lineitem对象的完整容器信息,这肯定是错误的。无论是从数据库中检索数据还是在后端传递数据,还是将其发送到前端,都可以重复ID,但不能重复完整对象。

希望这可以提供一些清晰度。