2009-03-24 11 views

Répondre

1

type de valeur

13

Pour développer un peu sur la réponse de awhite une étiquette est un type de valeur Pourquoi? Parce qu'il n'a pas de sens d'avoir

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

clairement qu'ils doivent être égaux entre eux parce qu'une balise n'a pas d'identité, sauf pour son étiquette. Quelques questions et réponses sont certainement des entités

+0

Merci. Je n'aurais pas pu mieux le dire moi-même. –

+0

Est-ce que tag n'est pas son identité? –

+0

Ce n'est pas que les types de valeur n'ont pas d'identité, c'est que toutes les instances d'un tri particulier ont la même identité –

2

Juste quelques considérations supplémentaires: Les balises peuvent être normalisées, "DDD" devrait être égal à "ddd" et "DdD", et dans la plupart des systèmes de balises, les espaces sont remplacés par " _ "souligne. Aussi je suppose que le créateur sera suivi pour le système de badge.

+2

Ce sont certainement des considérations intéressantes. Permettez-moi de souligner qu'un type de valeur (tag) peut référencer une entité (utilisateur) –

5

La balise SO est probablement une entité. Les tags peuvent être créés, fusionnés, supprimés et renommés. Il y a des fonctionnalités comme 'tags similaires', tags de l'utilisateur, etc. Certaines de ces fonctions, en particulier le cycle de vie, nécessiteront une identité. Exemple DDD classique où Personne qui change de nom est toujours la même personne, la même identité. La même chose avec des balises où l'utilisateur peut décider de renommer "domain-driven-design" en "DDD" et ce sera toujours la même chose. Les balises ont également besoin d'attributs supplémentaires comme tag.Id, tag.Name, tag.CreatedOn, tag.CreatedBy, tag.Locked etc. Il y aurait probablement un référentiel de balises correspondant qui pourrait appliquer la règle d'unicité du nom. Pour résumer, la balise SO n'est pas un objet de valeur DDD car elle est modifiable et a un cycle de vie. Plus important encore, Tag n'est pas seulement une caractéristique d'une question (c'est ce que je pense a été négligé par d'autres réponses). Il participe à beaucoup plus de relations que cela. En d'autres termes, Tag est plus que juste une somme de ses attributs, il a également «identité conceptuelle». D'un autre côté TagName est un parfait exemple de Value Object. Son seul but dans la vie est de décrire une autre entité (Tag). TagName n'est rien de plus qu'une chaîne qui peut avoir quelques règles intégrées comme la longueur maximale et la comparaison insensible à la casse. Il peut également être judicieux d'utiliser simplement String à la place.

code

qui affiche des questions peuvent utiliser quelque chose comme ceci:

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

que la question des balises peut ressembler à ceci:

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

Sans oublier que sur les balises SO ont des résumés et des wikis entiers qui leur sont associés ... –

Questions connexes