1.5 STLViewer中类的层次设计及软件模块结构划分

学习过C++的读者对于面向对象的编程技术(Object-Oriented Programming,OOP)都不会陌生,OOP技术是当前程序设计的主流方法学。详细讲述OOP技术的著作和文章很多,由于本书的重点不在于此,所以不再花篇幅详细介绍OOP技术。概括地说,OOP技术的主要特征在于三个方面:即函数的重载、数据的封装和类的继承。能否在程序设计中较好地运用OOP技术的关键,就在于对这三个主要特征的理解和体会。对一个较复杂的功能软件而言,在初期最重要的一部分工作是设计软件的整体结构,主要的考虑包括:要设计哪些主要的类?这些主要类之间的关系怎样?例如类之间的继承和派生关系,类之间的消息传递和数据交换等。如果类的数量较多、系统较复杂的话,还应该考虑软件功能模块的划分问题。读者或许已注意到,很多软件都是由一个执行程序(*.exe 文件)附加多个动态链接库(Dynamic Link Libaray,DLL)组成的。可以这样说,类是软件设计时的模块,而DLL库是软件运行时的模块,一个DLL库可以输出一组类、函数及资源。通常的做法是把一些功能相对集中、可重复利用率高的类和函数集中于一个动态链接库中,执行程序在运行时根据需要动态地链接并调用这些DLL库所输出的类和函数,并在使用完成后予以释放。这种动态地链接和调用关系也可以存在于动态链接库之间。

以STLViewer为例,整个应用程序由可执行程序STLViewer.exe和四个动态链接库组成,即GeomCalc.dll、glContext.dll、GeomKernel.dll和DockTool.dll。图1-8显示了这些软件模块相互之间以及它们与MFC基本类库之间的层次关系。

图1-8 STLViewer的层次结构

STLViewer.exe在运行时调用所需要的动态库,四个动态链接库均是MFC扩展方式构造的DLL库,这是因为只有采用扩展方式的DLL库才能输出C++的类。具体地创建和使用DLL将在下节介绍。四个模块或动态链接库的功能介绍如下:

(1)几何基本工具模块GeomCalc.dll。该模块输出基本几何对象类与几何计算函数,如描述点、矢量、矩阵的类及相关的计算函数。它是CAD系统中必不可少的模块,CAD系统中与几何造型、操作及显示等相关的功能都需要这些基本的几何对象和计算功能。系统中另外两个模块,即几何内核模块和图形显示模块就建立在GeomCalc.dll基础之上。

(2)CAD图形工具模块glContext.dll。该模块输出了一系列用于OpenGL三维图形绘制的C++类,在这些类中,基于MFC的机制对OpenGL的有关功能进行了封装。在MFC下可方便地调用这些类,完成OpenGL的初始化设置、三维几何体的光照显示,以及对显示的操作,如视角变换、显示缩放、光照或颜色的设置等。glContext.dll建立在MFC及GeomCalc.dll的输出类基础之上。

(3)CAD几何内核模块GeomKernel.dll。该模块输出了一系列用于描述三维几何对象的类。几何对象是CAD软件操作和显示的主体,这些对象之间又存在各种关系,如层次关系、拓扑关系。在本书中,将描述和管理这些几何对象及它们之间关系的类集称为几何内核模块。对这些几何体的描述是建立在GeomCalc.dll输出类的基础之上。GeomKernel.dll调用glContext.dll用于几何体的OpenGL绘制。建立一个真正的三维几何内核是一项复杂而专业的工作,将涉及大量CAD领域的专业知识。在本书中,笔者以构造GeomKernel.dll这样一个较简单的几何内核库为例,主要目的在于讲述如何使用面向对象的编程技术设计和实现CAD几何内核。经过简化的几何内核库GeomKernel虽然只包括了为数不多的几何类,但构造一个面向对象的几何模型结构。在它的基础上,可方便地对这个库进行扩充,增加更多功能的几何对象类。

(4)浮动界面工具模块DockTool.dll。该模块输出了一些增强界面效果的浮动窗口类。如图1-2左侧所示的类似于Visual C++集成开发环境中的Workspace浮动窗口,以及底部的用于提示信息输出的Output浮动窗口,都由DockTool.dll输出。