如果您有一个允许在数据库中使用 null 的值,则应使用Nullable<T>
并避免引入Magic Numbers。但是如果BookId
是一个(主)键,它可能不应该是可空的(除了它被用作外键)。
更新
对于查询数据库并没有找到匹配记录的问题,有几种解决方案。我更喜欢抛出异常,因为如果应用程序试图获取不存在的记录,这通常表示错误。
Book book = Book.GetById(id);
在这种情况下,如果返回值为 null,您会怎么做?可能这一行之后的代码想要对这本书做一些事情,在 null 的情况下,该方法通常什么也不做
- 抛出一个可以更好地完成的异常
GetById()
(除了调用者可能有更多关于异常的上下文信息)
- 立即返回 null 或需要调用者处理的错误代码,但这有效地重新发明了异常处理系统
如果绝对有效,不找匹配记录,我建议使用 TryGet 模式。
Book book;
if (Book.TryGetById(out book))
{
DoStuffWith(book);
}
else
{
DoStuffWithoutBook();
}
我相信这比返回 null 更好,因为 null 是一种神奇的值,我不喜欢在业务逻辑中看到实现细节(引用类型或可空值类型可以取名为 null 的特殊值) . 缺点是你失去了可组合性——你不能再写了Book.GetById(id).Order(100, supplier)
。
以下为您提供了可组合性,但有一个非常大的问题 - 这本书可能会在调用Exists()
and之间被删除GetById()
,因此我强烈建议不要使用这种模式。
if (Book.Exists(id))
{
Book book = Book.GetById(id).Order(100, supplier);
}
else
{
DoStuffWithoutBook();
}