Oop 简单应用程序的类图

Oop 简单应用程序的类图,oop,class,uml,aggregation,Oop,Class,Uml,Aggregation,假设我们有3个实体:库、节和书 库由几个部分组成。一个部分有几本书籍 一本书只能属于一个部分。最后,部分可能只属于1个库 在我看来,classLibrary聚集了部分的集合,class部分聚集了书籍的集合 现在我需要把所有的书上传到服务器上。我构建了一个类BookUploader,它在构造函数中接受一个Book对象。在服务器上,我为每个库创建了一个文件夹,在每个库中,我将创建一个节文件夹并将书放入其中 问题是因为我将一个Book对象传递给BookUploader,所以我不知道它的部分是什么。此外

假设我们有3个实体:库、节和书

库由几个
部分组成
。一个
部分
有几本
书籍

一本
只能属于一个
部分
。最后,
部分
可能只属于1个

在我看来,class
Library
聚集了
部分的集合
,class
部分
聚集了
书籍的集合

现在我需要把所有的书上传到服务器上。我构建了一个类
BookUploader
,它在构造函数中接受一个Book对象。在服务器上,我为每个库创建了一个文件夹,在每个库中,我将创建一个节文件夹并将书放入其中

问题是因为我将一个Book对象传递给BookUploader,所以我不知道它的部分是什么。此外,我不知道哪个部分属于哪个图书馆

所以我想我只需将Library对象传递给BookUploader,然后循环所有部分,然后循环每个部分中的所有书籍,但有人告诉我,现在BookUploader依赖3个类来上传一本书,这是一个糟糕的设计

他建议每本书的对象都应该包含它的部分,每个部分都应该包含它的库,这与我最初的设计完全相反

谁能分享一下他对哪种设计更好以及为什么更好的想法


提前感谢。

将聚合定义为双向关联的一端没有错。(请查看或查找示例。)


如果您正在查找实现细节,请查看例如EReferences中的ecore功能。

将聚合定义为双向关联的一端没有错。(请查看或查找示例。)


如果您正在寻找实施细节,请查看例如EReferences中的ecore功能。

阅读@Chad的评论后,我意识到设计本身需要对相关实体进行一些修改。
在每个子类中缺少一个函数,该函数将返回对其父类的引用。

阅读@Chad的评论后,我意识到设计本身需要对相关实体进行一些修改。
缺少的是每个子类中的一个函数,该函数将返回对其父类的引用。

您的设计如何强制将“书籍”放在单个部分中?你的意思是它强制一本书的一个实例在一个章节中?如果是这样的话,那是真的,但是同一本书的多个“副本”又如何呢?这些副本可以分散在多个部分中,除非你总是小心地正确构建它们。因为你在模拟现实世界的情况,所以想想在现实世界中是如何处理的。一本书几乎总是以某种方式印有图书馆和部门信息,图书馆/部门也可能有一份可用的书籍列表…@Chad是的,在我的设计中,一本书只有一份。我的问题是哪个对象应该包含另一个?Library对象应该包含一个节集合,还是每个节都包含一个Library对象?这似乎非常合适,但回到了您最初的问题,即如何处理book->Library关系(与您目前尝试建模的相反)。假设你在外面的地上找到一本图书馆的书。你怎么知道这是一本图书馆的书?书上有记号笔告诉你吗?我打赌有…@Chad+1实际上你是对的。每本书都应该知道它的图书馆。我缺少的是子对象中获取父对象引用的函数。这一点很简单,但一旦你掌握了它,它就真的有意义了:你的设计是如何将一本“书”放在一个单独的部分的?你的意思是它强制一本书的一个实例在一个章节中?如果是这样的话,那是真的,但是同一本书的多个“副本”又如何呢?这些副本可以分散在多个部分中,除非你总是小心地正确构建它们。因为你在模拟现实世界的情况,所以想想在现实世界中是如何处理的。一本书几乎总是以某种方式印有图书馆和部门信息,图书馆/部门也可能有一份可用的书籍列表…@Chad是的,在我的设计中,一本书只有一份。我的问题是哪个对象应该包含另一个?Library对象应该包含一个节集合,还是每个节都包含一个Library对象?这似乎非常合适,但回到了您最初的问题,即如何处理book->Library关系(与您目前尝试建模的相反)。假设你在外面的地上找到一本图书馆的书。你怎么知道这是一本图书馆的书?书上有记号笔告诉你吗?我打赌有…@Chad+1实际上你是对的。每本书都应该知道它的图书馆。我缺少的是子对象中获取父对象引用的函数。这一点很简单,但一旦你掌握了它,它就真的有意义了:D