4

たとえば、データベーステーブルのint主キーフィールドに対応するint型のBookIDをコードで使用している場合(C#とSQL Serverを使用しています)...これがベストプラクティスです。 mコードでIDを渡し、null許容整数を使用してnullをチェックし、BookIDが存在するかどうかを確認します。

if (BookID != null) {

または、dbの実際の値に対応できない整数値(0や-1など)を割り当てることをお勧めします。

if (BookID > 0) {

編集:さらに明確にするために、本のオブジェクト全体ではなく、本のIDのみを返したいとします。データベースでは、主キーはnull許容ではありません、存在しない「私の本のタイトル」のBookIDに対してクエリを実行すると、結果が得られません。これはnullとして反映されるべきですか?

例:

BookID = GetBookID("my book title");
4

5 に答える 5

12

データベースにnullを許可する値がある場合は、マジックナンバーNullable<T>の導入を使用しないでください。ただし、が(主)キーである場合は、おそらくnull可能であってはなりません(外部キーとして使用される場合を除く)。BookId

アップデート

データベースにクエリを実行し、一致するレコードが見つからないという点については、いくつかの解決策があります。アプリケーションが存在しないレコードを取得しようとした場合、通常はエラーを示しているため、例外をスローすることをお勧めします。

Book book = Book.GetById(id);

この場合、戻り値がnullの場合はどうしますか?おそらく、この行の後のコードは本で何かをしたいと思っており、nullの場合、メソッドは通常それ以上何もできません。

  1. より適切に実行できる例外をスローするGetById()(呼び出し元が例外に関するより多くのコンテキスト情報を持っている可能性があることを除いて)
  2. nullまたは呼び出し元による処理を必要とするエラーコードですぐに返されるが、それは事実上例外処理システムを再発明している

絶対に有効で、一致するレコードが見つからない場合は、TryGetパターンを使用することをお勧めします。

Book book;
if (Book.TryGetById(out book))
{
    DoStuffWith(book);
}
else
{
    DoStuffWithoutBook();
}

nullは一種の魔法の値であり、ビジネスロジックで実装の詳細(参照型またはnull許容値型がnullという名前の特別な値を取ることができる)を見たくないので、これはnullを返すよりも優れていると思います。欠点は、構成可能性が失われることです。書き込みができなくなりますBook.GetById(id).Order(100, supplier)

以下は、構成可能性を元に戻しますが、非常に大きな問題があります。呼び出しとの間に本が削除される可能性があるためExists()GetById()このパターンを使用しないことを強くお勧めします。

if (Book.Exists(id))
{
    Book book = Book.GetById(id).Order(100, supplier);
}
else
{
    DoStuffWithoutBook();
}
于 2009-07-07T16:04:24.193 に答える
8

null許容整数を使用することを好みます。これは、データベースに実際に存在するものにより直接的にマップされます。

また、nullに使用する適切な値がない場合も多くあります。-1を使用してnullを示すことは、IMOの悪い習慣です。これは、-1がDBで有効な値であることが多いためです。

于 2009-07-07T16:01:54.323 に答える
2

Dbの主キーは通常null許容ではなく、ほとんどの場合、プログラムの値もnull許容ではありません。ただし、Find()関数のように、見つからないことを示す必要がある場合があり、null許容値を使用できます。そして、あなたが結果フォームを渡すとき、検索します。好き:

int? foundBookID = FindBook(title);
if (foundBookID.HasValue)
{
   int BookID = foundBookID.Value;  // not nullable
   ...
}
于 2009-07-07T16:21:31.177 に答える
0

質問の誤謬のように聞こえます。あなたがそれを求めた方法、はい、確かにnull許容整数を使用してください。私が考えることができる例外は、見つからないことを表すために0をすでに使用/チェックしている既存のコードがたくさんある場合です。その場合、一貫性が優先される可能性があります。null許容型は比較的新しいため、0チェックが表示されることは珍しくありません。

于 2009-07-07T16:47:04.230 に答える
0

IMHOの方が良い(擬似コード)

public struct Identifier {

   private int? presistanceID;

   public Identifier(int presistanceID){
     presistanceID = presistanceID;
   }

   public bool IsSetted {
     get {presistanceID.hasvalue};
   }
}

if (book.BookID.IsSetted){
}

book.BookID.ToString();

これは読みやすく、基本的な型チェックを提供し、2つの不変条件(割り当てられたIDと割り当てられていない)を許可し、NullRerenceExceptionに対して安全です。

于 2009-07-07T16:24:39.113 に答える