【问题标题】:OO Design questionOO设计问题
【发布时间】:2011-01-16 23:09:46
【问题描述】:

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

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

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

【问题讨论】:

  • 我学得越多,似乎在几乎所有不涉及类型替换 (LSP) 的情况下,策略模式/组合优于继承/开闭原则是优于继承的首选策略。但是我是个白痴。
  • 存在策略模式,因此您可以轻松地支持软件中的未来更改(新产品类型)。如果您可以为您的设计设想一种软件“插件”用法,其中产品类型是插件,那么 Strategy 是完美的。

标签: ooad


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会这样做:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              更多事物因类型而异时,继承尤其有用。

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

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

              【讨论】:

                【解决方案8】:

                当这是您将需要的全部行为时,只需在产品中添加两个布尔值并打开它们是最佳解决方案。雅尼。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-11-04
                  • 2010-09-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多