为域实体使用接口的目的是什么?
在我们的项目中,我们使用域实体的接口。在接口内部,只有 getter 和 setter 方法,甚至没有任何领域逻辑。
为这样的实体使用接口有用吗?这是好习惯吗?
谢谢。
有时它是一个好主意的原因有很多,但这实际上取决于项目的范围。
首先:您的陈述“......甚至没有任何领域逻辑。” 没有意义,接口中不能有任何逻辑,接口不能有任何逻辑,只有方法签名。
这样做的主要原因是为了支持不同用途的域对象的多种实现。
您可能希望将域对象编码为接口的原因:
序列化 - 有时您想要创建域对象的可序列化版本,但不想将该代码与您用于核心应用程序的代码混合在一起。例如,您可能有一个 Person 对象的实现,您只是使用它来为您的 webapp 序列化为 JSON。
共享 API - 您可能希望分发具有不同对象实现的代码的公共 API 版本,或者您甚至可能只想将接口提供给另一个组(或客户端或供应商)
支持遗留实现 - 也许您在旧数据库中有一些数据,您需要为此构建一个连接器,这涉及到您的域对象的不同实现以提取数据。
测试 - 为您的核心类提供接口使单元测试变得更加容易,因为您可以快速排除测试不需要的方法。
当您访问数据对象的公共实例字段时,您已经在“按合同编程”——这就是您从 bean 获得的所有合同。访问器层什么也没增加,更不用说另一层接口了。Java Beans 承认了这样一个事实,即很多数据就是这样——数据——并且将其封装在合约后面只会损害它的实用性。FP,可能是现存最好的编程范式,正确地理解了这一点。
有人可能会问(实际上是@pst :),如果不同的实体实现不同的序列化策略会怎样?如果他们在内部以不同的方式存储数据怎么办?也许一个人是超级聪明的,并且出于“性能”的原因做了很多位玩弄。
是的,我们当然可以想象一些实际需要这样做的场景,但它反过来:首先你意识到你将做这样一个项目,然后你围绕 bean 引入接口。你不会提前做,因为“也许,只是也许,这个疯狂的需求会出现在我们项目的中间”。实践清楚地表明,这几乎不会发生。
另外,不要忘记构造函数在这样的设计中是不可能的。强制执行一个项目范围的策略来为每一个领域数据编写抽象工厂——并且没有明确的原因——绝对不是人们可以称之为合理的设计选择。
我见过一些开发人员将“代码到接口”的建议走得太远了。他们认为他们应该始终使用界面,以防万一有一天它会派上用场。