2010-02-15 78 views
3

我有两种类型的产品 - 折扣(10%光盘)和NonDiscounted(0%),每一种可以是LocalProduct/ExportableProduct与出口一个吸引了15%的销售税。OO设计问题

什么是这个场景模型的最佳途径。 我是绝对新手,S/W的设计,我有非常有限的想法 1.有4个不同的产品分种类 2.使用策略模式,并有4个不同的策略。

能有人请建议我如何能有效地通过上述方式或其他的建模。

+0

我学得越多似乎战略模式/构成与继承/开放 - 封闭原则相比,在几乎所有不涉及类型替换(LSP)的情况下,继承的优先策略都是继承。但后来我是一个白痴。 – Will 2010-02-15 12:25:43

+0

策略模式在那里,您可以轻松地支持软件中的未来更改(新产品类型)。如果您可以想象一种适用于您的设计的软件“插件”用法,其中产品类型是插件,那么Strategy是完美的。 – Fuhrmanator 2012-04-18 13:01:54

回答

0

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

  • 虽然参数可以提出,贴现/不打折是行为上的变化,是微不足道的这种降低到一个现象:所有的产品都折扣,但非折扣产品的折扣金额恰好为0%。这只是你的产品的一个属性(discount_amount),而不是一个单独的类。

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

+0

+1为KISS和侧重于行为。 – Fuhrmanator 2012-04-18 13:03:36

1

为了使事情变得简单,问问自己,如果折扣真的需要一个亚型,或者它可能是产品,其中“NonDiscounted”有百分之零折扣的属性。

0

我建议也许贴现/ NonDiscounted不应该是型号的产品都没有。相反,有两个子类型,以及父级产品中的“折扣”属性/字段。每个产品都可以有效地享受折扣。这也允许不固定在10%的折扣。

1

我这样做:

有所谓的“产品”具有类似名称,描述,类型产品的基本属性一类等

基地“产品”类可以有属性称为“DiscountRate”。它可以为0,非折扣和任何折扣价值。这将有助于简化计算,因为相同的公式将始终适用,只是在一种情况下的折扣是0.1

然后你就可以有两班“ExportableProduct”和“LocalProduct”,他们都从“产品”类继承。

0

我会避免继承(即子打字)只是为了这一点。

相反,我会定义枚举贴现/ NonDiscounted和本地/ ExportableProduct。然后每个产品类别都会简单地为每个产品类型指定一个属性。

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

这完全定价的计算,从产品本身分离,让你随时有时复杂的定价计算在一个位置。随着您的定价方案随着时间的推移而变化,这种方法易于维护和测试。

0

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

由于只有一件事,改变了(价格),你可以计算出它的飞行(折扣=>price * .9,出口=>price * .85 - 或者当比东西根据种类而不同,即使这两个=>出口&折扣=>price * .9 * .85

0

继承是特别有用的。

例如,如果折扣,税收和运输方法根据物品的类型而有所不同,那么现在肯定是考虑继承和子类化的时候了(你会说“这个物品的这个子类型有这个税和这个折扣和这个航运“)。另一方面,当只有一件事根据类型而变化时,它是否值得拥有几种类型(即带有子类的基类型)并不明显,或者相反,是否可以将该差异更简单地建模为单个类型,其实例具有属性值(例如,名称为“discount_percentage”)。

0

当这是所有你会需要,只需在你的产品分类二布尔和他们交换的行为是最好的解决方案。 YAGNI。

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