vtk教程第二章 面向对象的设计

46 篇文章 19 订阅
12 篇文章 15 订阅
  • 2.1 概述1引言最近

面向对象系统在计算机工业中越来越普遍是有充分理由的。与传统的过程系统相比,面向对象系统更加模块化,更容易维护,也更容易描述。由于可视化工具包是使用面向对象的设计和实现的,因此我们将本章用于总结面向对象设计和实现的概念和实践。今天的软件系统试图解决复杂的、现实世界的问题。严格的软件设计和实现方法可以减轻这种复杂性的负担。

如果没有这样的方法,软件开发人员会发现很难满足系统的规范。此外,随着规范的变化和增长,没有坚实的底层架构和设计的软件系统将难以适应这些不断扩展的需求。我们的可视化系统是复杂软件的一个很好的例子,需要在设计时考虑到可扩展性。数据可视化是一个迅速发展的领域,每年都会引入可视化技术。任何希望融入未来创新的系统都必须有一个底层设计,支持新材料的添加,而不会对现有系统产生重大影响。

面向对象设计是一种软件工程方法,它可以轻松地处理复杂性,并为以后的更改和添加提供框架。面向对象的设计过程试图将复杂的任务划分为称为对象的简单小块。对象VTK设计师图片由vcreatelogic.com提供。面向对象设计是计算机抽象,它对被模拟系统的物理或抽象部分进行建模。面向对象的设计方法提供了识别系统中存在的抽象并对对象的行为建模的机制。

2.2优秀软件设计的目标

软件设计的质量很难衡量,但是一些定性的方面可以指导我们。一个好的软件设计应该是健壮的、可理解的、可扩展的、模块化的、可维护的和可重用的。

一个健壮的系统可以优雅地处理异常情况,并且行为一致。健壮性使软件开发人员相信,即使系统在不同于最初实现者预期的环境下使用,系统的底层组件也会按照预期的方式工作。一个可理解的系统可以由原始实现者以外的人使用。

这一制度的使用应该是合乎逻辑和合理的。系统组件的名称应该来源于问题域。可扩展系统在接受新任务的同时仍然执行它们最初打算执行的任务。系统应该在不破坏现有软件的情况下接受新形式的数据和新算法。

向系统添加一个新的原语不应该导致系统的大部分被修改。经验表明,系统中修改的现有代码越多,引入错误的可能性就越大。模块化软件系统将系统组件之间存在的关系数量最小化。紧密耦合的系统组件应该在逻辑上分组在一起,并遵循公共命名约定和协议。

在系统设计过程中,软件维护经常被忽略。然而,系统的总成本包括维护和原始开发。一个软件系统是可维护的,如果问题是容易隔离的,并且修复一个问题不会在系统的不相关部分引入问题。

最后,软件开发的经济学要求我们尽可能多地利用我们过去的工作。在理想的情况下,在现有系统中实现新技术应该是一项简单的任务。在软件系统中很少出现这种情况。创建可重用的软件组件可以减少重复工作,并在系统中促进一致的接口。然而,正如我们在本书中所看到的,创建可重用的软件通常需要额外的努力。个人的短期生产力观点与软件开发组织的长期生产力观点相冲突。

2.3面向对象概念

对象是面向对象系统中的主要概念。对象是一种抽象,它封装了系统中实体的属性和行为。每个对象都有一个标识,将其与系统中的其他对象区分开来。通常,一个对象的可区分的方面是明显的。例如,颜色、屏幕上的位置、大小或内容的差异将计算机桌面上的一个窗口与另一个窗口区分开来。但是,外观可能具有欺骗性,即使两个具有所有相同特征的物体仍然可能具有不同的身份。2.3面向对象概念17可能有相同的制造商、型号、选项和颜色,但仍然是两辆不同的汽车。现实世界通过车辆识别码来区分这两辆车。同样地,处理多个实体的编程系统需要一个标识机制。在系统管理的符号表中,指向已分配内存的指针或变量名通常用于区分系统中的对象。在数据库系统中,一组标识符键(称为n元组)标识系统中的一个实体。

