程序代码和域驱动设计样式代码之间有什么区别?

时间:2012-08-10 17:08:42

标签: java oop domain-driven-design ooad

我正在通过领域驱动设计(DDD)技术,我觉得我还不太了解它。

DDD建议将业务逻辑(不是基础设施,如持久性,安全性等)放在域对象,持久性存储库,聚合器中,用于组装客户端的域对象(表示),服务是域对象之上的薄层,存储库,聚合器和充当事务边界。

让我这样说吧:

在DDD中,ViewController - > SomeService - > {Domain Objects,Repositories,Aggregators}

以我目前的(程序式)方法: ViewController - > SomeService - > DAO /存储库

此处,ViewController与一个或多个服务进行通信,以使用DAO从/向数据库提取/推送数据。如果任何仅对Domain对象的属性进行操作的业务逻辑将位于该Domain对象本身的方法中。最后,从服务获得的数据被聚合到DTO中,以便在View Layer中显示。

所以对我来说,这两种方法看起来几乎相似。

有人可以解释一下我缺少的东西吗?

P.S:我正在添加更多信息以更好地解释我的问题。 从理论上讲,每个人都在说DDD建议“逻辑应该在域对象中”。好。 让我们采取一个真实的场景。

在ShoppingCart应用程序中,某些用户下了订单。要处理订单,我需要执行以下所有子任务:

  1. 获取每件商品的详细信息并计算总订单价格。

  2. 获取递送地址并使用某些地址验证服务验证

  3. 验证/验证CreditCard详细信息

  4. 将所有订单相关信息保存到DB

  5. 因此,通过关注DDD,我将把逻辑

    1. Order Order对象中的总计算,它循环遍历List对象。

    2. 在地址对象中,我将使用validate()方法调用某些BING地址验证。

    3. 在CreditCard类中,我将使用authorize()方法调用某些CCAuthorizationService来授权使用某些第三方服务。

    4. 使用一些存储库将所有订单内容保存到数据库中。

    5. 调用Order.process()

      将触发所有这些步骤

      如果这是正确的DDD方法?如果是,我们的域对象直接与存储库交互,这似乎违反了关注点分离。

      如果DDD方法不正确,有人可以告诉我你如何设计上述用例?

4 个答案:

答案 0 :(得分:1)

归结为逻辑所处的位置。在DDD中,逻辑主要进入模型层,因此它保持在数据附近。在过程代码中,逻辑进入事务层,因此它与数据分离。福勒有一个很好的描述,你可以阅读here

答案 1 :(得分:1)

DDD与语言无关,它是通过专家了解域并构建一个可以与之讨论域的通用语言。所以它不能直接与功能,程序或面向对象的编程语言进行比较,因为它们不具有可比性。

View Controllers特定于MVC框架,并不特定于DDD。

在MVC中,用于为视图准备数据的DTO将是视图模型。

希望其中一些有用。

答案 2 :(得分:0)

他们 相似。

希望您实际上将“OOP”与“DDD”进行比较。 DDD是OOP(IMO)的子集,或者至少应该在OOPL中。 DDD是一种思考破坏责任的特定方式。

答案 3 :(得分:0)

这不是关于技术或OOP或类似的东西。 它专注于手头的领域,领域专家使用的语言,理解领域和建模领域,以便代码中存在重要的概念。

最初是使用OOP完成的,许多人声称它只能使用OOP完成。 然而,最近像Greg Young这样的人已经展示了如何在函数式语言中使用DDD,并且仍然将重点放在域名上。

程序代码倾向于忽略所有这些,只关注如何从任何数据源读取/写入数据。例如与Movex这样的系统集成将有十亿个表格和列,其中包含完全延迟的名称,如TAXEM.YAROOD FOOB.AAR,这对任何阅读该代码的人都毫无意义......