3

我有两种类型的产品 - 折扣(10% 光盘)和非折扣(0%)这些产品中的每一个都可以是 LocalProduct / ExportableProduct,其中出口产品需要缴纳 15% 的销售税。

对这种情况进行建模的最佳方法是什么。我是 S/W 设计的绝对新手,我的想法非常有限 1. 有 4 种不同的产品子类型 2. 使用策略模式并有 4 种不同的策略。

有人可以建议我如何使用上述选项或其他选项有效地对此进行建模。

4

8 回答 8

1

为了简单起见,问问自己折扣是否真的需要成为子类型,或者它是否可能是产品的属性,其中“非折扣”的折扣为零。

于 2010-02-15T12:04:22.073 回答
1

我会这样做:

有一个名为“Product”的类,它具有产品的基本属性,如名称、描述、类型等。

基础“Product”类可以有一个名为“DiscountRate”的属性。它可以是 0 表示不打折,而任何值表示打折。这将有助于简化计算,因为将始终应用相同的公式,只是在一种情况下折扣为 0。

然后你可以有两个类“ExportableProduct”和“LocalProduct”,它们都继承自“Product”类。

于 2010-02-15T12:05:26.707 回答
0

我建议也许 Discounted/NonDiscounted 根本不应该是产品类型。而是在父产品中有两个子类型和一个“折扣”属性/字段。然后,每种产品都可以有效地获得任何折扣。这也允许不固定为 10% 的折扣。

于 2010-02-15T12:05:23.010 回答
0

我会为此避免继承(即子类型)。

相反,我会为 Discounted / NonDiscounted 和 Local / ExportableProduct 定义枚举。然后,每个产品类别都将简单地为每个产品类别提供一个属性,指示其类型。

然后在一个单独的类中,例如:PricingCalculator,定义一个接受产品实例的计算方法(可能是静态的)。此方法仅检查枚举属性并在计算中应用所需的百分比值。

这将定价计算与产品本身完全分开,并允许您将有时复杂的定价计算保留在一个位置。随着您的定价方案随时间变化,这种方法易于维护和测试。

于 2010-02-15T12:15:33.927 回答
0

我会避免一切,只有两个属性:discountlocal

由于只有一件事会发生变化(价格),因此您可以即时计算(折扣 => price * .9,出口 => price * .85- 甚至两者都 => 出口和折扣 => price * .9 * .85

于 2010-02-15T12:19:04.343 回答
0

当不止事物因类型而异时,继承特别有用。

例如,如果折扣、税金和运输方式都因商品类型而异,那么肯定是时候考虑继承和子类化(您会说“这种商品子类型有这个税和这个折扣和本次运输”)。

另一方面,当只有一件事根据类型而变化时,是否值得拥有多个类型(即具有子类的基类型),或者是否可以更简单地将差异建模为单个类型,其实例有一个属性值(例如,名为“discount_percentage”)。

于 2010-02-15T12:26:39.177 回答
0

类区分行为集。因此,让我们从这些方面来看看您的部门:

  • 虽然可以说打折/非打折是一种行为变化,但将其简化为单一行为是微不足道的:所有产品都有折扣,但非打折产品的折扣金额恰好为 0% . 这只是您产品的一个属性 (discount_amount),而不是一个单独的类。

  • 本地/可导出的可能有也可能没有不同的行为。如果唯一的区别是产品是否允许在国际上运输,那么一个简单的布尔标志应该足以处理这种区别。另一方面,如果可出口产品需要本地产品不支持的行为(例如,海关要求和程序的记录),那么将 ExportableProduct 设为 LocalProduct 的子类是合适的(如果可出口产品行为是本地产品的超集)产品行为)或使用 LocalProduct 和 ExportableProduct 子类创建抽象产品类(如果本地产品也具有可导出产品不支持的行为)。

于 2010-02-15T12:34:21.783 回答
0

当这就是您需要的所有行为时,只需在您的产品中使用两个布尔值并打开它们是最好的解决方案。雅尼。

但恐怕这只是更大问题的一小部分。然后你必须问自己:是什么让产品成为产品(单一责任)。可征税性和可折扣性可能是两个不同的问题,因此您的产品最终会采用两种策略。

于 2010-02-15T12:47:08.787 回答