域对象设计

时间:2012-07-20 14:50:14

标签: architecture domain-driven-design audit

在设计域模型时,应该坚持使用代表问题域的内容,域模型不应包含审核信息。

所以,如果我正在设计Cat,它可能看起来像这样:

public Cat {
    private Color furColor;
    private Color eyeColor;
    private boolean isDeclawed;
    etc...
} 

我永远不应该拥有像“updateDate”和“createTime”这样的属性,对吗?

现在,如果一个Web应用程序要在屏幕上显示一个猫表,您可能会有以下内容:

Name    Eye Color  Claws?    Last Updated
------  ---------  ------    ------------
Fluffy  Green      No        10/31/2012
etc...

因此,如果您没有在域模型中保留上次更新时间,那么如何(正确地)将该数据提供给页面?

显然,我可能有一个设计不佳的域模型,但我想做得更好。

我曾考虑创建一个接受泛型的对象,以便保持我的域模型原始。 即。

public PersistableObject<T,K> {

    private T domainObject;
    private Date updateDate;
    private User updateUser;

    getters, setters, etc...
}

但是,我担心我会遇到一些问题。

我已经对“域名模型”和“更新日期”等进行了大量搜索......但我认为我错过了正确的术语。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

在你的场景中,我不确定我是否同意第一句话。如果您的域名的一般用途包括需要提供这些日期,那么他们可以(并且可能应该)成为您的普通域名对象的一部分。

如果要清理域对象,只需创建一个界面来保存这些公共字段即可。

public interface ITrackedObject
{
    DateTime LastUpdated { get; set; }
    //etc....
}

public class Cat : ITrackedObject
{
    public DateTime LastUpdated { get; set; }
    //....
}

答案 1 :(得分:1)

我会尽我所能。我想你可能正在将对象与记录混合在一起。上次更新的日期不是猫更新但记录是。在OO中,很自然地认为您可以将所有内容封装在关于该对象的一个​​对象中。但是一个对象本身并不表达任何上下文。即使在你的猫咪中你也有一种颜色类型,如果你没有办法获得rgb或cmyk值,那么它本身就没有了。

OO第一天展示的第一批样本教师之一是猫是anamal而anamal是生物实体等等。没有理由为什么不能在你的域对象中进行最后修改,或者甚至最后更新都是一个很好的调用大部分时间。但是如果你可以分离和模拟对象如何与其他对象进行交互以及如果它们有太多的定义它们将如何被限制(是的,我说有限因为它已经决定了许多事情)。我并不是在考虑重复使用对象,但是对于一个能够在10英尺或10000英尺的视野中提供上下文和意义的模型来说,正确的关系是非常重要的。

我在平台研发工作了近9年,建模和开发了多年来完成的平台。总是杀死我们的一件事就是得到一两个ia-a并且有一种关系倒退。它会使模型无用,也可能在那个时候有一个200列的平面表但从来没有那么重构,在大型甚至小型模型中的几个关系是一个重大的挫折。对象不是记录,甚至是它们赋予数据意义的类。

因此,简而言之,MyBizObject扩展了MyBizRecord在所有书籍中的推荐方式 MyBizProduct ...扩展MyBizMaterial   数组MyBizRecord [] changeHistory; .... 是如此强大,如果有一天你需要添加MyBizOrders []作为历史,你将不必重做整个模型和工厂。我确信这不是你期望阅读的内容,但我希望它能让你的轮子转向你想要的答案。