但是,面向对象的系统与传统的过程式编程系统有什么不同呢?主要的区别在于这两种方法处理数据抽象的方式。传统系统将抽象限制为数据类型,而面向对象系统为数据和可应用于数据的操作创建抽象。事实上,面向对象的系统将数据和操作一起保存在一个称为对象的编程构造中。数据和操作一起构成对象的属性。当一个操作应用于一个对象时,编程语言的动态绑定机制执行适合于该对象的过程。在面向过程的系统中不是这样的。程序员必须提供逻辑来决定调用哪个过程。处理多种类型的系统通常使用case语句来为操作选择适当的过程。随着新类型被添加到这些系统中,必须扩展基于数据类型分派操作的代码来处理新类型。例如,在一个显示不同类型的原语的程序中,下面的伪代码显示了面向过程的系统与面向对象的系统的不同之处。

程序导向(C语言):

Primitive *aPrim;

...

DrawPrimitive (aPrim)

程序DrawPrimitive (aPrim)

{

if (aPrim->type == TRIANGLE) then DrawTriangle (aPrim)

else if (aPrim->type == SQUARE) then DrawSquare (aPrim)

else if (aPrim->type == CIRCLE) then DrawCircle (aPrim)

}

面向对象(在c++中):

aPrim→画();

...

在这个项目存在的后期,有人可能想要添加一个新的原语,比如说一个二次元。负责这项艰巨任务的人必须在现有系统中搜索第一个示例中出现的所有if语句,并为新的二次型添加一个测试。当然,优秀的程序员会将代码隔离在一个位置,就像我们在这里所做的那样,因此任务更容易。尽管如此,程序员必须首先意识到原来的程序员有足够的技能将绘图代码模块化,然后找到代码(不一定知道过程名称)并修改代码。更复杂的是,一个由多个程序构建的系统(18 Object-Oriented Design mer)无疑将处于配置管理系统之下,需要检出、编辑和检入周期。面向对象程序员有一个更简单的任务。参考为原语定义对象属性的设计文档,程序员向二次元对象添加了一个绘制操作。新的原语对系统可用,而无需更改任何现有代码!

当然,这是一个过于简化的例子。但是回想一下您过去编写的程序,并记住添加新数据类型是多么困难。您的更改是否与您添加的新代码隔离?你是否必须编辑不是你写的或者可能不理解的代码?在阅读数据可视化库的面向对象实现时,请记住这个示例。在更详细地描述面向对象设计和编程之前,我们提供了一个观察和预测。在我们使用面向对象方法设计和实现软件的这几年里,我们注意到刚接触这项技术的人会说:“但我已经是这样写程序了。我的系统是模块化的;他们健壮;我可以很容易地添加进去。”如果在读完本书后您仍然有这种感觉,请不要责怪面向对象的方法。相反,我们作为作者失败了。然而,这样的负面反应是不太可能的。根据我们的经验,用户在短时间内就能适应这种方法。特别是当它们通过现有的、设计良好的面向对象系统引入到对象中时。您将到达“啊哈”阶段,在此之后,如果不寻找问题中的对象,就很难开始软件项目。

2.4面向对象术语

与任何软件工程设计方法一样,面向对象设计也有自己的术语。不幸的是,并不是每个人都同意这是什么。我们采用了来自Rumbaugh [Rumbaugh91]和Stroustrup [Stroustrup84]的许多术语,因为可视化工具包是用c++编写的。在大多数情况下,Rumbaugh的术语是独立于编程语言的,而Stroustrup是特定于c++实现的。不过,从设计到编程的过渡并不痛苦,而且两个术语之间的映射非常明显。在我们认为可能有混淆的地方,我们会指出对应关系。

什么是对象?

对象是对系统中实体的状态和行为进行建模的抽象。抽象是一种为了特定目的而提取某种情况的基本方面的心理过程。实体是系统中具有同一性的事物。椅子、飞机和相机都是与现实世界中的物理实体相对应的对象。二叉树、符号表和有序集合是仅存在于计算机科学世界中的对象。

图2 - 1是当我们将系统组件的状态和行为映射到对象时所发生的抽象的一个例子。这里的对象是一种特殊类型的树:一棵针叶橡树。在这个应用程序中,我们希望在一个季节的过程中模拟各种类型的树木的生长。出于我们的目的,我们决定重要的状态变量是树的年龄、树干直径、高度和习性(即生长形式)。为了捕捉针叶橡树的行为,我们有方法来模拟生长和相应的春季、夏季、秋季和冬季的季节影响。还有一些方法(没有显示)用于设置和获取当前状态变量。

