6

我正在开发一个 ASP.NET MVC 应用程序,设计域模型,使用(测试)新的 EF Code First 功能。

我有一个可能有也可能没有截止日期的活动实体,处理它的最佳方法是什么?

1 个属性:

public DateTime?  Deadline {get; set;}
and check vs null before using

或者

2个属性:

public DateTime Deadline {get; set;}
public bool HasDeadline  {get; set;}

起初我想到了第一个选项,但后来我开始认为,关于数据库,第二个选项可能会更好......

有没有这方面的最佳实践?

4

5 回答 5

10

我会选择第一个选项。毕竟,它正是第二种的封装形式。

封装清楚地表明您只有一个逻辑值(或缺少逻辑值)。在第二种形式中,您可以将属性视为完全独立,但在逻辑上它们不是。

就数据库而言,我希望第一个表单也同样简单......大概您将在数据库中有一个可为空的 DATETIME 字段,不是吗?它应该直接映射。

于 2010-09-13T05:33:10.337 回答
3

为了使您的代码更具可读性,将两者结合起来怎么样?

public DateTime? Dealine{get; set;}
public bool HasDeadline
{
    get
    {
        return (Deadline != null);
    }
}

它易于阅读,并且与消费者无论如何都必须做的事情完全相同。除了...

if(HasDeadline)
    doStuff();

比阅读更容易

if(Dealine != null)
    doStuff();

:)

于 2010-09-13T05:59:13.260 回答
1

您应该使用可为空的,因为它完全符合您的要求。使用两个单独的属性意味着您失去了它们之间的联系,您需要用文档说明它们之间存在关系。

可空类型也应该更适合数据库类型,但是您应该首先设计对象以使其作为对象工作,而不是如何将其存储在数据库中。如果使用数据库生成工具导致您在设计代码时做出错误的决定,那将适得其反。

于 2010-09-13T05:47:40.777 回答
1

我会使用第一个选项。从长远来看,第二个选项可能会导致一些维护问题,因为您必须记住检查和使用这两个属性。

还有一种选择是使用一个属性,但不是让它可以为空,而是可以返回一个Null 对象(也称为Special Case)。

于 2010-09-13T05:38:06.550 回答
1

数据库用于存储 NULL 值 - 在数据库中存储 Min 值,然后有一个标志来指示您是否应该信任该值,这会使查询变得复杂。

我喜欢可空类型,因为它反映了域的意图——没有日期,而不是“没有日期,所以假装 1970 年 1 月的第一天意味着没有日期”。

维护 HasDealine 值也有开销 - 每次更新相应属性时都需要设置它。还有怎么清除?如果您将截止日期设置为日期,则会将 HasDeadline 设置为 true。我如何“取消设置”它?您是否将 HasDeadline 设置为 false,但将 Deadline 字段保留为之前的值?

整体恶心。

于 2010-09-13T05:40:17.830 回答