Domain driven design 在没有其他选择的情况下,如何充分利用贫血领域模型

Domain driven design 在没有其他选择的情况下,如何充分利用贫血领域模型,domain-driven-design,anemic-domain-model,Domain Driven Design,Anemic Domain Model,因此,在我的第一家公司工作了10年后,我开始了我的第二份开发工作,但我并不觉得自己获得了高级开发人员的头衔。这是java开发,但我们使用的是一个贫乏的领域模型,在我看来,这个应用程序是一个非常难以测试的烂摊子。不幸的是,我现在使用的代码库是完全相同的,我最近接受了另一次采访,采访者将他们的Hibernate模型描述为重量轻,并且只包含setters-getter。因此,这在整个行业中似乎非常普遍 有很多文章将贫血域模型描述为一种反模式,也有一些文章将其描述为对于简单系统来说非常好。但是,我还没有

因此,在我的第一家公司工作了10年后,我开始了我的第二份开发工作,但我并不觉得自己获得了高级开发人员的头衔。这是java开发,但我们使用的是一个贫乏的领域模型,在我看来,这个应用程序是一个非常难以测试的烂摊子。不幸的是,我现在使用的代码库是完全相同的,我最近接受了另一次采访,采访者将他们的Hibernate模型描述为重量轻,并且只包含setters-getter。因此,这在整个行业中似乎非常普遍

有很多文章将贫血域模型描述为一种反模式,也有一些文章将其描述为对于简单系统来说非常好。但是,我还没有看到任何例子能够充分利用使用ADM的大型企业系统

有人有过这样的经历吗?对于创建一个松散耦合的系统,其中包含可读且实际有价值的单元测试,是否有任何最佳实践?我真的很想为我的工作感到骄傲,但我正在失去希望

编辑: 对于提倡将业务逻辑包含在服务中的开发人员:

如何限制每个服务中对其他服务的依赖关系?i、 e.OrderCancelService需要CustomerAccountService和PaymentService以及ReturnCalculatorService和RewardsAdjustmentService等。这往往会导致测试中出现多个模拟对象,从而使测试与实现紧密相连

如何限制每个服务方法中的参数数量?由于所有内容都需要传递,并且对象不能对自己的数据进行操作,这似乎会导致非常大和混乱的方法签名

您是否将告诉、不问原则应用于服务对象?我看到许多服务返回值,然后调用服务使用这些值在执行流中做出决策


你可以考虑你的持久性模型,你现在认为它是贫血的域模型,它是什么——你的域模型状态的持久性模型。


如果这样做,您可能可以创建一个真正的域模型,它的状态将存储在持久性模型对象状态模式中。然后,您可以在这个新的域模型中使用您的逻辑。阅读上面的评论,我想说,您可以将管理器/服务类转换为状态机,如果它们与事务边界匹配,您可以将它们称为聚合,并像现在一样由Hibernate保持它们在POJO中的状态。

可以肯定的是,您指的是针对复杂问题域的贫血模型,而不是针对简单问题域的贫血模型,简陋的一号,对吧?@guillaume31是的,这就是我正在努力解决的问题。由多个不同的用户交互触发的多个不同工作流,每个工作流根据多个实体中的多个属性做出决策,并且每个工作流还更新多个属性。这似乎导致了大型服务/实用程序/管理器类的激增。因此,鉴于我无法将逻辑转移到实体中,我们如何尽最大努力应用可靠的原则和敏捷开发所强调的TDD。欢迎来到这个行业。事实上,要加入一个正确应用DDD和TDD的团队,或者加入一个可以改变东西的公司,是非常困难的。我所能说的是,你应该在接受面试时自己去想清楚这一切。即使戴上一顶建筑师帽,也可能很难,这取决于公司文化,所以只要继续寻找,不要放弃!参加ddd课程,尝试亲自参与社区并建立联系:如果这是一个行业,是什么让高级开发人员成为高级开发人员?如果不是他有能力实施一个干净灵活的系统。这纯粹是对不同技术的了解吗?我认为很难说服团队将我们的JPA实体隐藏在具有相同名称的java类中。我想知道这些无状态服务是否有最佳实践,它们往往围绕着每个实体,即OrderService,使用cancel、addOrderLines等方法。对于提倡将逻辑放在服务层的开发人员来说,是否有任何最佳实践,例如在这些服务上没有getter方法,以及限制长参数列表的方法,以便使单元测试和模拟变得更干净?