图2-1将现实对象映射到抽象对象。现实世界的对象是各种类型的树。其中一个对象(一棵橡树)被映射到我们调用的计算机对象

PinOak。

我们将对象的状态称为其属性(也称为实例变量),并通过应用于对象的操作定义其行为。属性有名称、数据类型和数据值。属性的数据类型可以是编程语言中的基本类型(如c++中的char或float),也可以是另一个对象。例如,可视化系统中的vtkTransform对象具有类型为vtkMatrix4x4的属性,这是另一个对象。vtkMatrix4x4的属性是c++中声明为浮点值的基元值数组。

操作是可以应用于对象的函数或转换。操作定义对象的行为。特定对象的操作是在我们称为方法的过程中实现的。一个对象的属性和操作共同构成了它的属性。二维线形图可以具有包括x轴和y轴、图例和连接点集的属性。此图形具有在窗口中绘制图形的方法。它还有一些方法,可以让用户指定要绘制的轴、数据和图例。

可以使用分类过程对具有相同属性的对象进行分组。对象类(通常简称为类)指定类中所有对象都具有的属性。该类只指定属性的名称,而不指定属性的具体值。不同的类可以(而且通常)具有在其他类中存在的名称的属性。可视化系统中的许多类都有一个名为Position的属性。虽然我们的可视化系统中的摄像机和演员都有这个属性,但由于它们是不同的类,所以对它们的影响是不同的。属性名由给定类中的所有对象共享,但为每个对象的属性值分配单独的存储空间。

当具有相同名称的操作应用于不同类的对象时,我们称之为多态操作。例如,我们的可视化系统有一个名为Render()的操作,可以应用于许多不同的对象。特定类的操作的实现称为方法。vtkMatrix4x4对象的打印操作在其print方法中实现。也就是说,存在知道如何打印类vtkMatrix4x4的对象而不是其他类的对象的代码。对象知道使用哪个方法,因为它们保存在每个对象的数据结构中。在大多数系统中,方法的代码由同一类中的所有对象共享。一些编程语言,包括c++,通过结合操作名称及其参数类型来定义方法。这个过程被称为重载操作,是一个强大的图2-1映射一个真实世界的对象到一个对象抽象。现实世界的对象是各种类型的树。其中一个对象(一棵橡树)被映射到我们称为PinOak的计算机对象中。PinOak年龄高度树干直径习惯生长()SetSeason()抽象对象名称属性或实例变量操作或方法20面向对象的设计技术,允许相同的名称用于逻辑上相似的操作。例如,下面的类定义定义了三种计算数字平方的方法。尽管这些方法具有相同的操作名称,但它们是唯一的,因为c++同时使用操作名称和操作参数类型。

class math

{

float square(float x);

int square(int x);

double square(double x);

}

为了某种目的使用类的成员,我们创建类的实例(实例化的过程)。实例创建建立实例的标识,包括指定其初始状态。实例的类在创建过程中充当实例的模板,定义其每个属性和操作的名称。创建建立了这个实例与同一类的其他实例之间的异同。相似之处是其属性的名称和类型以及实现其操作的方法。区别在于属性的具体值。创建类实例的细节因编程语言的不同而不同。在c++中,程序使用声明式形式创建实例,如

vtkActor aBall;

它从程序堆栈中创建一个对象,或者通过应用新的操作

vtkActor *aBall = new vtkActor;

它从程序堆中创建对象。

继承

继承是一种编程机制,当新类与现有类有细微差异时,它可以简化向系统添加新类。继承的概念是通过观察到大多数系统可以使用层次分类系统来指定的。分类系统的一个很好的例子是地球上的生命门。

前面我们创建了一个对应于橡树的对象。使用继承可以更彻底地描述树的属性(图2 - 2)。这里显示的分类是基于Margulis和Schwartz的五王国系统[Margulis88]。在这个系统中,生物群被划分为原核生物(细菌)、原生生物(藻类、原生动物和黏菌)、真菌(蘑菇、霉菌、地衣)、植物(苔藓、蕨类、球果和开花植物)和动物(有脊椎和没有脊椎的动物)这五个王国之一。在这一层次之下,我们有分类:科、目、科、属和种。该图显示了针叶栎的王国、分类、纲、属和种。

