Мне было интересно, что из нижеперечисленного считается наилучшей практикой при работе с отношениями родитель-ребенок.
1) Следующий пример кажется обычной практикой, но при создании экземпляра дочернего элемента он будет в недопустимом состоянии, если он не добавлен к родительскому элементу. Может ли это привести к проблемам с проверкой и т. Д.
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) В следующем образце нужно позаботиться о том, чтобы ребенок всегда был связан с родителем.
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) В последнем примере этот ребенок заботится об отношении к своему родителю.
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;
}
}
Какой рисунок считается лучшим? Я считаю, что шаблон 2 может быть лучшим с тех пор, как ребенок никогда не сможет существовать без отношения к своему родителю. Это облегчит, например, при реализации шаблона спецификации, который может делать такие вещи, как:
public class ChildSpecification
{
bool IsSatisfiedBy(Child child)
{
return child.Parent.Children.Where(someCondition).Count > 0;
}
}
Приведенная выше спецификация может работать, только если у ребенка есть родитель.
Что вы думаете? Вы знаете лучшие способы? Заранее спасибо