2009-03-24 16 views

risposta

1

valore del tipo

13

Per espandere un po 'sulla risposta awhite un tag è un tipo di valore Perché? Perché non ha senso avere

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

chiaramente che dovrebbero essere uguali tra loro a causa di un tag non ha identità tranne che per la sua etichetta. Le domande e le risposte d'altra parte sono sicuramente entità

+0

Grazie. Non avrei potuto dirlo meglio anch'io. –

+0

L'etichetta non è l'etichetta stessa? –

+0

Non è che i tipi di valore non abbiano un'identità e che tutte le istanze di un particolare tipo abbiano la stessa identità –

2

Solo alcune considerazioni aggiuntive: i tag possono essere normalizzati, "DDD" deve essere uguale a "ddd" e "DdD", e nella maggior parte dei sistemi di tag, gli spazi vengono sostituiti con " _ "caratteri di sottolineatura. Suppongo anche che il creatore verrà rintracciato per il sistema di badge.

+2

Queste sono sicuramente delle considerazioni utili. Permettetemi di precisare che un tipo di valore (tag) può fare riferimento a un'entità (utente) –

5

Il tag SO è molto probabilmente un'entità. I tag possono essere creati, uniti, cancellati e rinominati. Esistono funzionalità come "tag simili", tag dell'utente, ecc. Alcune di queste funzioni, in particolare il ciclo di vita, richiedono un'identità. Esempio di DDD classico in cui la persona che cambia il proprio nome è sempre la stessa persona, la stessa identità. Lo stesso vale per i tag in cui l'utente può decidere di rinominare "domain-driven-design" in "DDD" e sarà comunque la stessa cosa. I tag hanno bisogno anche di attributi aggiuntivi come tag.Id, tag.Name, tag.CreatedOn, tag.CreatedBy, tag.Locked ecc. Probabilmente ci sarebbe un repository di tag corrispondente che può imporre la regola di unicità del nome.

Per riepilogare, il tag SO non è un oggetto valore DDD perché è mutabile e ha un ciclo di vita. Ancora più importante, Tag non è solo una caratteristica di una domanda (questo è ciò che penso sia stato trascurato da altre risposte). Partecipa a molte più relazioni di così. In altre parole, il tag è più di una semplice somma dei suoi attributi, ha anche "identità concettuale". D'altra parte TagName è un perfetto esempio di oggetto valore. Il suo unico scopo nella vita è descrivere un'altra entità (Tag). TagName non è nient'altro che una stringa che può avere alcune regole incorporate come la lunghezza massima e il confronto senza distinzione tra maiuscole e minuscole. Potrebbe anche avere senso usare semplicemente String invece.

codice che mostra domande possono usare qualcosa di simile:

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

codice che tag la questione può apparire come segue:

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

Senza contare che sui tag SO sono associati riepiloghi e interi wiki ... –

Problemi correlati