将对象组织到继承层次结构中提供了许多好处。一般分类的属性也是它的子分类的属性。例如,我们知道所有种类的栎属植物都是橡子。从软件的角度来看,这意味着任何实例变量

图2-2针橡树的继承层次。

父类的方法会被它的子类自动继承。这允许我们通过修改它们的超类同时对许多对象进行更改。此外,如果我们希望向层次结构中添加一个新类(比如一棵红橡树),我们可以在不复制现有功能的情况下这样做。我们只需要通过添加新的实例变量或重载现有方法来将新类与其他类区分开来。快速添加与现有类略有不同的新类的能力提高了系统的可扩展性。

继承可以使用称为专门化的过程自顶向下派生,也可以自底向上创建,在称为泛化的过程中组合类似的类。继承的使用意味着一个类层次结构,其中一个或多个类是一个或多个子类的超类。子类继承父类的操作和属性。

在c++中,子类被称为派生类,超类被称为基类。子类可以添加额外的操作和属性来修改它从超类继承的属性。通过这种继承,对象可以显示其超类的行为以及它希望的任何其他行为。它还可以限制或重写由其超类实现的操作。仅作为其子类的超类而存在的类称为抽象类。抽象类的实例创建通常是被禁止的。抽象类对于收集所有子类将使用的属性和方法非常有用。它们还可以为它们的子类定义行为协议。这是继承的强大应用,将在可视化系统的设计中体现出来。抽象类可以执行复杂的序列、控制协议,并确保行为一致。它们从各个子类中去掉了复杂协议的责任,并将协议隔离在超类中。一个简单的绘图包示例说明了抽象类的强大功能。

考虑一个允许各种二维绘图的数据表示应用程序。此应用程序必须支持折线图、水平柱状图和垂直柱状图。图2-2橡树的继承层次结构。原核植物原生植物真菌动物生物群植物被子植物栎树双子叶植物掌叶植物王国划分类属种22面向对象的设计,包括标题,轴和图例。然后,我们创建一个名为TwoDPlot的抽象类来包含这些公共属性。常见行为也可以在TwoDPlot的plot方法中捕获:

Method Plot {

Draw the border

Scale the data

Draw the axes

Draw the data

Draw the title

Draw the legend

}

抽象类可能为每个操作提供默认行为,也可能不提供。在本例中,可能会提供边框和标题绘制的默认行为。然后,TwoDPlot的子类将为其他方法定义自己的函数。协议规范明确说明了TwoDPlot的子类应该响应哪些方法。在上面的例子中,子类需要定义自己的方法来绘制轴、数据和图例。

一些子类可能会使用TwoDPlot的方法来绘制边界,其他子类可能需要这个方法的自己版本。TwoDPlot中定义的抽象接口使添加2D图的新类变得更容易,生成的子类往往更加统一和一致。另一种机制,委托,对于隔离和重用行为很有用。使用委托,对象将操作应用到其对象属性之一。例如,在可视化工具包中,vtkTransform对象将其Identity()操作委托给它的vtkMatrix4x4属性。然后,vtkMatrix4x4的实例执行该操作。还有许多更有用的面向对象的概念,但目前我们有足够的信息来描述如何使用对象来设计系统。

2.5面向对象建模与设计

任何大型软件系统的设计都是一项艰巨的任务,而系统设计的第一步往往是最具挑战性的。无论我们选择何种设计技术,我们都必须对系统的应用领域有透彻的了解。如果没有对底层硬件控制系统的详细了解,很难想象如何设计一个电传飞机控制系统。当然,并非所有的飞行系统软件都是由航空工程师设计的,因此一定存在某种形式的系统规范。

规范中信息的深度因应用而异。面向对象系统设计从建模步骤开始,该步骤从问题声明或软件需求规范中提取对象及其与其他对象的关系。首先,设计师必须完全理解要解决的问题。这通常需要对问题领域有深入的了解,或者访问要解决的问题的详细规范。然后,必须在系统中确定主要的抽象。在这个高级设计阶段,抽象将成为第一组对象。例如,一个跟踪投资组合的系统将需要诸如股票、债券和共同基金等对象。在计算机动画系统中,我们可能需要演员、摄像机和灯光。一个医学计算机断层扫描系统- 2.5面向对象的建模和设计23 tem将有一个表,x射线源,探测器和龙门架。我们的可视化系统将有模型、等值面、流线和切面。

