实体与用例的澄清

10
据我所了解,用例交互器使用实体执行某些操作,而实体则包含我们的业务规则
根据这个定义:

用例与实体进行交互并依赖于它们。

用例如何依赖于实体?它们之间有什么关系?
例如,假设我们有一个银行应用程序,包括三个功能:登录、查看余额和转账。
因此,为了能够转账,用户必须已登录并且应该有足够的余额。
我猜这里的用例是转账,上面的语句是业务规则,如果是这样,如何实施呢?
有很多类比,但是合适的实现很少。
1个回答

11

我想分享我的理解。

  1. Entity (实体)仅依赖于其他实体(可能), 它保存数据 (状态) 和逻辑,可重复使用于各种应用。我也将实体视为普通的POJO(但它与数据访问层返回的内容不同)
  2. Use cases (用例)与实体进行交互 (因此依赖于它们), 并保持具体应用的逻辑(通常通过各种存储库或数据访问层网关来执行该逻辑)

对于你指定的示例:

  1. 实体:
    • User(保存用户名, 经过哈希和盐处理的密码; 类似验证用户名、哈希明文密码等逻辑)
    • Balance(保存用户依赖, 金额, 限额,类似校验给定转移金额是否OK等逻辑)
  2. 用例:
    • 认证(Authenticate) - 基于用户名/密码输入,验证并从后端检索用户实体(通常使用某种存储库或网关),连同一些令牌,如果成功则缓存,否则报告任何错误。
    • 查看余额(View Balance) - 基于用户实体输入,从后端检索余额实体(同上述方法),如果出现问题,则报告任何错误。
    • 转移资金(Transfer Funds) - 基于用户实体和金额输入,检索余额实体,验证是否允许转移,如果是则执行,否则报告错误

2
我仍然感到困惑,因为我没有看到任何适当的实现。你提到用户实体包含用户名、哈希等,但我们从哪里传递所有这些凭据呢? - eddy
从用例中,UseCase 是关于实体何时以及如何执行的。 想象一下,实体是如此基础,以至于它不包含条件语句。 该实体仅转移资金,但 UseCase 检查用户是否可以转移资金。 - Daniel
@Daniel,如果用例层中的条件检查在实体执行之间变得陈旧,会发生什么情况?因为在这段时间内数据库完全可能已经被修改了?将逻辑放在实体接口中,以便DB实现运行查询时更接近数据库来运行检查,是否违反了清洁架构?例如:createUser:如果未找到电子邮件/用户名,则插入。 - cozycoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接