我考虑在项目中实施Robert Martin的Clean Architecture,并试图找出如何处理非平凡的用例。
我发现将架构扩展到复杂/组合用例尤其是系统作为演员而不是用户的情况(例如系统执行某种批处理)很困难。
为了说明问题,让我们假设一个像“系统更新所有帐户余额”的用例,并以伪代码实现。
此外,“获取所有账户列表”、“获取某个账户的所有新交易记录”、“对交易执行特定计算”、“更新账户余额”都是各自有效的用例,并且每个用例已经在其自己的交互类中实现。
一些问题出现了:
我发现将架构扩展到复杂/组合用例尤其是系统作为演员而不是用户的情况(例如系统执行某种批处理)很困难。
为了说明问题,让我们假设一个像“系统更新所有帐户余额”的用例,并以伪代码实现。
class UpdateAllAccountBalancesInteraction {
function Execute() {
Get a list of all accounts
For each account
Get a list of all new transactions for account
For each transaction
Perform some specific calculation on the transaction
Update account balance
}
}
此外,“获取所有账户列表”、“获取某个账户的所有新交易记录”、“对交易执行特定计算”、“更新账户余额”都是各自有效的用例,并且每个用例已经在其自己的交互类中实现。
一些问题出现了:
- “系统更新所有账户余额”的用例是否有效,或者应该将其拆分为更小的用例(尽管从业务角度来看似乎有意义,但它是一个合法的业务场景)?
- UpdateAllAccountBalancesInteraction是一个合法的交互吗?
- 一个交互是否允许/应该编排其他交互?
- 编排其他交互的代码是否真的属于其他地方?
- 只将UpdateAllAccountBalancesInteraction作为一个交互,而将其调用其他交互共享的函数,而不是作为其他交互的编排者,这样做是否可以接受?
Execute()
方法不应该调用另一个交互的Execute()
方法,但它们可以在同一层中共享代码。 - PlusInfinite