Спецификация продукта (спецификация): обновление стоимости ... нужно ли использовать древовидную структуру? - PullRequest
0 голосов
/ 26 июля 2011

Я работаю над спецификацией продукта (спецификация) и застрял.Это моя диаграмма классов:

  • Компонент имеет ComponentItems.У ComponentItem есть Компонент и количество.Пример: Компонент ABC имеет 3 компонента C1 и 2 компонента C2.
  • Продукт имеет ComponentItems и ProductItems (аналогично ComponentItems, но для продуктов).

Каждый компонент имеет стоимость единицы,ComponentItem имеет общую стоимость.И у Компонента, составленного ComponentItems, также есть общая стоимость (сумма стоимости ComponentItems).

Эта структура позволяет мне создавать любую иерархию Продукта / Компонента.Я проверяю циклы при вставке / обновлении продуктов и компонентов.

Я хочу, чтобы каждая стоимость обновлялась в базе данных, я не хочу рассчитывать стоимость, используя объекты каждый раз, когда мне приходится использовать Продукт / Компонент.Я имею в виду, что если я обновлю стоимость единицы измерения компонента ABC, то стоимость его родительского компонента должна быть обновлена ​​и т. Д. -> обновление распространяется в иерархии.

Каков наилучший способ реализации этого?Я думал о представлении дерева.Когда компонент обновляется, я извлекаю все связанные компоненты / продукты и строю дерево.Затем я должен обновить родителей первого уровня компонента и сделать то же самое с родителями этих родителей.

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Шаблон Decorator может быть хорошим подходом к этому.

Здесь есть хорошая глава из Head First Design Patterns здесь , в которой говорится об использовании Decorator в аналогичном контексте.

0 голосов
/ 26 июля 2011

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

например. Что-то вроде

class Component {
    List<Component> children;
    Component parent;
    decimal _unitCost;

    public void addComponent(Component c) { children.add(c); UnitCost += c.UnitCost; } 

    public decimal UnitCost { 
       get {return unitCost;} 
       set { 
         if (parent != null) { 
            //update the parent cost, which will in turn update its parent etc.
            parent._unitCost -= UnitCost; parent.UnitCost += value; 
         }
         unitCost = value; 
       }


}
...