4

我正在创建小说或书籍的面向对象表示。我正在寻找有关如何制作对象以及如何制作另一个对象的属性的设计模式或建议。

例如,假设我对小说中的人物以及他们出现在哪些章节和页面上感兴趣。

我正在努力解决的概念是如何使用两种类型的“容器”来组织一个对象系统,这两种“容器”都参与了与相同实例的关系。我想这会出现在其他系统中,其中存在底层数据的隐喻“物理”和“逻辑”视图。

这里有多种可能的对象:小说、章节、页面、角色。

这些可能的对象之间有多种关系:

  • 小说有一系列章节、一系列页面和一系列人物
  • 章节有一系列页面,以及零个或多个字符的集合
  • 页面与一个或多个章节以及零个或多个字符相关联
  • 字符与一个或多个页面和章节相关联

这些对象的目的是回答以下问题:

  • 角色爱丽丝出现在哪些页面上?
  • 第六章出现了哪些角色?
  • 哪些字符经常出现在同一页面上?
  • 第一次提到角色 Bob 是在哪个页面上?

我对如何处理这种设计有点迷茫。我看到了一些方法:

  • 将所有内容(小说、章节、页面、角色)都设为对象,并且这些对象中的每一个都有对它们包含/相关的其他对象的引用列表

  • 将章节或页面中的一个或另一个放在首位,并使另一个成为第一个的属性。例如,我们可以只使用 Novel、Chapter 和 Character 对象列表,并使“pages”成为 Chapter 对象的属性。

  • 我们可以更进一步,坚持小说和人物,给每个人物一些属性,例如:“出现在章节中”和“出现在页面上”

    好吧,我希望这对于一些 OO 设计大师来说已经足够清楚了,可以建议在哪里划清对象或属性之间的界线,以及如何设计一个对象系统,其中有不同类型的容器(章节、页面)和感兴趣的对象(字符) 属于。

4

1 回答 1

0

重要的是,您已说明您的软件的目的是回答有关本书的各种问题,包括给定页面上出现的字符。

这告诉我们两件事:

  1. 您正在寻求对特定版本的书籍的物理布局进行建模(否则上面的示例问题将毫无意义)。
  2. 您的设计将受到需要回答的问题范围的严重影响,因为这将决定您的系统是否会:

    • 使用数据结构预缓存作为答案所需的元数据(例如,显式存储一个字符出现的页面列表),
    • 存储“原始数据”(例如,作为小说树>章节>页面>文本),然后对其进行处理以回答给定问题,
    • 两者的某种组合

我怀疑您的情况可能是正确的组合,因此您的“原始数据”将以与您提到的第一种方法类似的方式表示:

将所有内容(小说、章节、页面、角色)变成一个对象,并且这些对象中的每一个都有对它们包含/相关的其他对象的引用列表”

除了 的实例Page将引用 的实例Text,而Character不是成为元数据类。

元数据可以预先缓存,或通过拖网原始数据按需生成。

无论哪种方式,您都需要规范化您的数据模型,

于 2013-05-31T04:06:10.993 回答