代码之家  ›  专栏  ›  技术社区  ›  Francisco Noriega

什么是更好的设计/实践:null属性或1值属性和1布尔“has”属性?

  •  6
  • Francisco Noriega  · 技术社区  · 14 年前

    我在做一个ASP.NETMVC应用程序,设计领域模型,使用(测试)新的EF代码优先特性。

    1物业:

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

    2个属性:

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

    一开始我想到了第一个选择,但后来我开始想,也许第二个选择会更好的关于数据库。。。

    这方面有什么最佳做法吗?

    5 回复  |  直到 14 年前
        1
  •  10
  •   Jon Skeet    14 年前

    确切地

    封装说明你只有一个 价值(或缺乏价值)。在第二种形式中,可以将属性视为完全独立的,而逻辑上它们不是。

    在数据库方面,我希望第一个表单也同样简单。。。假设数据库中有一个可为空的DATETIME字段,是吗?它应该直接映射。

        2
  •  3
  •   TerrorAustralis    14 年前

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

    它很容易阅读,而且做的事情与消费者无论如何都必须做的事情完全相同。另外。。。

    if(HasDeadline)
        doStuff();
    

    if(Dealine != null)
        doStuff();
    

        3
  •  1
  •   Mikael Koskinen    14 年前
        4
  •  1
  •   Michael Shimmins    14 年前

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

    总的来说很恶心。

        5
  •  1
  •   Guffa    14 年前

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

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