gpt4 book ai didi

java - 单一职责原则和服务/存储库设计

转载 作者:行者123 更新时间:2023-12-01 10:44:10 26 4
gpt4 key购买 nike

我想知道如何在以下示例中最好地分离责任。

有一个 Foo 对象,它有一些 id 和一些 reallySecretImportantData 字段。 Id 是一个用于引用对象的简单标识符,而 reallySecretImportantData 是应该在数据库中加密的数据,因为数据库是此示例中唯一的漏洞点。

现在,如果我们有一个带有方法 void storeFoo(Foo foo)Foo readFoo(Id id)FooService

我们还有一个 FooRepository,它具有标准 CRUD 方法,用于在数据库中存储 Foo 对象。

现在,由于我想将reallySecretImportantData保存为加密状态,因此我必须在某处加密并在某处解密。

由于 FooRepository 的职责不应包括加密操作,因此逻辑位置是 FooService

现在,如果我在某些开发环境中,出于开发和测试的目的,我希望将 reallySecretImportantData 以纯文本格式保存。

如果我使用某种 DI,我可以编写我的服务的 2 种实现,一种用于产品,另一种用于开发/测试,并且只需配置 DI 以在生产环境中使用产品,在开发和测试环境中使用开发/测试。

现在,如果在不久的将来出现更改 reallySecretImportantData 存储方式的请求,我可以简单地编写该服务的另一个实现并使用我的 DI 框架来注入(inject)它。

这个简单的设计对于当前的模型案例来说是否足够好?

最佳答案

你的设计让我想起了strategy pattern. FooService 可以被视为一个策略接口(interface)。

但我更喜欢向此接口(interface)添加 encrypt()decrypt() 方法,而不是 store()read ()。我们可以将其命名为 FooCryptoStrategy

此外,FooRepository可以用FooCryptoStrategy对象来构造。因此,您可以 CRUD Foo 对象而不考虑加密问题。您可以创建多个 FooCryptoStrategy 实现来进行发布和测试。甚至您也可以实现 NonCryptoStrategy

总之,使用策略模式,我们可以将一项职责分配给一个类:
Foo:存储数据
FooCryptoStrategy:加密和解密Foo对象
FooRepository:使 Foo 对象持久化。
Controller 类:创建具体的 FooCryptoStrategyFooRepository 对象。

关于java - 单一职责原则和服务/存储库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34286681/

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