Я задавался вопросом, какое из следующего считается лучшей практикой при контакте с отношениями отцов и детей.
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;
}
}
Указанные выше технические условия могут только работать, если у ребенка есть родитель.
Что Вы думаете? Вы знаете лучшие пути?Заранее спасибо
Мне определенно нравится предложение номер 2, но я думаю, что оно пропускает нечто важное, что находится в 3, а именно, что если объект Child
не может существовать без объекта Parent
, то он должен взять объект Parent
в своем конструкторе. Более того, свойство Родительское
в классе Дочернее
должно быть только прочитано.
Таким образом, вы получите что-то вроде:
public class Parent
{
private ICollection<Child> children;
public ReadOnlyCollection Children { get; }
public Child CreateChild()
{
var child = new Child(this);
children.Add(child);
return child;
}
}
public class Child
{
internal Parent Parent
{
get;
private set;
}
internal Child(Parent parent)
{
this.Parent = parent;
}
}
Я склонен использовать вариант (1) - всегда хорошо работал для меня. Важно не значит разоблачить свою коллекцию детей на внешний мир - родитель должен быть в состоянии оспорить весь доступ. Но я прекрасно радую для ребенка, который будет создан в другом месте - я забочусь об этом только тогда, когда он добавляется к родителю, и на данный момент его можно проверить на действительность и т. Д.
Я не понимаю ваш Пример спецификации: кажется, что ваша уход за ребенком вернется, если любой у детей родителей имеет максимальное использование. Конечно Issatisfiedby (ребенок ребенок) должен вернуться только в том случае, если конкретный ребенок прошел как параметр, удовлетворяет условию.