在这个建模步骤中,我们在问题域中搜索对象、属性和关系。之后,在多次设计过程中,模型将被扩展。建模是大多数设计过程中的一个步骤,无论我们是在设计船舶、房屋、电子系统还是软件。每个学科都遵循一种方法论,该方法论使用专门创建的技术,使设计过程高效且有价值。这些技术就是所谓的“行业工具”。电气工程师使用原理图和逻辑图,建筑师使用图纸和实物模型,造船工人使用比例模型。同样,软件设计人员需要能够帮助创建系统模型的工具。软件工具应该具有足够的表达能力,以帮助软件设计人员根据规范评估设计,并帮助将该设计与软件团队中的其他人进行交流。

我们使用由Jim Rumbaugh和他的同事在GE开发的对象建模技术(OMT) [Rumbaugh91]。OMT使用三种模型来指定面向对象的设计:对象模型、动态模型和功能模型。每个模型都描述了系统的不同方面,并且每个模型都有相应的图表技术来帮助我们分析、设计和实现软件系统。

  • word对象模型

对象模型标识系统中的每个对象、它的属性以及它与系统中其他对象的关系。对于大多数软件系统,对象模型主导着设计。OMT图形化技术使用矩形来描述对象类,使用各种连接器来描述继承和其他对象-对象关系。对象类表示为实心矩形。实例用虚线矩形表示。类或实例的名称占据矩形的顶部。用一行将类名与包含属性的下一节分隔开;第三部分描述了这些方法。对象之间的关系用连接两个相关对象的线段来表示。在OMT中,关系称为关联,它们可以具有各种基数:一对一、一对多和多对多。表示其他对象容器的特殊关联称为聚合。关联可以用角色来标记。(角色是给予关联的名称,用于进一步描述关联的性质。)OMT用一个三角形表示继承,父类附加到顶点,子类附加到三角形的基。图2 - 3显示了虚拟现实系统中定位设备的对象模型。

类层次结构中的第一个对象是locator。这个抽象类为所有定位器指定了公共属性和方法。locator的子类是locator2D和locator3D。在该对象模型的当前呈现中,定位器只有一个属性、一个设备和两个方法open()和close()。locator的两个子类locator2D和locator3D也是抽象类,包含基于空间维数区分它们的属性和方法。例如,locator3D有一个x, y, z位置,而locator2D有一个x, y位置。这两个定位器都有一个locate()方法,用于更新当前位置。在3D定位器类中,locate()也更新方向。locator3D的子类包括来自三个不同制造商的硬件:flock、pixsys和logitek,以及一个铰接定位器抽象类。硬件的三个对象类包含特定于每个设备的方法。每种方法都知道如何转换设备返回的特定于硬件的代码。他们知道这一点

被认为是locator3D子类,它们必须实现一个位置和方向操作,提供x, y, z坐标和三个角旋转,可以组合成一个变换矩阵。对象模型还向我们展示了铰接定位器具有角度和连杆。两种具体的铰接定位器是浸入式和幻影式。以这种方式绘制的对象模型可以作为设计和讨论的起点。它揭示了常见的方法和属性以及每个类的区别特征。稍后,在实现过程中,我们将把这些对象模型转换为软件对象。我们为实现所选择的特定计算机语言将规定转换的细节。

定位器设备打开关闭locator2D位置(x,y)定位触摸屏位置鼠标位置定位器3d位置(x,y,z)定位前向上定位铰接角度连杆logitek位置定位pixsys位置定位flock位置定位浸入位置定位幻影位置定位图2-3定位器设备的对象模型25动态模型对象模型描述了系统的静态部分,而动态模型详细描述了系统的事件序列和时间依赖性。OMT使用状态图对系统动力学建模。动态模型经常被用于设计控制系统和用户界面。我们的可视化系统具有有限的序列和控制方面,因此我们将不详细讨论状态图。但是,如果我们要为数字手表设计一个用户友好的界面,图2 - 4中的状态图将会很有用。

