0

我正在和几个同事一起在一个网站上工作,我们在如何看待类架构方面存在一些差异,所以我也发布了这个,看看更大的社区对这个问题的看法,因为我想很多人都在类似的情况。

我们正在使用 MVC 方法,模型通过活动记录模式实现。其中一个模型是与我们数据库中的产品表相关的“产品”模型。问题是,我们有两种主要类型的产品——有形的(type = 1)和无形的(type = 2)。在整个代码中,我们将有大量与此类产品相关的逻辑。(如果有形就这样做,如果非有形就这样做……)

所以一种方法是 - 创建类 TangibleProduct 和 NonTangibleProduct 并通过工厂获取其中一个。当然,这些类将具有重复的方法,即 isTangible() 或 isNonTangible() 将存在于两个类中,但在一种情况下会返回 true,而在另一种情况下会返回 false。(这只是一个例子)。我希望在类中看到至少大约 30 种不同的方法,它们将根据产品类型返回不同的值。

另一种方法是只有一个 Product 类,并在每个方法中实现 IF 块,如果产品是有形的或无形的,则执行逻辑并返回结果。

我知道这是一个模糊的问题,但我确实认为大多数在 OO 环境中工作的人在某些时候都有类似的情况......

您是否看到选择一种方法而不是另一种方法的任何长期后果,您认为哪种方法比另一种更好或更差?

编辑:对不起,我可能不太清楚。这两个类将扩展 Product 类。(即“class TangibleProduct extends Product”和“class NonTangibleProduct extends Product”)

谢谢

4

3 回答 3

2

从架构上讲,由于有形产品和无形产品之间的区别在您的领域中非常重要,因此最好的方法是拥有单独的类TangibleProduct并将IntangibleProduct两者作为实例实现来处理IProduct(第一种方法的变体)。如果您的 ORM 工具允许您这样做,那么一切都很好。

应该非常非常努力地避免第二种方法。

于 2012-09-03T10:40:57.580 回答
1

在 OO 中,通常建议在类层次结构中进行这种区分。

如果您使用工厂方法来创建正确的子类,您只需在创建时执行一次条件逻辑,而不是在行为变化的每个方法中执行一次。

您还可以更轻松地添加新类型。如果决策逻辑在许多方法中重复,则必须全部更改。如果它被整合到一个工厂中,你只需要在那里添加一个分支并实现新的子类,并且所有现有的子类可以经常保持不变。

于 2012-09-03T10:47:40.420 回答
0

如果无法访问您的全部要求,很难说清楚。

这主要取决于是否会有任何非平凡的方法

  1. 有形和无形产品的行为非常不同。
  2. 只有在有形或无形产品的背景下才有意义。

当你最终创建了很多看起来像这样的方法时:

public void doSomething()
    if (isTangible) {
        [...loads of code...]
    }
    else {
        [...loads of different code...]
    }
}

单独上课会更好。

于 2012-09-03T10:44:56.800 回答