架构:操纵模型而不污染POJO的最佳实践?并且无需在任何地方重复锅炉板代码

gMa*_*ale 12 java architecture design-patterns software-design

这是我们经常遇到的问题.必须有一些最佳实践来解决这个问题......

简化问题

放置操作POJO的通用代码的最佳位置在哪里?

这样:

  • POJO只有属性和getter/setter
  • 相同的模型操作代码不会重复"无处不在"
  • 这是清楚哪些类是负责操纵模型

背景

我们有一个定义我们域的模式.从那时起,我们生成一个"纯"模型,它由来自JAXB的简单对象(PO​​JO)组成.

在使用此模型时,团队中的几位开发人员已创建了用于访问和操作模型的样板代码.它在许多地方"撒了".有些人创建了包装器对象,它们继承了模型的实例并添加了功能.其他人创建了外部实用程序类.我正在寻求统一这个代码,以便它不再"洒在各处". 理想情况下,逻辑可以包含在某类对象中,这些对象明确负责模型的通用操作.

我们使用杂货店作为一般例子.模型对象包括以下内容:
Products, Aisle, Shelf, Employee, WorkSchedule, Vendor

常见的模型操作包括以下内容:
findManagerWorkingOnDay(day, schedule), findAisleForProduct(apples), countItemsOnShelf(topShelf), product.isModified(), removeProductFromVendor(apples, vendor)

我们不希望用类似的功能"污染"我们的供应商POJO removeProductFromVendor.同样,我们不一定要扩展每个模型对象,只是添加isModified属性,这样我们的GUI就可以知道"启用/禁用"保存按钮.

或者我们呢?

摘要

一旦模型对象在内存中,谁应该负责操纵它 - 例如,迭代一个"今天值班的员工"列表,并找到一个谁是"经理?"

在这些情况下,数据库调用过度,因为我们已经在内存中拥有了所需的一切(例如:我们已经查询过DataStore,我们需要在整个应用程序中使用结果对象). 理想情况下,此代码可供具有(例如)员工列表的任何对象使用.


在最佳实践方面,放置静态方法的理想位置在哪里:
public static Employee findManager(List<Employee> employeesOnDuty);

这将迭代员工列表(POJO)并返回第一个在哪里 employee.title.toLowerCase().contains("manager")

如果一个团队使用这个样本对象模型,几个人会编写这样的函数.有哪些最佳实践可以捕捉到这一责任,使POJO保持"纯粹",并且相同的锅炉板代码不会"洒在任何地方".

CPe*_*ins 6

鉴于您的POJO对象来自供应商,我理解您不愿意为它们添加功能,并且您显然不希望代码随机散布在您的项目周围.

对于一组装饰器子类或者肯建议的外墙来说,听起来像是一份工作.

我喜欢这里的装饰器,因为你只需要通过装饰器类的名称来引用你的供应商pojo,然后在一个地方添加行为(isModified,searchByName等).


Ken*_*ain 5

据我所知,听起来你的POJO模型只是数据(或者你想保持这种方式).为什么不创建门面对象,如Query,Count或其他命名的功能分组,隐藏你的所有操作算法相关的力学?

它不会污染 POJO,这听起来像你想要避免的.