只是读取完成 这个职位 通过Greg Young,在那里,他在谈论Microsoft建议的模式与愚蠢的数据传送对象。他暗示的,在Java社区,情况趋势的另一个方向。

我的问题是如何从逻辑应该是在你实体对象?我们的理念在我工作的地方(C#店)的是,如果你不能serialize它,不要把它放在实体。

有帮助吗?

解决方案

马特,

我要说的是,你的店是编写程序代码。我要明确,没有什么不妥,许多大型系统(包括很多我已经在工作)使用的程序代码已被写入。有它的时间和地点。

现在程序代码具有在域模型的地方。如果你想使用多个程序的风格是好的,但与像一个表模块或Active Record模式中使用它。它是不可缺少的OO,我正在考虑要在指导,破坏性,但与程序逻辑的使用领域模型。

这导致一个花费大量的资源构建域层的(阻抗失配,思维过程的时间来建立聚集体,隔离,无处不在的语言等)而不接收任何的益处,该域层(通常可维护性)否则会提供。换句话说,而你可能会满足你的功能需求就好,你最终花费了大量的预算几乎没有回报。

现在回过头来什么“的行为是”我希望把重点放在问题的,而不是一个“领域驱动设计”的观点面向对象的。一个对象通常封装了一些状态,通常会揭露一些行为。

快速重申:封装状态,暴露行为

所以应该对象有什么样的行为?简单地说,应该是在它被封装的状态下操作的行为。在一个理想的行为OO世界,国家将永远不会从对象只有行为被曝光。把战术转换成代码,如果我们开始看到类似的代码:

Customer c = GetCustomerFromRepository();
c.Status = CustomerStatuses.Deleted;
c.LastUpdated = DateTime.Now;
c.UpdatedBy = GetCurrentUser();
CustomerRepository.Save(c);

我们有一个SRP违反...此代码是代码,应该是客户对象的行为,因为客户对象的“责任”是。

封装状态有关客户和暴露的行为。

因此,我们可以看到,我们会更好具有Customer.Delete()方法。 (是的,这是一个不好的例子,我知道...)

现在,我们也将通过使用TDD得到了这一点。这是很容易让我们在处理与行为提供了比所有国家都暴露接缝缝测试。这样做的原因是,我不需要重复在我的测试逻辑。客户端代码不会的护理的如何删除作品......它只在乎客户的公开行为。因此在我们的测试,而不是声称c.State == CustomerStates.Deleted和c.UpdatedBy == GetCurrentUser()等等等等,我们会简单地断言,删除方法被调用的客户接缝使用模拟。

现在回来的标题。这应该是一个业务对象的逻辑数量是逻辑的,根据封装其状态的责任落在量。有时候,这是一个很大,有时它不是。有些情况下要使用服务,以及地方......一个很好的例子是协调许多领域对象之间的相互作用对于一个给定的行为,但即使在这里,服务应该被调用的行为的上域对象

这是否有助于澄清事情有点?

格雷格

其他提示

如果你打电话给他们你的“领域模型对象”,那么我会认为你指的福勒的领域模型模式。 http://martinfowler.com/eaaCatalog/domainModel.html

由于假设,然后回答你的问题是“所有的业务逻辑”,因为这本质上是模式的定义。

不幸的是,术语“领域模型”似乎最近已大不如前,只意味着你的数据,没有行为的对象模型。

如果您还没有这样做的话,我建议你阅读POEAA并决定在哪里你认为域逻辑在您的情况属于。如果你决定一个域模型,那么我建议你阅读埃文的DDD的书,了解实体,值对象和服务之间的区别。

希望帮助!

最近,我一直在玩弄创建具有结构和只有那些普遍支持该型号行为与扩展方法为特定行为(即行为,可以跨多个使用的限界上下文)域模型的想法有界上下文。这使域模型接近DTO(对于那些喜欢),并限制有界范围内使用该域模型只允许行为。所以这可能是中间的路线的一个响应的选项。 :)

主要的一点是如何定义的逻辑。给出一些例子:

  1. 我不会进行分类功能getFullName()一个人的实体,它只是将一些字符串,因为逻辑。
  2. 计算单项价值就更有可能有资格获得被逻辑。
  3. 做一些订交易我肯定会说是的逻辑。

第1点,也许2会去我的实体。3点不是。所以我定义的逻辑:

  • 任何操作,不会有任何持久性有关的事情(read/write)
  • 任何操作,涉及到任何其他(非直接相关的,例如主详细地)实体

海事组织,任何这些行动不属于实体。

现在,为什么当我不会把还点1和2类型的操作为一个实体?这是一个相当罕见的情况,但我不会这样做,只要为数据存储在实体需要加以解释某种方法才可以使用的应用程序(例如如果根据目前的用户,内容领域X具有不同的含义),这意味着该实体的数据本身产生一些逻辑。

据我了解,与实体相关的所有业务逻辑应该进入该实体。这包括用于定义基于系统的业务规则的实体的行为或内部结构的任何逻辑。这不应该包括表现逻辑和持久性逻辑(明显的例外与活动记录设计模式是),但应包括的东西,如数据验证,实体关系,状态机和其他东西,定义实体的真实方面如何表现世界上的事情是试图模型。

我尝试看看它的方式是设法使我的模型尽可能可重复使用。我们要永远想着如何将所使用的模型,如果它在那里被移植到不同的系统中(使用实体或代码)的客户端代码可能会有所不同。如果功能没有实体的一部分,将它仍然表现以同样的方式遵循相同的业务规则?如果答案为否,则该功能应该走在实体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top