小说/书籍的面向对象设计方法

4
我正在创建一个小说或书籍的面向对象表示。我想寻求关于如何制作对象以及将什么作为另一个对象的属性的设计模式或建议。
例如,假设我对小说中的角色以及他们出现在哪些章节和页面感兴趣。
我正在努力理清一个带有两种类型“容器”的对象系统如何组织,这两种类型的容器都与相同的实例参与关系。我想象这种情况也会出现在其他系统中,其中底层数据存在隐喻性的“物理”和“逻辑”视图。
这里可能有各种各样的对象:小说、章节、页面、角色。
这些可能对象之间存在着多种关系:
- 小说由一系列章节、一系列页面和一组角色组成 - 章节由一系列页面和零个或多个角色组成 - 页面与一个或多个章节相关联,与零个或多个角色相关联 - 角色与一个或多个页面和章节相关联
这些对象的目的是回答以下问题:
- Alice出现在哪些页面上? - 有哪些角色出现在第6章? - 哪些角色经常同时出现在同一页上? - Bob第一次在哪一页提到?
我有点迷失在如何处理这种设计方案的思路中。我看到了几种方法:
- 使所有对象(小说、章节、页面、角色)都成为对象,每个对象都有对其包含/相关对象的引用列表 - 给章节或页面中的一个赋予首要地位,并将另一个作为第一个对象的属性。例如,我们可以只使用小说、章节和角色对象列表,并将“页面”作为章节对象的属性。 - 我们甚至可以进一步采取上述想法,只使用小说和角色,并给每个角色一些属性,例如:“出现在章节”和“出现在页面”。
希望这足够清晰,让面向对象设计专家建议如何划分对象或属性之间的界限,以及如何设计一个对象系统,其中存在不同类型的容器(章节、页面),感兴趣的对象(角色)属于这些容器之一。
1个回答

0

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

这告诉我们两件事:

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

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

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

使所有内容(小说、章节、页面、角色)成为对象,每个对象都有与其包含/相关的其他对象的引用列表

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

元数据可以预缓存,也可以通过遍历原始数据按需生成。

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


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