【发布时间】:2011-03-04 05:01:09
【问题描述】:
我正在阅读 Eric Evans 的出色作品,领域驱动设计。但是,我不禁觉得“层”模型是做作的。为了扩展该声明,它似乎试图将各种概念硬塞到一个特定的、简洁的模型中,即层之间相互对话的模型。在我看来,层模型过于简化,无法真正捕捉(好)软件的工作方式。
进一步扩展:埃文斯说:
“将复杂的程序划分为多个层。在每一层内开发一个具有凝聚力且仅依赖于下层的设计。遵循标准架构模式以提供与上层的松散耦合。”
也许我误解了“依赖”的含义,但据我所知,它可能意味着 a) X 类(例如在 UI 中)引用了具体的 Y 类(在主应用程序中) ) 或 b) X 类具有对提供 Y 类服务的 Y 类对象的引用(即作为接口持有的引用)。
如果它的意思是 (a),那么这显然是一件坏事,因为它无法将 UI 重新用作提供 Y-ish 功能的其他应用程序的前端。 但是如果它的意思是(b),那么 UI 是如何依赖于应用程序的,而不是应用程序依赖于 UI 呢?两者在相互交谈的同时尽可能地相互分离。
Evans 的单向依赖层模型看起来太简洁了。
首先,更准确的说法是,设计的每个区域都提供了一个模块,该模块本身几乎就是一个孤岛,理想情况下,所有通信都是通过接口,在合同驱动/责任驱动的范式中进行的? (即,“仅对较低层的依赖”是人为的)。与域层与数据库通信的情况类似——域层与数据库的解耦(通过 DAO 等)就像数据库与域层的解耦一样。两者都不依赖于另一个,两者都可以交换。
其次,概念上的直线(如从一层到下一层)的想法是人为的 - 不是有更多的相互通信的网络,而是独立的模块,包括外部服务、公用事业服务等,分支不同的角度?
谢谢大家-希望您的回答能澄清我对此的理解..
编辑:事实上,埃文斯后来澄清说,他所说的是情况 (b):“层是松散耦合的,设计依赖只在一个方向上。上层可以直接使用或操纵下层的元素通过调用它们的公共接口,持有对它们的引用。......当一个对象需要向上通信时,我们需要另一种机制......例如 OBSERVERS"
这在我看来完全是人为的。它似乎将设计依赖与交互流程混淆了。 UI 需要对应用程序的引用,因为操作通常是用户发起的!对于应用程序启动的操作,例如一些内部计时器事件提醒用户注意某事,应用程序现在需要对 UI 的引用,就像 UI 需要对应用程序的引用一样。在什么意义上,一种比另一种更“依赖于设计”?为了支持我的观点,为了实现 OBSERVER,应用程序需要一个对 UI 组件的引用列表。
在我看来,参考和设计 SEEM 从顶层到底层的唯一原因是因为这是通常启动操作的地方。当在应用程序中启动操作时,引用必须转到其他方式..
【问题讨论】:
-
这应该是社区 Wiki。
-
@Bears:希望这个问题有一个实际的答案,并且他正在讨论的 DDD 原则并不是完全主观的。
标签: design-patterns architecture oop domain-driven-design