图中的椭圆表示一种状态;箭头表示从一种状态到另一种状态的转换;箭头上的标签显示了导致状态转换的事件。这个例子显示了三种显示状态和多个设置状态。事件b1表示按钮1被按下。这块表有三个扣子。该图显示了当按下三个按钮中的任何一个时,每种状态下会发生什么。该图清楚地显示了b1用于在时间、日期和警报的显示模式之间移动。B2从显示模式切换到设置模式或选择字段在给定模式下更改。B3将所选字段增加一个单位。状态图还显示了按下非法按钮时会发生什么。如果手表正在显示时间,按下按钮3,什么也不会发生。如果在手表显示闹钟时按下3键,则闹钟开关切换。

功能模型展示了数据如何流经系统,以及流程和算法如何转换数据。它还显示了进程之间的功能依赖关系。公开这些关系将影响对象模型中的关联。数据流图(DFD)的主要组件是数据源、数据接收器和过程。数据源和接收器用矩形表示。椭圆表示过程。数据存储显示在两条水平线内。dfd用于描述系统中的整体流程。它们还可以用于描述将一种数据表示形式转换为另一种数据表示形式的任何过程。在功能建模期间,在DFD中识别的流程可能出现在对象模型中的操作或对象。三维医学成像系统的数据流程图如图

2 - 5所示。该图显示了计算机断层扫描(CT)或磁共振成像(MRI)扫描仪上的数据采集。扫描仪提供的一系列横截面切片首先经过图像处理滤波器处理,以增强灰度切片中的特征。分段过程识别组织,并为切片中存在的各种组织产生标签。然后,这些标记的切片经过表面提取过程,在每个组织的表面生成三角形。渲染过程将几何图形转换为图像。或者,写入过程将三角形存储在一个文件中。之后,可以读取三角形并将其呈现为图像。我们推迟决定是使过程成为对象还是使过程成为操作。第四章使用dfd对可视化管道进行建模。

2.6面向对象程序设计语言

计算机编程语言的选择是一个宗教问题。每种计算机语言都有自己的传播者和追随者。我们在面向对象语言方面的大部分经验都是使用C和c++。C本身没有面向对象的工具,但是面向对象的方法和严格的编码准则允许开发面向对象的代码。我们选择c++作为可视化工具包,因为它内置了对类概念、方法到对象的动态绑定和继承的支持。c++也可以在许多UNIX平台和个人计算机上广泛使用。

Simula [Birtwistle79]通常被认为是第一个面向对象的语言,但是Smalltalk [Goldberg83]可能是最著名的语言。Smalltalk是施乐帕洛阿尔托研究中心(PARC)在七八十年代开发的。在它的时代之前,斯莫尔

Talk不仅提供了一种语言,还提供了一个用对象构建的操作系统和编程环境。当您使用Smalltalk时,您的对象是活生生的。对于面向对象的纯粹主义者来说,没有替代品。Smalltalk的衍生产品包括窗口系统、工作站和桌面范例。苹果电脑和微软都承认Smalltalk和施乐PARC对麦金塔和Windows的影响。Smalltalk的构想可能比广泛的商业接受早了10年。在Smalltalk的婴儿期和青春期,软件的复杂性远低于今天的系统。FORTRAN服务于科学和工程社区,COBOL是商业应用的选择,计算机科学社区接受了c。抽象的使用仅限于数学家和其他抽象思想家。编程被认为是一种艺术形式,程序员专注于算法的巧妙实现。每项新任务通常都需要一个新程序。技术程序员确实使用数字库来进行常见的数学操作,但是在更高层次上的通用抽象概念相对较少。

2.7面向对象可视化

不要低估设计系统所需的投资。尽管面向对象技术有巨大的潜力来产生良好的软件设计,这些技术不能保证表面提取图2-5数据流图。滤镜段渲染图像三角形文件切片切片有标签的切片三角形写读三角形三角形三角形三角形像素CT/MRI扫描仪28面向对象的设计tee一个好的设计。我们在本文中介绍的可视化系统植根于我们历时10年开发的动画[Lorensen89]和可视化系统[Schroeder92]。最初的设计确定了25个工业应用的计算机动画类,四名软件专业人员花了10个月(几乎3.5人年)来完成。在这个设计阶段,开发人员编写了零行代码。随后的实现只花了一个月的时间,也就是工作的10%。

