抽象数据类型怎么写( 二 )

【抽象数据类型怎么写】这些操作既向程序的其余部分描述了这些数据是怎么样的,也允许程序的其余部分改变这些数据 。“抽象数据类型”概念中“数据”一词的用法有些随意 。
一个ADT可能是一个图形窗体以及所有能影响该窗体的操作;也可以是一个文件以及对这个文件进行的操作;或者是一张保险费率表以及相关操作等等 。要想理解面向对象编程,首先要理解ADT 。
不懂ADT的程序员开发出来的类只是名义上的“类”而已——实际上这种“类”只不过就是把一些稍有点儿关系的数据和子程序堆在一起 。然而在理解ADT之后,程序员就能写出在一开始很容易实现、日后也易于修改的类来 。
传统的编程教科书在讲到抽象数据类型时,总会用一些数学中的事情打岔 。这些书往往会像这么写:“你可以把抽象数据类型想成一个定义有一组操作的数学模型 。”
这种书会给人一种感觉,好像你从不会真正用到抽象数据类型似的——除非拿它来催眠 。把抽象数据类型解释得这么空洞是完全丢了重点 。
抽象数据类型可以让你像在现实世界中一样操作实体,而不必在低层的实现上摆弄实体,这多令人兴奋啊 。你不用再向链表中插入一个节点了,而是可以在电子表格中添加一个数据单元格,或向一组窗体类型中添加一个新类型,或给火车模型加挂一节车厢 。
深入挖掘能在问题领域工作(而非在底层实现领域工作)的能量吧!Example of the Need for an ADT需要用到ADT的例子为了展开讨论,这里先举一个例子,看看ADT在什么情况下会非常有用 。有了例子之后我们将继续深入细节探讨 。
假设你正在写一个程序,它能用不同的字体、字号和文字属性(如粗体、斜体等)来控制显示在屏幕上的文本 。程序的一部分功能是控制文本的字体 。
如果你用一个ADT,你就能有捆绑在相关数据上的一组操作字体的子程序——有关的数据包括字体名称、字号和文字属性等 。这些子程序和数据集合为一体,就是一个ADT 。
如果不使用ADT,你就只能用一种拼凑的方法来操纵字体了 。举例来说,如果你要把字体大小改为12磅(point),即高度碰巧为16个像素(pixel),你就要写类似这样的代码:currentFont.size = 16如果你已经开发了一套子程序库,那么代码可能会稍微好看一些:currentFont.size = PointsToPixels(12)或者你还可以给该属性起一个更特定的名字,比如说:currentFont.sizeOnPixels = PointsToPixels(12)但你是不能同时使用currentFont.sizeInPixels和currentFont.sizeInPoints,因为如果同时使用这两项数据成员,currentFont就无从判断到底该用哪一个了 。
而且,如果你在程序的很多地方都需要修改字体的大小,那么这类语句就会散布在整个程序之中 。如果你需要把字体设为粗体,你或许会写出下面的语句,这里用到了一个逻辑or运算符和一个16进制常量0x02:currentFont.attribute = CurrentFont.attribute or 0x02如果你够幸运的话,也可能代码会比这样还要干净些 。
但使用拼凑方法的话,你能得到的最好结果也就是写成这样:currentFont.attribute = CurrentFont.attribute or BOLD或者是这样:currentFont.bold = True就修改字体大小而言,这些做法都存在一个限制,即要求调用方代码直接控制数据成员,这无疑限制了currentFont的使用 。如果你这么编写程序的话,程序中的很多地方就会到处充斥着类似的代码 。
Benefits of Using ADTs使用ADT的益处问题并不在于拼凑法是种不好的编程习惯 。而是说你可以采用一种更好的编程方法来替代这种方法,从而获得下面这些好处:可以隐藏实现细节 把关于字体数据类型的信息隐藏起来,意味着如果数据类型发生改变,你只需在一处修改而不会影响到整个程序 。