gpt4 book ai didi

java - spring服务层的一些方法如何分解

转载 作者:行者123 更新时间:2023-11-30 09:41:56 26 4
gpt4 key购买 nike

我正在对一个多层 spring 3.0 项目进行一些维护/改进。客户端是一个重型 RCP 应用程序,它从基于 RMI 的服务器上的服务层(管理器)调用一些 spring beans 方法。我在管理器中有几个巨大的方法,其中一些方法超过 250 行。这是一个示例:(为清楚起见,我省略了代码)

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public Declaration saveOrUpdateOrDelete(Declaration decla, List<Declaration> toDeleteList ...){

if (decla.isNew()){

// create from scratch and apply business rules for a creation

manager1.compute(decla);
dao1.save(decla);
...

}else if (decla.isCopy() {

// Copy from an other Declaration and apply business rules for a copy
...

}else {

// update Declaration
...
}
if (toDeleteList!=null){

// Delete declarations and apply business rules for a mass delete
...
}

前 3 个分支是互斥的,代表一个工作单元。最后一个分支(删除)可以与其他分支同时发生。

为了清晰和可维护性,将此方法划分为更“CRUDy”的东西不是更好吗?我一直在考虑将这个庞然大物划分为其他管理器方法,例如:

public Declaration create(Declaration decla ...){...

public Declaration update(Declaration decla ...){...

public Declaration copyFrom(Declaration decla ...){...

public void delete(List<Declaration> declaList ...){...

但我的同事说这会将复杂性和业务规则转移给客户,我将失去原子性的好处等。谁在这儿?

最佳答案

无论如何,updateOrCreateOrWhatever 真正做的决定是在客户端中做出的,因为它必须在 Declaration 对象中设置相应的字段。

客户端同样可以调用适当的方法。

这样的代码绝对更易于管理和测试(需要关心的分支更少)。

维护它的唯一理由是@Pangea 提到的网络往返。我认为这可以由自定义调度程序类来处理。 IMO 它不构成业务逻辑的一部分,因此不应在服务层中处理。

要考虑的另一件事是交易逻辑。创建/更新和删除是否必须在同一个事务中发生? declatoDelete 不能同时为 null 吗?

关于java - spring服务层的一些方法如何分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com