1 范型编程
范型编程是一种由一般的或可再度使用的软件成员来组成组织类库的编程技术。其目的是以一种有效的、可适应的方式来使得软件具有“pluggingtogether”的能力。范型编程的基本思想是:保持数据的容器、储存数据的迭代器以及范型算法使用容器和迭代器来创建有效的基本算法,如sorting。范型编程是在C++中使用模板编程机制和STL标准模板类库来实现的。
C++模板是一个编程技术,它允许用户以一种或多种不知类型的T形式来编写软件。为了产生可运行代码,软件的用户必须指定所有的类型T(模板实例)并可以成功地在编译器上处理代码。这个T可以是一个已知的类型,如浮点型和整型,也可以是用户定义的类型(如类)。在编译时,编译器要确保模板类型和实例代码是一致兼容的,并且是由必要的方 法和操作符支持的。
ITK在它的实现中使用范型编程的技术。这种方法的优点是通过定义相近的模板类型可以支持几乎无限的数据类型。例如,在ITK中可以创建由几乎任何像素类型组成的图像。 另外,由于这个类型判决是在编译时执行的,因此编译器可以最优化代码来实现最高的性能。范型编程的缺点是有很多编译器仍然不支持这些更新的概念,而且不能在ITK中编译,即 使它们支持这些概念,也很有可能产生完全不可辨认的错误信息,哪怕是由于最简单的语法错误造成的。
2 包含文件和类定义
在ITK中类最大限度地定义在两个文件中:一个是.h后缀的头文件;另一个是执行文件,非模板类时为.cxx后缀,模板类为.txx后缀。头文件包括类的声明和格式化注释。格式化注释用来在Doxygen文献系统下自动生成HTML网页。
除了类的头文件外,下面介绍一些其他重要的头文件。
itkMacro.h:在目录Code/Common中定义了标准的系统macros(例如Set/Get、常数和其他参数)。
itkNumericTraits.h:在目录Code/Common中定义了已知类型的数字化参数,例如它的最大值和最小值。
itkWin32Header.h:在目录Code/Common中用来定义控制编译过程的操作系统参数。
3 对象工厂
ITK中大部分类是通过对象工厂机制来实例化的。与标准的C++类使用构造和析构函数不同的是,ITK中类的实例化是用静态类New()方式创建的。事实上,构造和析构是受保护的,因此它不可能用来构造一个ITK示例(注意:这种情况适合于由itk::LightObject分离出来的类,在一些情况下由于需要增加或减少内存需求量而并非从LightObject分离出来类,在这种情况下实例可能是从堆栈创建的,例如itk::EventObject类)。
对象工厂使得用户可以通过使用itk::ObjectFactoryBase登录一个或多个工厂来控制类的实例的运行时间。这些登录工厂支持CreateInstance(类名)方式,该方式通过输入一个类名来进行创建。工厂可以通过选择来创建基于包括计算机系统配置和环境变量的一系列因子的类。例如,在一个ITK的特定应用中,用户需要使用一个特定的图像处理硬件来实现自己的类的配置。通过使用对象工厂机制,就可以用一个普通类来代替特定的ITK滤波器(当然,这个类必须与它所代替的类有相同的API)。用户就可以创建自己的类(使用同样的编译器、创建选项等),并且在共用的库或DLL中插入对象代码。这个库然后被安置在由ITK_AUTOLOAD_PATH环境变量确定的目录)。在实例化时,对象工厂将载入该库,使它创建一个特定名字的类并用工厂来创建实例(注意:如果CreatInstance()方式找不到创建类名的工厂,类的实例化将失败,并转到普通构造)。
实际上,对象工厂主要应用在ITK的put/output(IO)类中。用户大多使用New()方式来创建类。一般地,New()方式通过在Common/itkMacro.h中的macroitkNewMacro()方式来声明和实现。