【问题标题】:Why is it recommended to avoid java-bean style be used to create domain objects?为什么建议避免使用 java-bean 样式创建域对象?
【发布时间】:2014-08-07 20:47:49
【问题描述】:

我一直在阅读和思考域对象的创建方式。

具体来说,从这篇阅读中:

Avoid JavaBeans style of construction

我同意作者的大部分推理。

但是,如果没有设置器,您最终可能会得到如下代码:

Book book = new Book("title", "author name", isbn, num_pages, blah, blah, blah);

在一个真实的项目中,你可以想象构造函数中一长串参数,以及使用它的困惑的程序员。

顺便说一句,Effective Java 中的第 1 项建议 (consider static factory methods instead of constructors) 不太适用,如果您有很多域对象,并且想要一个简单的解决方案。

那么,创建域对象的推荐方法是什么?


(这个问题不是针对 Java 的;也欢迎来自其他语言的 cmets)

【问题讨论】:

  • 我稍微改变了你的标题,以避开基于意见的问题。
  • 看到一个充满 setter 的 JavaBean 让我更加困惑——我永远不知道哪些属性是必需的,哪些不是!至少对于构造函数参数,我知道对象处于有效状态。如果一个类需要依赖,它应该在它的构造函数中。在类分解中减少构造函数参数的一种策略。
  • 如果开发者感到困惑并且不想记住参数列表,或者有许多可能的有效方法来构造实例,则可以使用 Builder 模式。
  • @jrahhali 通过“类分解”,你的意思是把一些字段提取到它自己的类中吗?
  • @AlexanderLanger 好的,但是每个域对象类都需要这样做吗?有没有“抽象构建器模式”,所以构建器模式只需要创建一次?

标签: oop domain-driven-design


【解决方案1】:

这个想法是,根据您的业务逻辑,如果域对象处于无效状态,则不应允许其存在。

因此,基于此,您必须在构造时设置Book 的作者姓名,因为没有作者的书没有意义。

另一方面,您可以仅通过 setter 而不是在构造时设置 dateSold(这就是我能想到的全部...)属性,因为它仍然可以在商店的货架上,但却是一个完美的有效Book

它确实可以创建一些非常冗长的构造函数,但好处是您可以确定您的对象始终处于连贯状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多