2009-03-24 3 views
9

ドメイン駆動設計のコンテキストでは、StackOverflowタグ(つまり、ddd)が値オブジェクトまたはエンティティですか?DDD:SOタグ。エンティティまたは値の型?

編集:

あなたがSOのウェブサイトを構築する必要があると想像してください。あなたは「タグ」をどのように考えますか?

答えて

1

値型

13

awhiteの答え にタグを少し拡大するためには、値型 はなぜですか? それはタグがそのラベルを除いて何のアイデンティティを持っていないので、はっきりと、彼らはお互いに等しくなるはずである

var tag1 = new Tag("DDD"); 
var tag2 = new Tag("DDD"); 
Assert.AreNotEqual(tag1, tag2); 

を持ってしても意味がありませんので。他の手での質問と回答は間違いなく実体です

+0

ありがとうございました。私は自分自身でそれをもっと良く言ったことはありませんでした。 –

+0

タグのラベルは自分自身の身元ですか? –

+0

その値の型にはIDがありません。特定の並べ替えのすべてのインスタンスが同じIDを持ちます –

2

タグは正規化することができます。「DDD」は「ddd」と「DdD」に等しく、ほとんどのタグシステムではスペースは " _ "は強調する。また、私は、作成者がバッジシステムのために追跡されると思います。

+2

これは確かに価値のある検討事項です。値の型(タグ)がエンティティ(ユーザ)を参照できることを指摘してください。 –

5

SOタグは、おそらくエンティティです。タグは、作成、マージ、削除、および名前変更が可能です。 「類似のタグ」、ユーザのタグなどの機能があります。これらの機能の中には、ライフサイクルを中心に、アイデンティティが必要なものがあります。古典的なDDDの例で、名前を変更するPersonは同じ人物、同じアイデンティティです。ユーザーが「ドメイン駆動型デザイン」の名前を「DDD」に変更することができるタグでも同じですが、それでも同じことになります。タグには、tag.Id,tag.Nametag.CreatedOntag.CreatedBytag.Lockedなどの追加属性も必要です。おそらく、名前一意性ルールを適用できる対応するタグリポジトリがあります。

要約すると、SOタグは可変でありライフサイクルを持つため、DDD値オブジェクトではありません。もっと重要なことに、TagはQuestionの特徴であるだけではありません(これは私が他の答えで見落とされたと思います)。それはそれ以上の関係に参加しています。言い換えれば、タグは属性の合計だけではありません。、それはまた「概念的アイデンティティー」を持っています。一方、TagNameはValue Objectの完璧な例です。人生の唯一の目的は、別のエンティティ(タグ)を記述することです。 TagNameは、最大長や大文字と小文字を区別しない比較のようないくつかのルールを組み込んだ文字列だけではありません。代わりに単にStringを使用することもできます。質問はこのようなものを使用することができます表示さ

コード:

IList<TagName> tags = question.GetTags(); 

質問をタグコードは次のようになります。

void TagQuestion(Question q, TagName tagName) { 
    Tag tag = _tagsRepository.FindByName(tagName); 
    if (tag == null) { 
     tag = CreateNewTag(/* capture creator, date, other rules*/); 
    } 
    q.AddTag(tag); 
} 
+2

SOタグには要約とその関連ウィキがあります... –

関連する問題