本节书摘来自华章出版社《系统架构:复杂系统的产品设计与开发》一书中的第3章,第3.4节特殊的逻辑关系,作者[美]布鲁斯·卡梅隆,更多章节内容可以访问云栖社区“华章计算机”公众号查看
3.4特殊的逻辑关系
3.4.1类/实例关系
理解并管理复杂度的另一项工具,是类/实例关系。“类/实例关系”这个说法,更多地用在软件而非硬件中。类(class)是一种结构,它用来描述某种事物所共有的特征。而实例(instance)则是类的具体表现。实例也称为类的实例化。
用类和实例的关系来表示事物,是很常见的做法。比如,我们可以把某种型号的车(例如福特探险家,Ford Explorer)视为类,把具体的车辆识别代号(Vehicle Identification Number,VIN)视为该类的实例。在本例中,型号就相当于类,而序列号则相当于实例。许多计算机编程语言明确地支持类/实例关系。比如,在给某个在线服务应用程序编写Web界面时,我们可能会使用“Button”类的不同实例来表示界面中的不同按钮,当用户点击这些按钮时,它们能够完成各自不同的操作(有的按钮用来刷新屏幕,还有的按钮用来给服务器提交信息)。
我们其实已经在不经意间提到了类/实例关系。仔细看表3.1,会发现其中有两位分析师。我们可以在团队名册中先创建“Analyst”类,然后再列出该类的两个实例。如果某种实体反复地出现,或是某个类能够轻松地加以实例化,那我们就可以考虑用类/实例关系来有效地管理复杂度。比如,足球队中的11名球员及钢琴上的88个键,可以分别视为“Player”类及“Key”类的实例。
3.4.2特化关系
有一个概念与类/实例关系有关,这就是特化/泛化关系。它描述了通用的物体与一组特殊的物体之间的关系。
本书第二部分会讲到,特化操作是一种在设计中广泛使用的操作。买房时,要根据住户、预算以及装修情况等一系列因素来选择具体要买什么样的房子,而这个选择的过程就是一种特化操作。通用对象是“House”,而具体的对象则是风格各异的房屋,例如具有北美殖民地时期风格的房屋、维多利亚式房屋或现代风格的房屋等。在Team XT中,针对“Group”这个泛化的概念,我们创建了三个具体的特化物,它们分别是:需求拟定小组、设计小组,以及支持小组。
特化这一概念类似于面向对象编程语言中的继承。我们可以从某个通用的类中创建一个子类,使得该子类继承通用类中的某些属性及功能。此外,我们还可以向子类中添加一些新的属性及功能。
3.4.3递归
如果某套过程或某个对象把它自己包括进来,那么就会发生递归(recursion)。换句话说,递归就是以一种与自身相似的方式来使用实体或关系的现象。如果某例程或某功能调用了它自己,或是在系统某一层面上所采用的手法,又运用到了系统中的另一层面上,那么就出现了递归。
在Team XT这个范例中,我们稍稍使用了递归。Team XT这个大团队是由团队中的所有成员合起来构成的。而大团队中的三个小组又可以分别视为三个小团队,它们也是由其各自成员所构成的,如图3.4所示。
软件工程中经常用到递归,而且会以极其明确的方式来使用。比如,在创建由节点和边所构成的网络时,有一种实现方式是创建一个“Node”类,并令其含有一个名为“Neighbors”的属性,而该属性本身又是一个由若干Node所构成的数组。于是,Node类就成了由含有Node数组的Neighbors属性所构成的类。由于该类的定义中提到了Node本身,因此出现了递归现象。