什么是更好的设计/实践:可空房产或1价值房产和1布尔“有”属性?

时间:2010-09-13 05:30:04

标签: c# asp.net-mvc data-modeling code-first

我正在开发一个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;}

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

有关于此的最佳做法吗?

5 个答案:

答案 0 :(得分:10)

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

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

就数据库而言,我希望第一种形式也同样容易...预测你在数据库中有一个可以为空的DATETIME字段,不是吗?它应该直接映射。

答案 1 :(得分:3)

两者的结合只是为了让你的代码更具可读性?

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

它易于阅读,并且与消费者无论如何都必须做同样的事情。此外...

if(HasDeadline)
    doStuff();

更容易阅读
if(Dealine != null)
    doStuff();

:)

答案 2 :(得分:1)

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

另外一个选项是使用一个属性,但不是让它可以为空,你可以返回Null object(也称为Special Case)。

答案 3 :(得分:1)

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

我喜欢可空类型,因为它反映了域名的意图 - 没有日期,没有'没有日期,所以假装1970年1月1日意味着没有日期'。

还有维护HasDealine值的开销 - 每次更新相应的属性时都需要设置它。另外你怎么清楚它?如果将截止日期设置为日期,则会将HasDeadline设置为true。我怎么'取消'它?你会将HasDeadline设置为false,但是将Deadline字段保留为前一个值吗?

整体icky。

答案 4 :(得分:1)

你应该使用nullable,因为它正是你想要的。使用两个单独的属性意味着您失去了它们之间的连接,您需要向文档说明它们之间存在关系。

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