Oop 关于分类的建模问题。分型还是不分型?

Oop 关于分类的建模问题。分型还是不分型?,oop,data-modeling,subclassing,categorization,Oop,Data Modeling,Subclassing,Categorization,我需要一些关于如何建模这个简单分类(?)示例的建议: 我有一个产品。产品可以是不同的类型,例如ProductType 1、ProductType 2和ProductType 3。所有产品都有零件号和名称。不同之处在于它们的价格计算方式 1类产品的价格取决于产品的数量。如果我有5种产品,价格是x美元。如果我有20种产品,价格是$y,以此类推 2类产品的价格取决于每种产品的重量。如果重量是5公斤,价格是x美元,依此类推 类型3的产品有一个简单的价格,比如每个产品x美元 在我看来,每个“价格结构”

我需要一些关于如何建模这个简单分类(?)示例的建议:
我有一个产品。产品可以是不同的类型,例如ProductType 1、ProductType 2和ProductType 3。所有产品都有零件号和名称。不同之处在于它们的价格计算方式

  • 1类产品的价格取决于产品的数量。如果我有5种产品,价格是x美元。如果我有20种产品,价格是$y,以此类推
  • 2类产品的价格取决于每种产品的重量。如果重量是5公斤,价格是x美元,依此类推
  • 类型3的产品有一个简单的价格,比如每个产品x美元
在我看来,每个“价格结构”都需要有一个专用的表/类。然后,根据产品类型,产品将参考其价格结构。您是创建一个“product type”表,并在product类上有一个名为type的属性,还是使用泛化,以便product 1/2/3是product的子类型? 可能会有5种不同的价格结构,每种类型的价格计算方式都不同。因此,计算订单总价的逻辑取决于每种产品类型


你能给我一些关于如何以最佳方式建模的建议吗?如果我选择在Product类上有Type属性的方法,我想我的代码中会有很多If-else语句。如果我选择对它们进行子类化,则每个类都可以负责计算正确的价格,或者执行任何要求它执行的操作。

我的建议是,在关系数据模型中,您将使用类型列来区分记录类型。在代码中,您肯定应该使用子分类。域模型应该尽可能独立于基础数据模型,并且您的描述很好地支持共享属性(使用ABC-产品抽象基类)、P1、P2、P3的子类型(给它一个有意义的域名)和多态性以改变价格计算的需要


您的订单将包含一个基本产品参考列表,为了获得总数,您将询问每个产品的价格,并使用迭代器进行累加

在我看来,这是一个关于何时使用。如果您使用类继承来定义产品的定价方式,那么如果后来有人决定WidgetXYZ现在应该按重量定价,而不是按简单的价格定价,那么您必须重新编译整个系统


我会将每种产品定义为具有“定价策略”——在您的情况下,这可能是“体积搜索”、“按重量”或“简单”。然后,您可以根据产品的策略使用提供正确的PriceCalculator对象,该PriceCalculator将相应地计算产品的价格。

谢谢您的评论。为什么不像这里描述的那样对子类进行建模?db中的建模子类不适合您的场景。当你的子类有一组独特的属性时,你会像你所发送的示例链接中那样考虑。在您的例子中,唯一的变化是类型和计算,它是派生的,而不是针对数据库中的字段存储/缓存的。如果在db中对其进行建模,则产品表最终将与其他3个产品表一起使用,它所拥有的只是一个具有1:0 relationshipGood point的FK。非常感谢你。我仍然愿意接受其他意见和建议。对于特定类别的产品,价格是否也取决于实际的零件号,还是该类别的所有产品都是相同的?例如,所有类型3产品的价格都是x美元,还是说它们是固定的,与重量/数量无关?假设我销售2000件产品。如果产品属于类型1,则将使用类型1的价格结构计算价格。如果是类型2,则必须使用另一个计算,依此类推。这是否回答了您的问题?我不同意子类化是实现此设计的最佳方式(请参阅下面的答案)。除此之外,这个stackoverflow讨论有很多关于将对象层次结构映射到关系数据库的好反馈:我将不得不研究这种方法。谢谢你的建议!我可能会在几天后回到这里,当我了解更多的时候。我已经成功地实施了策略和工厂模式来解决我的问题,这似乎是一个很好的解决方案。非常感谢。