ERD图转换为UML图

3
我有一个电子商务ERD图,其中包含以下实体:产品标签产品标签类别等实体。

enter image description here

我尝试将其转换为以下的类图:

1- removed the id

2- converted the foreign key into object of the type i'm refering to(product_id converted into => product: Product)

我的问题是,这种方法对所有实体都是好的吗?它是否达到了SOLID原则?我有一个演示要在两天内进行,我想确信我所做的事情。任何评论或修改都足够了。我还选择了这些表,因为它们代表一对多和多对多关系。提前感谢您。 enter image description here

乍一看:看起来还不错。但“has”没有意义。交流连接器有缺陷。由于没有语义,共享聚合是多余的。 - qwerty_so
抱歉,英语不是我的母语,你建议我用什么来替换“has”?我不明白“AC连接器存在缺陷”的意思。共享聚合没有语义,这是什么意思?我不理解,请您能否详细描述一下您的评论,并使用简单的语言? - esraa
2个回答

2

基本上你的方法是正确的。只是你对几个UML规范理解有误。

  1. 连接器中间的标签只是连接器的名称。除非进行一些 OCL 巫术,否则这个名称是没有意义的。有一种方法可以用黑色三角形来装饰它,以显示阅读方向。这有时有助于业务人员理解类之间的关系(参见 UML 2.5 第202页上的图11.27)。但通常情况下,您不会使用它。

  2. 共享聚合没有语义(UML 第110页:表示属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。)。所以不要使用开放式菱形。组合(填充式菱形)可用于显示责任(当我被杀死时,我将首先杀死我的组合)。通常它增加的太少,真正有用的只是让无用的组合讨论变得更加激烈。

  3. 导航方向是不正确的。中间的 AC 看到了两个连接的类,所以它没有箭头。如果您有额外的(有向)关联,则将其作为单独的(额外的)连接器放置。在这种情况下,将角色名称放置在任何一端。这比简单的箭头更清晰地导航。我个人只在草图上使用箭头。

顺便说一下,我注意到您的类中有与该类相同且采用一个参数的操作。我猜测您打算在此处显示构造函数。在这种情况下,您将使其为 Classname():Classname 并仅提供构造函数所需的参数。否则,这些操作似乎没有太大意义。同样,CRUD 操作似乎适用于一个“自身”的列表,这也可能不是所期望的。您应该拥有一个集合类来处理基类,其中这些操作具有意义。因此,总结一下:您只会添加用于匹配表格列的(私有)属性的getter/setter操作。

P.P.S.: 根据Christophe的评论,用一个<<create>>型别标识类的实例化操作是个好主意,以突出它的目的。请参见UML 2.5的第196页: enter image description here 这种型别是标准的一部分(请参见第677页),第678页上的表格指出:

指定指定的特征创建附加到特征的分类器的实例。


非常全面的回答!我一直在想,在构造函数之前是否应该正式地有一个“创建”或者它是可选的。 - Christophe
@Christophe 我不认为这是必要的,但在任何情况下突出构造函数都是一个好选择。我会添加这个信息。 - qwerty_so
如果我可以重新投票或超级投票,我会这样做;-) - Christophe

2
关于您的建模问题,已经有一个完美答案。为了记录,我仍然想在SOLID部分添加一个补充答案:
单一职责原则:您的类具有多个更改原因,因为您可能想要更改“产品”本身(例如添加更多与产品相关的属性),但您也可能想要更改类以添加新的“getByXxx()”操作,以根据其他条件在数据库中查找产品,而与产品实际上是什么无关。因此,它不符合单一职责原则。
开闭原则:我们无法判断。
里氏替换原则:在没有继承的情况下,这并不相关。此外,如果没有前置条件、后置条件和不变量约束,您无法判断。
接口隔离原则:可能不符合,因为您强制实施了一个隐式接口,所有继承类都必须提供它,即使它们不需要(例如,不存储在数据库中的产品)。朝着正确方向迈出的第一步是使用公共数据库操作的接口。
依赖反转原则:我们无法判断,但可能不符合,因为update()、delete()等可能取决于某个数据库,因此您无法将其切换到另一个数据库。使用DIP,您可以在使用它的类中注入数据库,以便您随时注入提供相同接口的另一个数据库。
你没有问,但是你的设计似乎对应于Active Records。如果你想要更清晰、更符合SOLID原则的设计,你应该将与数据库有关的代码分解到repositories或者table data gateways中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接