2009-03-24 18 views

Respuesta

1

tipo de valor

13

Para ampliar un poco sobre la respuesta de ablanco una etiqueta es un valor de tipo ¿Por qué? Debido a que no tiene sentido tener

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

claramente que deben ser iguales entre sí debido a una etiqueta no tiene identidad a excepción de su etiqueta. Las preguntas y respuestas son definitivamente entidades

+0

Gracias. No podría haberlo dicho mejor yo mismo. –

+0

¿La etiqueta de la etiqueta no es su identidad? –

+0

No es que los tipos de valores no tengan una identidad es que todas las instancias de un tipo en particular tienen la misma identidad –

2

Solo algunas consideraciones adicionales: Las etiquetas se pueden normalizar, "DDD" debe ser igual a "ddd" y "DdD", y en la mayoría de los sistemas de etiquetas, los espacios se reemplazan por " _ "subraya. También creo que el creador será rastreado para el sistema de identificación.

+2

Esas consideraciones sin duda valen la pena. Permítanme señalar que un tipo de valor (etiqueta) puede hacer referencia a una entidad (usuario) –

5

SO tag es muy probablemente una entidad. Las etiquetas pueden ser creadas, fusionadas, eliminadas y renombradas. Hay funciones como 'etiquetas similares', etiquetas de usuario, etc. Algunas de estas funciones, especialmente el ciclo de vida, requerirán una identidad. Ejemplo clásico de DDD donde la persona que cambia su nombre sigue siendo la misma persona, la misma identidad. Lo mismo con las etiquetas donde el usuario puede decidir renombrar "domain-driven-design" a "DDD" y seguirá siendo lo mismo. Las etiquetas también necesitan atributos adicionales como tag.Id, tag.Name, tag.CreatedOn, tag.CreatedBy, tag.Locked etc. Probablemente exista un repositorio de etiquetas correspondiente que pueda imponer la regla de unicidad de nombre.

En resumen, SO Tag no es un objeto de valor DDD porque es mutable y tiene un ciclo de vida. Más importante aún, Tag no es solo una característica de una Pregunta (esto es lo que creo que fue pasado por alto por otras respuestas). Participa en muchas más relaciones que eso. En otras palabras, Tag es más que una suma de sus atributos, también tiene 'identity conceptual'. Por otro lado TagName es un ejemplo perfecto de Value Object. Su único propósito en la vida es describir otra entidad (Etiqueta). TagName no es más que una cadena que puede tener algunas reglas incorporadas, como la duración máxima y la comparación insensible a mayúsculas y minúsculas. También puede tener sentido simplemente usar String en su lugar.

código que muestra preguntas pueden usar algo como esto:

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

Código que las etiquetas de la pregunta puede tener este aspecto:

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

Sin mencionar que en las etiquetas SO hay resúmenes y wikis completos asociados a ellos ... –

Cuestiones relacionadas