这个系统仍然为我们的可视化团队服务,即使其他20个软件开发人员已经向系统中添加了500多个类。最初的25个类今天仍然存在于系统中。作为读者,我们希望您能从我们的可视化系统设计经验中受益。我们在每章的“把它们放在一起”一节中描述了许多可视化工具包类的属性(属性和方法),试图帮助您。还包括一系列由Doxygen文档系统生成的对象图,它将为您提供对象关系(如超类和子类)的快速概述。该文档可以在CD-ROM或http://www.vtk.org上找到。在下一章中,我们还将解释我们在设计VTK面向对象工具包时所做的决策。

2.8章小结

本章介绍了面向对象的概念和术语。重点是处理复杂性,以及面向对象技术如何提供降低软件复杂性的机制。模型构建是任何设计方法的重要组成部分。我们介绍了三种模型和符号。对象模型描述了系统中的对象及其静态关系、属性和方法。对象图简洁地展示了这个静态信息。动态模型侧重于系统的时间依赖方面。状态转换图用于对系统的序列和控制部分进行建模。功能模型显示了系统中的对象如何转换数据或其他对象。数据流图是显示功能依赖关系的方便符号。目前有几种面向对象实现的选择。

尽管可以用非面向对象的语言(如C)实现面向对象的系统,但面向对象的语言最适合这种方法。我们选择c++来实现可视化工具包。本书的重点是架构、数据结构设计和算法。系统的面向对象方面很重要,但系统的功能要重要得多。

2.9参考书目

有几本面向对象设计的优秀教科书。[Rumbaugh91]和[Birtwistle79]都提出了独立于语言的设计方法。这两本书都强调建模和图表是设计的关键方面。[Meyer88]还在面向对象语言Eiffel的上下文中描述了面向对象的设计过程。另一本受欢迎的书是由Booch [Booch91]撰写的。任何想要成为面向对象设计和实现的认真用户的人都应该阅读Smalltalk开发人员在Xerox 2.10 References 29 Parc上所写的关于Smalltalk的书籍[Goldberg83] [Goldberg84]。在另一本早期面向对象编程书中,[Cox86]描述了面向对象技术和编程语言Objective-C。

Objective-C是C和Smalltalk的混合,被Next Computer用于实现他们的操作系统和用户界面。有很多关于面向对象语言的文章。CLOS [Keene89]描述了公共列表对象系统。Eiffel是一种强类型的OO语言,由[Meyer88]描述。Objective-C [Cox86]是弱类型语言。由于c++已经成为一种流行的编程语言,现在有许多类库可以在应用程序中使用。[Gorlen90]描述了一个扩展的类库,用于模仿[Goldberg83]中描述的Smalltalk类的集合和数组。[Stepanov94]和[Musser94]描述了标准模板库,这是一个数据结构和算法的框架,现在是ANSI c++标准的一部分。Open Inventor [Inventor]是一个支持交互式3D计算机图形的c++库。Insight Segmentation and Registration Toolkit (ITK)是一个相对较新的类库,通常与VTK [ITK]结合使用,用于医疗数据处理。VXL是用于计算机视觉研究和实现的c++库[VXL]。还有一些数学库,如VNL (VXL的一部分)和Blitz++ [Blitz]。还有各种各样的其他c++工具包可用,谷歌搜索[谷歌]是找到它们的最佳方式。c++文本比比皆是。c++ [Stroustrup84]作者的原始描述对于任何认真的c++程序员来说都是必须的。另一本书[Ellis90]描述了该语言的标准扩展。最近,UML系列书籍——其中[Booch98]和[Rumbaugh98]非常受欢迎——是强烈推荐的资源。一些关于泛型编程的书籍[Austern99]和STL [Musser96]也很有用。

向你的同事询问他们最喜欢的c++书籍。为了保持与新发展的联系,有会议、期刊和网站。面向对象主题最强大的技术会议是年度面向对象编程系统、语言和应用程序(OOPSLA)会议。在这里,该领域的研究人员描述、教授和讨论面向对象技术中的最新技术。纽约的SIGS出版物出版的面向对象编程(jop)双月刊,介绍了该领域的技术论文、专栏和教程。万维网上的资源包括Usenet新闻组comp.object和comp.lang.c++。

