现在托管在DDDSample project中的Github repository似乎是关于如何设计DDD项目的参考。
我注意到域类中的所有getter都不以get
为前缀(例如:Cargo#delivery
),而它们在域包之外的类中加前缀(例如:HandlingEventRegistrationAttempt#getTrackingId
)。
Accessor,mutators和谓词的名称应以其值为前缀,并以get,set为前缀,并且符合javabean标准。
那么,我们应该避免在这种背景下遵循他的建议吗?如果是这样,为什么它比一致性更重要?
答案 0 :(得分:5)
为什么来自域类的getter不应该在DDD中以“get”为前缀?
易于开始的地方是 mutators ;请注意清洁代码
中的前一句话Mutators应该有动词或动词短语名称,如 postPayment , deletePage 或 save 。
这个想法与域模型不应该是贫血的原则是一致的,并且域的语言应该是无处不在的:我们应该在我们的域的代码中看到相同的语言专家在解释业务时使用。
这就是为什么你不会经常看到set
,除非该动词恰好在你的域中具有重要性。
访问者和谓词都是查询的示例。正如Bertrand Meyer所理解的那样,查询在不修改实例的情况下提供有关实例的信息,并且它们满足统一访问原则
从外部来看,查询是属性(每个对象中的字段)还是函数(算法)不应该有任何区别。例如,a_vehicle.speed可以是一个属性,可以从对象的表示中访问;或者它可以通过一个按时间划分距离的函数来计算。两种情况下的表示法都是相同的,因此在不影响软件其余部分的情况下,可以轻松更改表示。
那么,这些应该如何命名?
Vaughn Vernon在Implementing Domain-Driven Design写道
无副作用函数的方法名称很重要。虽然这些方法都返回值(因为它们是CQS查询方法),但它们故意避免使用get-prefix JavaBean命名约定。这种简单但有效的对象设计方法使Value Object忠实于无所不在的语言。 getValuePercentage()的使用是一种技术计算机语句,但valuePercentage()是一种流畅的人类可读语言表达。
Steven Lowe写道
开发人员倾向于用开发术语思考和交谈,这自然会导致无意识的模型,而不是什么和为什么。这很常见,而且它是一个焦油坑,因为开发人员倾向于遵循既定的模式。更重要的是,一旦代码的真正目的变得模糊,任何人都不可能发现它。
我会用这种方式表达这个想法:域专家应该能够读取域模型中的代码,并评估其正确性。这意味着域代码不应该在其中嵌入与基础架构相关的工件。
罗伯特·马丁关于这个想法的拼写?读者不应该在心理上将你的名字翻译成他们所知道的其他名字。
(Martin后来声称,应该从解决方案领域中获取术语,前提是大多数读者都是程序员,而不是领域专家.DDD反驳的论点是,程序员应该在他们建模时获得领域专业知识生意。)
答案 1 :(得分:1)
不幸的是,计算机科学中最困难的事情,即命名事物,也是最重要的事情之一。您的代码的读者/客户端应该通过查看其签名来了解该方法的作用。如果他也需要阅读方法的主体以了解它的作用,那么你就失败了。
所以,如果以某种方式,通过一些团队规则或其他东西,你可以理解一个特定的方法是一个getter而不使用“get”前缀然后不使用它,否则使用它因为我们,其他的期待在吸气者面前看到“得到”。
P.S。这与DDD正交。
答案 2 :(得分:1)
对我来说,这就是那些想要在无用的谈话中浪费时间的人。
get
前缀可以理解域概念吗? 如果你想用hibernate做域模型,你必须使用setXXX
和getXXX
方法,因为它使用JavaBean标准。
这里的要点是setXXX()
如果暴露可能会很危险,因为你可以跳过你应该在doTheDomainAction()
方法中实现的一致性控制,所以如果你需要它们可能会把它们作为private
是一个更安全的选择(如果protected
不适合,则private
。
关于getXXX
方法,我认为如果它们只是用于读取不可变值,那么使用它们是没有问题的,唯一需要注意的是它们明确了域概念以及谁将使用它们不能误解他们是什么。
答案 3 :(得分:0)
这是一个纯粹而简单的面向对象的问题。必须从接收消息的对象的角度命名方法,而不是从发送消息的对象的角度命名。 “get”前缀适合第二种情况。
答案 4 :(得分:0)
浏览回购,我不确定它是否可以被称为参考。此外,您应该将DDD示例项目视为灵感,而不是要复制的模型。
在查看DDD示例代码时,如何命名getter / setter是不重要的技术细节和应该尝试模拟的最后一件事。它与DDD无关。就命名而言,只要名称反映您的域名无所不在的语言,请使用您自己的OO风格(或任何范例)。