6

私は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;}

最初は最初のオプションを考えましたが、DBに関しては2番目のオプションの方が良いのではないかと思い始めました...

これに関するベストプラクティスはありますか?

4

5 に答える 5

10

私は最初のオプションで行きます。結局のところ、それはまさに2番目のカプセル化された形式です。

カプセル化により、論理値が1つしかない(または論理値がない)ことが明確になります。2番目の形式では、プロパティを完全に独立しているかのように扱うことができますが、論理的にはそうではありません。

データベースに関しては、最初のフォームも同じように簡単だと思います...おそらく、データベースにはnull許容の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

最初のオプションを使用します。長期的には、2番目のオプションは、両方のプロパティを確認して使用することを忘れないようにする必要があるため、メンテナンスの問題を引き起こす可能性があります。

また、1つのオプションは、1つのプロパティを使用することですが、null可能にする代わりに、Nullオブジェクト(特殊なケースとも呼ばれます)を返すことができます。

于 2010-09-13T05:38:06.550 に答える
1

データベースは、NULL値を格納するために使用されます-最小値をデータベースに格納し、その値を信頼する必要があるかどうかを示すフラグを設定すると、クエリが複雑になります。

ドメインの意図を反映しているので、null許容型が好きです。日付はありません。日付はありません。したがって、1970年1月1日は日付がないことを意味します。

HasDealine値を維持するオーバーヘッドもあります。対応するプロパティが更新されるたびに設定する必要があります。また、どのようにそれをクリアしますか?Deadlineを日付に設定すると、HasDeadlineがtrueに設定されます。どうすれば「設定を解除」できますか?HasDeadlineをfalseに設定しますが、Deadlineフィールドは前の値のままにしますか?

全体的に厄介です。

于 2010-09-13T05:40:17.830 に答える
1

null許容型を使用する必要があります。これは、必要な処理を正確に実行するためです。2つの別々のプロパティを使用すると、それらの間の接続が失われ、ドキュメントでそれらに関係があることを説明する必要があります。

null許容型はデータベース型にも適合しますが、最初に、データベースにオブジェクトを格納する方法ではなく、オブジェクトとして機能するようにオブジェクトを設計する必要があります。データベース生成ツールを使用すると、コードを設計するときに誤った決定を下す場合、それは逆効果です。

于 2010-09-13T05:47:40.777 に答える