【发布时间】:2010-10-23 01:48:18
【问题描述】:
谷歌搜索“DDD 适合什么样的应用程序?”给了我以下答案:
大约 95% 的软件应用程序属于“不太适合使用 DDD”类别。 (见the article)
那么有什么大惊小怪的?!?
我正在开发的应用程序主要以数据为中心,但仍包含一些要应用的业务逻辑和规则。开始应用 DDD 技术会浪费时间吗?我是否最好使用更传统的数据访问层、POCO 模型和业务逻辑层?或者换一种说法 - DDD 的合理替代方案是什么?
【问题讨论】:
谷歌搜索“DDD 适合什么样的应用程序?”给了我以下答案:
大约 95% 的软件应用程序属于“不太适合使用 DDD”类别。 (见the article)
那么有什么大惊小怪的?!?
我正在开发的应用程序主要以数据为中心,但仍包含一些要应用的业务逻辑和规则。开始应用 DDD 技术会浪费时间吗?我是否最好使用更传统的数据访问层、POCO 模型和业务逻辑层?或者换一种说法 - DDD 的合理替代方案是什么?
【问题讨论】:
许多认为 DDD 对他们的项目有用的开发人员落入了一个陷阱,他们认为他们的工作就是编写代码。事实并非如此。开发人员的工作是实现功能,以便可以通过软件解决问题。由此得出的结论是,编写代码不是开发人员正在做的事情的开始,而是结束:代码是实际编写代码之前整个过程的结果。
DDD 不是关于编写代码,它不是获得优秀软件的 10 步全包流程,它是关于在编写代码之前的整个过程,它是关于深入了解问题的全部内容,是什么/谁参与了哪些信息流,这些元素是什么样的,它们如何相互关联等等。事实上,DDD 最重要的部分是创建一种语言,使领域专家和开发人员之间的对话成为可能没有误解。这就是埃文斯所说的“无处不在的语言”。它实际上使编写代码之前的整个过程成为一个几乎没有被猜测的过程,事情变得清晰而直接。 (这就是目标)。
“DDD 在实践中如何工作”和“谁能给我一个如何使用 DDD 编写代码的示例”的问题?诸如此类的问题确实来自这样一个事实,即提出此类问题的人专注于编写代码,但不知道为什么他们要编写该代码而不是其他代码。 I.o.w.:如果你意识到 DDD 是关于发现你必须写什么作为功能和为什么,那么事情就到位了。你如何编写代码,这取决于你。但正如所说:这不再是最大的问题,因为那时你已经知道你要写什么以及为什么要写。
【讨论】:
抱歉,如果 DDD 只是 Frans Bouma 所说的一种思维方式,那么它不会推荐诸如 Persistence Ignorance 之类的东西。这是在贬低其他人,将其视为有些低级的开发人员。
DDD 至少对它有偏见的 PI 是一种架构选择。这不再是一种思维方式;它已经为您提供了一些东西,但大多数情况下过于模糊的警告没有任何用处:“不适合所有事情”。
但是决定是否采用 PI 方式本身就是一个挑战,如果他对此感到不安,你就不能称呼某人(“程序员”)。
采用一个带有 MS Access 式界面的 ERP 软件包:带有运行总计的网格、自动更新列和 100 000 条记录的无页滚动。显然,DDD 方法适合思考如何开发这个应用程序。但多年来,我从未见过任何人——无论是在书本上还是在网上,都通过证据支持的解释,更不用说现实生活中的代码示例,说明 PI 如何为任何想要交付的人处理这种无处不在的情况商业级应用和用户体验。
不想在这件事上变得虔诚。 DDD 和 DAL 的支持者往往过于虔诚,可能会赶走那些曾经被咬过但思想开放的人。许多人只想面对现实生活中的经历(即思考),而不是仅仅获得猫、汽车和基本的订单/订单项目(即糟糕的代码)来支持讲道。
【讨论】:
这是一个非常相似的问题:Do you allow the Web Tier to access the DAL directly?
我的所有项目都使用 DDD。在较小的应用程序中,一些概念并不适用,但我发现许多方面适用于所有项目,无论大小。
【讨论】:
你知道,有时 5% 的人比其他 95% 的人赚的钱更多——这就是 DDD 存在的原因。
适用于特定的复杂大型系统。
【讨论】:
DDD 是关于将被维护一段时间的软件。对我来说,这意味着它需要表达随领域而变化的想法。当然,一个简单的应用程序可能非常适合较短的交付时间和较短的实施时间。但是,如果您需要发展软件,那么 DDD 原则将大有帮助。 DDD 一开始可能很难,但是一旦您了解了无处不在的语言和分离问题,那么事情就开始变得容易了。
【讨论】:
如果你再阅读这篇文章,你会看到:
对于使用 DDD 的 5% 的应用程序 非常合身,非常合身。 对于这些情况,DDD 会有所帮助 你破解了一个非常坚韧的坚果。在这里,DDD 可能是银弹 狼人,你的经理只是 指着你的桌子。
这就是为什么大惊小怪的原因。
【讨论】:
由于您的应用程序主要以数据为中心,因此您的架构可能主要是传统的。
对于你有更多逻辑和潜在领域或价值对象的方面,也许你可以利用 DDD 的一些想法来组织代码。
一般来说,“合理的替代方案”是让事情尽可能简单,在有用的地方使用 DDD 概念,不要让事情变得不必要地复杂化,正如文章所建议的那样。
我现在开始了一个类似的项目,它混合了数据操作和更多的逻辑/算法驱动领域。我同样希望采用 DDD 中有益于项目的部分,但不要试图在可能适得其反的领域强加它。
【讨论】: