使用泛型函数操作整个系统的数据
3.1 简介
现在我们已经将代码从数据中分离出来,让我们来讨论一下数据本身。
给定一个设计为OO中严格的类层次结构的系统数据模型,DO规定我们将数据模型表示为Map和集合的灵活组合,其中我们可以通过信息路径访问每条信息。
本章深入探讨了DO原则#2:
NOTE 用通用数据结构表示数据实体
当我们将记录表示为字符串映射而不是从类实例化的对象时,我们提高了系统灵活性。这将数据从基于类的系统的僵化中解放出来。数据成为一等公民,具有添加、删除或重命名字段的通用功能。
操作数据的代码和数据之间的依赖关系是弱依赖关系。唯一重要的是我们要操作的字段的名称。
在本章中,我们将只讨论数据查询。我们将在第4章讨论如何管理系统状态的更改。
3.2 设计数据模型
在Simple吃午饭的时候,你和乔没有谈论编程。取而代之的是,你试着在个人层面上了解乔,谈论家庭、爱好和健康。你发现乔已婚,有两个孩子,他每天都在冥想。
食物很好吃!而且不知何故,它能帮助你消化早晨摄入的DO材料!
一回到办公室,您就询问乔关于DO之旅的下一步,即关于数据模型和数据表示…
乔:当我们开始设计我们系统的数据部分时,我们可以单独设计它。
你:你说的单独是什么意思?
乔:我的意思是,你不必费心编写代码。只有数据。
你:是的,我记得你告诉过我,这是让DO系统比OO更简单的一个关键方面。毕竟,关注点分离是我在面向对象中习惯的设计原则。
乔:的确。
你:当我们考虑数据时,我们必须考虑的唯一关系是关联和组合。
乔:正确。
你:数据模型设计会不会与我作为面向对象开发人员习惯设计的数据模型有很大不同?
乔:不太多。
你:好的。让我画一张数据实体图。
您可以查看在第2章中绘制的数据思维导图:
![](https://i-blog.csdnimg.cn/blog_migrate/bca394f89696f02703e6d5696d6f8adb.png)
您可以细化每个数据实体的字段的详细信息以及实体之间的关系类型,结果是以下数据实体图:
![](https://i-blog.csdnimg.cn/blog_migrate/36ba7d4a8e22faef6a61ef7fc0ee8db9.png)
乔:下一步是更明确地说明实体之间的关系。
你:你什么意思?
乔:例如,在您的实体图中,Book和Author通过多对多关联关系连接在一起。这种关系将如何在您的程序中表示?
你:在Book实体中,将有一个Author ID集合,在Author实体中,将有一个Book ID集合。
乔:听起来不错。那么书的ID是什么呢?
你:这本书是ISBN
乔:你把索引放在哪里,这样你就可以从ISBN检索一本书了?
你:在目录里。该目录包含bookByISBN索引。
乔:那作者ID呢?
你:Author ID是作者姓名,小写,用破折号代替空格(假设我们没有两个同名的作者)。
乔:我猜你在目录里也有作者索引吧?
你:没错!
乔:太好了。关于书和作者之间的关系,你已经百分之百明确了。我会请您对系统的其他关系也这样做。
这对你来说很容易。作为一名面向对象开发人员,您已经这样做过很多次了。下面是您的系统的详细实体图:
![](https://i-blog.csdnimg.cn/blog_migrate/4ac2900e68411f33e7d200b26d6b2175.png)
目录实体包含两个索引:
- booksByIsbn:键为book ISBN,值为book实体。其类型标注为{Book}
- AuthorsById:键为作者ID,值为作者实体。其类型标注为{Author}
在Book实体中,我们有Authors,它是[String]类型的作者ID的集合。在Author实体中,我们有图书,它是类型为[String]的图书ID的集合。
NOTE 集合和索引类型的表示法:字符串的集合表示为[String]。图书索引被标注为{Book}。在数据模型的上下文中,索引键始终是字符串
书与作者之间有一条虚线,这意味着书与作者之间的关系是间接的。要从Book实体访问Author实体的集合,我们将使用Catalog实体中定义的AuthById索引。
乔:我喜欢你的数据实体图。
你:谢谢。
乔:您能告诉我在您的图表中(实际上在任何数据实体图表中)有哪三种数据聚合吗?
你:让我看看…。我们有collections,就像书中的作者一样。我们有索引,比如Catalog中的booksByIsbn。我找不到第三个。
乔:第三种数据聚合是我们目前所说的“实体”(如图书馆、目录、图书等…)。。计算机科学中“实体”的通用术语是record。
NOTE record:record是将相关数据项组合在一起的数据结构。它是字段的集合,可能具有不同的数据类型。
你:数据实体图只由record、集合和索引组成,这样说对吗?
乔:没错。你能对实体之间的关系做出类似的表述吗?
你:数据实体图中的关系可以是组合(实线带全菱形)或关联(虚线带空菱形)。这两种类型的关系都可以是一对一、一对多或多对多。
乔:太棒了!
TIP 数据实体图由值为基元、集合或索引的records组成。records之间的关系可以是组合关系,也可以是关联关系。