我应该如何设计电子商务 Class 图?

How should I design an E-commerce Class Diagram?

我现在正在学习软件设计。我是一名前端人员,所以这可能是一个愚蠢的问题,但我真的很想知道答案。希望你能帮助我。

我要设计一个电子商务系统。更具体地说,我正在设计电子商务中的购买系统。我已经对如何做到这一点进行了一些研究并找到了 EAV。但是在知道EAV是反模式后,我不想使用它,而且我必须保持简单,让像我这样的初学者能够理解设计。

下面是我自己设计的class图。

当然,我不认为这种设计是正确的。我花了三天时间研究和思考如何解决 ProductProductType 问题。

我只想拥有一个类似iPhone的产品,例如,具有属于phone的属性,可乐具有属于饮品的属性等

我该怎么做?

请告诉我如何用简单的方法解决这个问题,因为我是新手。也可以欣赏一些关于软件设计的文章或书籍。

谢谢 <3

基本上你知道所有的产品都有(至少)一个产品类型。你知道一个产品类型实例最终会变成饮料、电话phone等。所以,你首先需要

产品类型抽象化

您需要确保 ProductTypeinterfaceabstract class 或基数 classinterface 是声明的实体类型,其功能已知但未实现。实施 interface 的 classes 的工作是实施其方法。 abstract class 是完全声明但仅部分定义的实体类型。如果你有一个abstract class,那么你可以实现它的一些方法,但是你将它的一些方法的实现委托给它的实现子classes。基础 class 是完全定义的 class

所以你的第一个决定是 ProductType 以下之一:

  • interface
  • abstract class
  • 基础class

您需要考虑产品类型的共同能力是什么。如果它们应该有一些工作完全相同的方法,那么你不一定需要一个接口,但你将需要一个 abstract class 或一个基 class。如果您此时决定不定义 interface,那很好。如果您意识到无论如何都需要它,您可以稍后定义它。因此,假设不同产品类型的方法至少部分通用,您将需要一些 class。默认情况下,它应该是一个基础 class,即一个普通的 class,它具有 ProductType 应该实现的所有方法。不用担心,如果某些特定产品类型在某些方法中的行为方式与基本 class 相比有所不同,您始终可以 override 基本 class 子方法classes.

但是,您可能需要 abstract class。为了决定 abstract class 是否是可行的方法是找出是否至少有这样一种方法在任何情况下都不应该由基础 class 实现,因为该方法总是仅在 subclass 级已知。例如,如果您有一个 evaluate 方法,那么您可能需要为您的产品类型单独实施它,因为 phone 的评估方式与汽车不同。


接下来需要定义具体的ProductType subclasses,即classes which extends/implement ProductType.我们知道一个ProductType可能有0个或者多个Products,但是一个product可以有更多的product types吗?

处理一对多与多对多关系

如果不可能将更多产品类型与单个 Product 相关联,则产品需要具有 ProductType。否则,您将需要按产品分类的产品类型集合。


产品抽象化

由于 Product 也更通用,您可能需要从 ProductType 调用 Product 方法。这意味着您需要确定 Product 是否是:

  • interface
  • abstract class
  • 基础class

同样,与您在决定 ProductType 应该是什么时使用的思维过程相似。

产品类型和产品树

ProductTypeProduct是否可以有子类型、子子类型等是个大问题。如果是这种情况,您将需要根据需要为它们实现具有适当 insert/update/delete/search 功能的树

使用你的抽象

尽可能不要引用特定的产品类型,因为这样您就必须复制粘贴其他产品和产品类型的代码。只要您的所有产品类型或产品都具有相同的模式,请按最 abstract 的表示(分别为 interfaceabstract classbase class 来引用它们,并且仅使用实例化时和被迫时的具体类型。

工厂

使用工厂方法而不是构造函数进行实例化,因为工厂方法可以 return 子类型的实例,如果您需要的话。