2.10参考资料

[Austern99]李文杰。泛型编程和STL。addison - wesley 1999。ISBN 0-2-1-30956-4。

[伯威斯勒79]g.m.伯威斯尔,欧。达尔,B.梅尔豪格,K.奈加德。Simula开始。charwell - bratt有限公司,英国,1979年。

[闪电战]http://www.oonumerics.org/blitz/

[Booch91]李志强。面向对象的应用程序设计。本杰明/卡明斯出版公司,红木城,加州,1991年。[Booch98]李国强,李国强。统一建模语言用户指南。Addison-Wesley 1998, ISBN 0201571684。30面向对象设计[Cox86]面向对象编程:一种进化的方法。Addison-Wesley, Reading, MA, 1986。[2009.09]李文杰。注释c++参考手册。Addison-Wesley, Reading, MA, 1990。

[金宝强,李志强,等。Smalltalk-80:语言及其实现。Addison-Wesley, Reading, MA, 1983。

[金伯格84]李文杰。Smalltalk-80:交互式编程环境。Addison-Wesley, Reading, MA, 1984。

[谷歌]http://www.google.com

[葛兰90]李志强,李志强。数据抽象和面向对象编程。约翰威利父子有限公司,奇切斯特,英国,1990年。

【发明者】http://oss.sgi.com/projects/inventor/

[ITK]洞察力软件联盟。http://www.itk.org

[Keene89]李志强。通用Lisp面向对象编程:CLOS程序员指南。Addison-Wesley, Reading, MA, 1989。

[刊刊89]李志强,李志强。面向对象计算机动画。IEEE NAECON会议,2:588-595,代顿,俄亥俄州,1989年5月。

[刘志刚,李志刚,李志刚,等。五国地球上生命门的图解指南。W. H. Freeman & Co.,纽约,1988。

[梅耶尔88]李志刚。面向对象软件构建。1988年,英国赫特福德郡普伦蒂斯厅国际公司。

[Musser94]李国强。面向算法的泛型库。软件实践与经验。24(7): 623-642, 1994年7月。

[Musser96]李志强,李志强。STL教程和参考指南。addison - wesley 1996。ISBN 0-201-63398-1。[鲁姆堡91]鲁姆堡,M.布拉哈,W. Premerlani, F. Eddy, W. Lorensen。面向对象建模与设计。Prentice Hall, Englewood Cliffs, NJ, 1991。

[Rumbaugh98] J. Rumbaugh, G. Booch, I. Jacobson。统一建模语言参考手册。Addison-Wesley 1998, ISBN: 020130998X。2.11习题31

[Schroeder92] W. J. Schroeder, W. E. Lorensen, G. Montanaro,和C. Volpe。Visage:面向对象的科学可视化系统在《可视化学报》92年。第219-226页,IEEE计算机协会出版社,加州洛斯阿拉米托斯,1992年10月。

[刘国强,李国强,李国强,等。标准模板库。ISO编程语言c++项目。医生。不。X3J16/94-0095, WG21/N0482, 1994年5月。

[斯特劳斯特鲁普84]c++编程语言。Addison-Wesley, Reading, MA, 1986。

[VXL] http://vxl.sourceforge.net/

2.11运动

回答下列关于你所写程序的问题。

a)你在设计和实施上花了多少时间?

b)如果有的话,你使用了什么方法?

c)能否轻松扩展系统?

d)有人能扩展系统吗?

2.2确定以下应用的主要对象和操作。

a)航空公司预订系统。

b)冒险游戏。

c) 2D绘图包。

d)自动柜员机。

2.3为练习2.2中的每个例子画一个对象图。

2.4电脑动画使用图形和电影制作的概念。识别计算机动画系统中的主要对象和操作。

2.5对于练习2.4中的动画系统,设计控制和循环对象,使其能够灵活地控制系统中角色的属性。如果我们将这些控制和循环对象称为场景和线索,你希望它们看起来如何?

2.6以图2-4为例,绘制腕表状态图。

2.7画出计算球体和圆柱体表面积和体积的数据流程图。

本书为英文翻译而来,供学习vtk.js的人参考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值