Me preguntaba cuál de las siguientes opciones se considera una mejor práctica cuando se trata de relaciones entre padres e hijos.Diseño dirigido por el dominio - Patrón de relación padre-hijo - Patrón de especificación
1) El siguiente ejemplo parece ser una práctica común, pero al crear una instancia de un elemento secundario, estará en un estado no válido siempre que no se agregue al elemento primario. No ¿Puede esto conducir a problemas relacionados con la validación etc.
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public void AddChild(Child child)
{
child.Parent = this;
children.Add(child);
}
}
public class Child
{
internal Parent Parent
{
get;
set;
}
public Child()
{
}
}
2) La siguiente muestra se encargaría de que un niño siempre debe estar relacionada con su matriz.
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public Child CreateChild()
{
var child = new Child();
child.Parent = this;
children.Add(child);
return child;
}
}
public class Child
{
internal Parent Parent
{
get;
set;
}
internal Child()
{
}
}
3) En el último ejemplo, ese niño se ocupa de la relación con su propio padre.
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public void AddChild(Child child)
{
child.Parent = this;
children.Add(child);
}
}
public class Child
{
public Parent Parent
{
get;
set;
}
public Child(Parent parent)
{
this.Parent = parent;
}
}
¿Qué patrón se considera el mejor? Creo que el patrón 2 podría ser el mejor, ya que un niño nunca puede existir sin una relación con su padre. Esto lo haría más fácil, por ej. al implementar un patrón de especificación que podría hacer cosas como:
public class ChildSpecification
{
bool IsSatisfiedBy(Child child)
{
return child.Parent.Children.Where(someCondition).Count > 0;
}
}
La especificación anterior solo puede funcionar si un niño tiene un elemento primario.
¿Qué opinas? ¿Conoces mejores maneras? Gracias de antemano
El patrón de especificación trata de un caso especial que tengo actualmente en uno de mis proyectos. Un niño tiene un intervalo de fechas de validez, que no debe coincidir con ningún otro intervalo de fechas de validez de ningún otro niño dentro de la colección de niños. ¿Consideraría esto una especificación para el padre? – Chris
Probablemente implementaría esto como una condición de protección en el método addChild() de Parent. El padre entonces no permitiría el agregado, p. lanzando una excepción. Probablemente no usaría una especificación en este caso. – alasdairg
Pero también debo verificarlo en la UI. Entonces, cuando se lanza una excepción, tendría que atrapar eso. Esto tampoco es muy elegante. Y afaik lo bueno de las especificaciones es que podría usarlo en muchos escenarios diferentes, como 1.) dentro de mi dominio oe 2.) dentro de una aplicación cliente para validar previamente la lógica comercial. ¿O estoy equivocado? – Chris