1

假设我有一个类 Product {string name; 双倍价格;...}

因此,如果我想实现季节性产品或打折产品,我可以添加声明 isPromoted/isSeasonal 或者我可以创建一个新类promotedProduct : Product {...}、seasonalProduct : Product{} 等等。

有人告诉我,初学者倾向于滥用继承以及它是多么邪恶。所以我不确定在这种情况下我是否被认为是滥用。或者他们都错了,使用界面更好等等。

4

3 回答 3

1

一个好的经验法则是将变化与不变分开。

您不能在运行时更改类型,但您可能希望能够轻松提升/降级产品。

一种选择是将状态作为字段直接存储在 Product 上(但如果它们累积起来会变得很难看,isLowInStock 等)。

可能更好的操作系统将 Product 视为一个实体,并通过以下方式分隔 isPromoted/isSeasonal 状态:

  1. 使用State 模式来封装状态(您可以使用Strategy将特定行为与状态更改联系起来)
  2. 将状态外部化并进行服务调用

使用#1 来防范未来的变化(即更多字段)。#2可能是矫枉过正。

请不要使用 double 来表示价格- 请参阅此问题google

于 2013-08-23T23:56:34.280 回答
1

产品是否只是在促销 - 即 - 没有实际的促销细节(不同的费率,日期等) - 如果您想要您的第一个解决方案。否则,您将需要与存储此类详细信息的 Promotions 类的关系。

希望这可以帮助。

注意:这是一个从未亲自使用过 Java 的通用编程答案。

于 2013-08-23T23:54:24.483 回答
0

季节性或打折产品是否添加属性?他们有不同的行为吗?这就是推动继承的原因。我怀疑他们的行为没有真正的区别,他们所携带的属性也没有真正的区别。

因此,我将折扣简单地视为每个产品都具有的属性:任何产品都可能进行销售并获得折扣,因此我有一个属性指示当前折扣百分比或金额(可能默认为零,或也许它可以为空。同上季节性:那应该只是一个布尔标志吗?

于 2013-08-24T00:00:15.677 回答