65.9K
CodeProject 正在变化。 阅读更多。
Home

为什么关联难以理解,不仅仅是开发者?

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (5投票s)

2014 年 11 月 21 日

CPOL

5分钟阅读

viewsIcon

14778

为什么关联如此难以理解,不仅仅对开发者而言?

类图,在 Committee 和 ClubMember 类之间有一个 chair 关联 总结来说,这个问题的答案是:因为与对象类型或类的通用概念不同,UML 定义的关联的通用概念,在常见的面向对象(OO)编程语言或 SQL 中,都没有直接的计算对应项。只有最简单的关联形式才有直接的计算对应项:一个单向函数关联对应于 OO 编程语言中的类的一个引用属性,以及 SQL 中的一个外键。但那时我们仍然有双向非函数关联在 OO 语言和 SQL 中不受直接支持。我们也可以这样表达:

面向对象编程语言和 SQL 都不支持将关联视为一流公民。

即使在 Object Management Group 的 UML 定义中,经过数百名聪明人十多年的工作成果,直到最近(2012 年 UML 2.5)才澄清了关联的“关联末端”概念,由一个关联类拥有,并引入了一种新的视觉表示法来表示引用属性,它由一个单向函数关联表示,称为“关联末端所有权”。

类图,具有引用属性 Committee::chair,引用了 ClubMember 类 我们可以通过两个类图来说明这种对应关系。在右边的第一个图中,Committee 类有一个函数引用属性 chair,它引用了 ClubMember 类。

类图,在 Committee 和 ClubMember 类之间有一个 chair 关联 在右边的第二个图中,单值引用属性 chair 以相应的功能单向关联的形式在 CommitteeClubMember 类之间可视化表示。注意在标注为“chair”的关联末端的点。这个点表示该关联末端由 Committee 拥有,这等同于之前的模型,其中 chairCommittee 的一个引用属性。

对象类型之间的关联是对这些类型对象的实例之间关系进行分类。例如,关联 Committee-has-ClubMember-as-chair,在上面第二个类图中可视化为一条连接线,可以分类 FinanceCommittee-has-PeterMiller-as-chair、RecruitmentCommittee-has-SusanSmith-as-chair 和 AdvisoryCommittee-has-SarahAnderson-as-chair 之间的关系,其中 PeterMiller、SusanSmith 和 SarahAnderson 对象是 ClubMember 类型,而 FinanceCommittee、RecruitmentCommittee 和 AdvisoryCommittee 对象是 Committee 类型。

为对象类型或类定义的属性称为引用属性,如果其值是引用某个类的对象的引用。例如,上面第一个类图所示的 Committee 类有一个引用属性 chair,其值是对 ClubMember 类型对象的引用。

引用属性对应于一种特殊形式的关联,即单向二元关联。虽然二元关联通常不需要是单向的,但引用属性代表了一个从属性的域类(定义它的地方)指向其值域类的二元关联。

通常,关联是具有两个或多个对象类型参与其中的关系类型。两个对象类型之间的关联称为二元。在本文中,我们只讨论二元关联。为了简单起见,当我们实际指“二元关联”时,我们只说“关联”。

虽然单个关系(如 FinanceCommittee-has-PeterMiller-as-chair)在业务沟通和信息系统中是重要的信息项,但关联(如 Committee-has-ClubMember-as-chair)是信息模型的重要元素。因此,软件应用程序必须以适当的方式实现它们,通常作为模型-视图-控制器(MVC)架构中模型层的一部分。不幸的是,许多应用程序开发框架缺乏处理关联所需的必要支持。

在数学中,关联已被形式化地抽象为一组同质元组,称为“关系”。在实体-关系(ER)建模中,这是信息系统和软件工程中经典的信息建模方法,对象称为“实体”,关联称为“关系类型”。统一建模语言(UML)包含了用于信息建模的 UML 类图语言。在 UML 中,对象类型称为“类”,关系类型称为“关联”,单个关系称为“链接”。

下表提供了关联功能不同情况的概述

表 1. 功能类型
功能类型 含义
一对一 既是函数又是逆函数
多对一 函数式编程
一对多 逆函数
多对多 既不是函数也不是逆函数

请注意,关联的单向性和功能类型是相互独立的。因此,单向关联可以是函数式的(一对一或多对一),也可以是非函数式的(一对多或多对多)。

当我们以 UML 类图的形式创建信息模型时,我们通常会得到一个包含一个或多个关联的模型,这些关联的末端没有定义任何所有权。当关联的两端都没有所有权点时,这意味着模型没有指定如何通过引用属性来表示(或实现)该关联。这样的关联没有方向。根据 UML 2.5 规范,这种关联的末端由它自身“拥有”,而不是由参与其中的任何类拥有。

没有关联末端所有权点的模型可以作为关系数据库设计模型,但对于经典的面向对象(OO)编程语言来说,它不是一个完整的信息设计模型。有三种方法可以将没有关联末端所有权点的模型转换为一个完整的 OO 设计模型,其中所有关联要么是单向的,要么是双向的:我们可以在关联的任一端或两端放置一个所有权点。这三种选择中的每一种都定义了一种不同的方法来使用引用属性来表示或实现关联。

您可以在我关于使用纯 JavaScript 工程前端 Web 应用的书的第三部分阅读更多关于关联的一般信息,以及如何在 JavaScript 中实现它们。

© . All rights reserved.