Доменный Управляемый Дизайн - Родительский дочерний шаблон отношения - шаблон Спецификации

Я задавался вопросом, какое из следующего считается лучшей практикой при контакте с отношениями отцов и детей.

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;
    }
}

Указанные выше технические условия могут только работать, если у ребенка есть родитель.

Что Вы думаете? Вы знаете лучшие пути?Заранее спасибо

6
задан Klaus Byskov Pedersen 28 January 2010 в 16:01
поделиться

2 ответа

Мне определенно нравится предложение номер 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;
    } 
} 
6
ответ дан 17 December 2019 в 00:09
поделиться

Я склонен использовать вариант (1) - всегда хорошо работал для меня. Важно не значит разоблачить свою коллекцию детей на внешний мир - родитель должен быть в состоянии оспорить весь доступ. Но я прекрасно радую для ребенка, который будет создан в другом месте - я забочусь об этом только тогда, когда он добавляется к родителю, и на данный момент его можно проверить на действительность и т. Д.

Я не понимаю ваш Пример спецификации: кажется, что ваша уход за ребенком вернется, если любой у детей родителей имеет максимальное использование. Конечно Issatisfiedby (ребенок ребенок) должен вернуться только в том случае, если конкретный ребенок прошел как параметр, удовлетворяет условию.

0
ответ дан 17 December 2019 в 00:09
поделиться