OO设计问题

时间:2010-02-15 11:52:04

标签: ooad

我有两种类型的产品 - 折扣(10%光盘)和非折扣(0%)每种产品都可以是LocalProduct / ExportableProduct,其中一种产品可以吸引15%的销售税。

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

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

8 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我会这样做:

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

基础“Product”类可以具有名为“DiscountRate”的属性。对于非折扣和任何折扣价值,它可以是0。这将有助于简化计算,因为将始终应用相同的公式,只有一种情况是折扣为0。

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

答案 2 :(得分:0)

我建议也许折扣/非折扣不应该是产品类型。而是有两个子类型,以及父Product中的'discount'属性/字段。然后每个产品可以有效地享受任何折扣。这也允许折扣不固定在10%。

答案 3 :(得分:0)

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

相反,我会为Discounted / NonDiscounted和Local / ExportableProduct定义枚举。然后,每个产品类只有一个属性,每个属性都指示其类型。

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

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

答案 4 :(得分:0)

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

由于只有一件事情会发生变化(价格),您可以动态计算(折扣=> price * .9,导出=> price * .85 - 甚至两者都是>导出& discount => price * .9 * .85

答案 5 :(得分:0)

更多而不是根据类型而变化时,继承特别有用。

例如,如果折扣,税和运费方法都根据项目的类型而有所不同,那么现在绝对是考虑继承和子类化的时候(你要说“这个项目的子类型有这个税和这个折扣和这个运费“)。

另一方面,当只有一个东西根据类型而变化时,那么它是否值得拥有几种类型(即具有子类的基本类型),或者相反是否可以更简单地将该方差建模为单一类型更不明显,其实例具有属性值(例如,名为“discount_percentage”)。

答案 6 :(得分:0)

类可以区分行为集。那么让我们看看你的分歧:

  • 虽然可以说折扣/非折扣是行为的变化,但将此减少为单一行为是微不足道的:所有产品都有折扣,但折扣金额恰好为0非折扣产品的百分比。这只是您的产品的属性(discount_amount),而不是单独的类。

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

答案 7 :(得分:0)

如果全部您将需要的行为,只需在您的产品中加入两个布尔值并启用它们就是最佳解决方案。 YAGNI。

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