我读过一些关于 Getters 和 Setters 的使用的文章/帖子,以及它们如何帮助破坏域模型对象中封装的目的。我理解不使用 setter 背后的逻辑 - 您允许客户端代码在对象业务规则和不变量的上下文之外操作该对象的属性。
现在这位校长仍然让我困惑。例如,如果我需要更改对象的成员变量的值,会发生什么情况?例如,如果一个人的名字发生变化,我如何在模型中反映这一点?起初我想,为什么不有一个名为“ChangeName”的函数,它让我传入新名称,然后它又可以更改内部“name”变量。嗯……那只是一个二传手不是吗!
我需要澄清的是 - 如果我要完全消除设置器,那么在上述情况下,我是否应该仅依赖构造函数参数?我是否应该通过构造函数传递新的属性值来代替旧的属性值,然后我可以通过将对象传递到我拥有的任何持久性基础设施来持久化更改?
这两篇文章在本次讨论中很有用:
- http://kellabyte.com/tag/ddd/ http://kellabyte.com/tag/ddd/
- http://典型程序员.com/?p=23 http://typicalprogrammer.com/?p=23
嗯,这是一个经典的讨论。 Stack Overflow 上还有其他几个与此相关的线程。
但。获取/设置(自动属性?)并不都是坏事。但它们往往会让您将实体构建为只有 prop 而没有方法的“死”数据容器。这种症状通常被称为贫血区域 - 并且几乎没有什么行为。我的建议是:
- 尝试尽可能少地使用道具。
- 尝试找到属于一起并且应该是的数据组
像前任一样在一起。名字、中间名和姓氏。另一个例子
是邮政编码、城市、街道。这些数据最好通过
方法。它可以最大限度地减少您的实体无效的可能性。
- 通常,属于一起的数据可以分组为值
目的。
- 更多的 Value 对象往往会带来更多的描述性方法
来自您的实体,它们是“动词”而不是通常的“名词”
实体。
- 您的值对象还可以添加更多方法
行为,也许会减少你的“胖”服务(也许你不
有太多泄露业务逻辑的服务...)。
这里还有更多要说的......但一个简短的答案。
关于在构造函数中设置数据:只有当该实体在没有该数据的情况下无法“生存”/存在时,我才会这样做。对于实体 Person 我想说 Name 可能没那么重要。但社会安全号码可能是构造函数数据的候选者。或者实体 Employee 必须在构造函数中包含 Company,因为员工必须属于公司。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)