【问题标题】:Product BOM (bill of material): cost update... do I have to use a tree structure?产品 BOM(物料清单):成本更新...我必须使用树结构吗?
【发布时间】:2011-07-25 20:31:29
【问题描述】:

我正在处理产品 BOM(物料清单),但我遇到了困难。这是我的类图:

  • 组件具有 ComponentItems。一个 ComponentItem 有一个 Component 和一个数量。示例:组件 ABC 有 3 个组件 C1 和 2 个组件 C2。
  • 产品具有 ComponentItems 和 ProductItems(类似于 ComponentItems,但用于产品)。

每个组件都有一个单位成本,因此一个 ComponentItem 有一个总成本。而由 ComponentItems 组成的 Component 也有总成本(ComponentItems 成本之和)。

这个结构让我可以创建任何产品/组件层次结构。 我正在验证产品和组件的插入/更新循环。

我希望在数据库中更新每个成本,我不想在每次必须使用产品/组件时使用对象来计算成本。我的意思是,如果我更新组件 ABC 的单位成本,他的父组件成本应该更新等等 --> 更新在层次结构中传播。

实现这一点的最佳方法是什么?我在想一个树表示。当一个组件更新时,我检索所有相关的组件/产品并构建一个树。然后我必须更新组件的第一级父级,并对这个父级的父级执行相同的操作。

【问题讨论】:

  • 有人告诉你必须使用树木吗?有很多不同的方法可以实现这一点...
  • 我不必使用树。欢迎任何解决方案:)
  • 所以,要明确一点,您正在编写一个仅用于生成产品 BOM 的程序?
  • 不,这是更大计划的一部分。当我保存发票(销售)时,我必须保存每个产品的单位成本。这是我必须在数据库中更新成本的原因之一。我无法检索每个产品的所有子项以获取其成本。成本必须在 db 中预先计算。也因为我(有时)使用可出租性来计算产品价格。
  • 这个程序是客户端还是服务器端?

标签: c# hierarchy


【解决方案1】:

我认为最好使用简单的树形结构。

例如类似的东西

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


}

【讨论】:

  • 感谢您的回答。 1) UnitCost 是一个属性,而不是根据您的代码的方法。 2) 一个组件有许多父组件、组件和产品。 3) 一个组件有 5 个单位的另一个组件,因此您不能说父组件的成本是按照您的方式计算的,并且每个父组件可以拥有不同数量的该组件。
  • 啊,对不起,我以为这是一对多的父子关系。
【解决方案2】:

Decorator Pattern 可能是解决此问题的好方法。

Head First Design Patterns here 中有一个很好的章节讨论了在类似的上下文中使用装饰器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多