快速业务通道

冒号和他的学生们(连载23)——数据抽象 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

冒号和他的学生们(连载23)——数据抽象

时间:2011-07-03 BlogJava 郑晖

23.数据抽象

善张网者引其纲,不一一摄万目而后得      ——《韩非子·外储说右下》

问号抢着说:“我知道了:过程抽象的结果是函数,数据抽象的结果应该是数据类型。”

冒号首肯:“数据类型与数据运算是程序语言的基本要素,除了内建的类型与运算外,程序语言还提供了用户定义(user-defined)的扩展机制,以提高编程者的效率。正如函数是一些基本运算的复合,自定义类型通常是一些基本类型的复合。不过单纯的复合类型并不是真正意义上的数据抽象,我们关注的是抽象数据类型(ADT)。”

逗号说了句老实话:“学数据结构时常提到抽象数据类型,但二者究竟什么关系还真没搞明白。”

冒号解析道:“作为数据与运算的有机集合体,它们可看作同一事物的两个方面。数据结构强调具体实现,侧重应用;抽象数据类型强调抽象接口,侧重设计。比如栈、队列、链表、二叉树等作为数据结构,人们关心的是如何利用它们有效地组织数据;而作为抽象数据类型,人们更关心的是类型的设计及其背后的数学模型。”

引号推想:“既然有抽象数据类型,想必就有具体数据类型吧?”

“这是当然。”冒号肯定道,“具体数据类型主要用于数据储存,除了getter和setter之外没有其他的运算。例如由省、市、街道和邮编组成的通讯地址便是一个典型的具体类型,谁能告诉我定义这种类型的意义?”

句号回答:“定义这种类型可以绑定省、市、街道和邮编这四个相关的数据,便于统一管理,包括创建、复制、作为参数传递或作为函数返回值等等。”

“说得不错!”冒号满意地点点头,“J2EE中常用一种设计模式:数据传输对象(Data Transfer Objects或DTO),又称值对象(Value Object或VO),这类对象不含任何业务逻辑,仅仅作为简单的数据容器,实质上也属于具体数据类型。”

“究竟这里的‘具体’具体在哪里,‘抽象’又抽象在哪里?”叹号的眼前飘浮的迷雾也是那么具体而抽象。

冒号轻轻拨开雾霭:“如果一个数据类型依赖于其具体实现,它就是具体的,反之则是抽象的。再拿通讯地址为例,它所有的域即省、市、街道和邮编对于客户都应该是透明的——至于是通过getter、setter还是直接访问并无本质区别,如此用户才能有针对性地进行数据储存、传递和获取。如果对该类型进行修改,比如增加一个代表国家的域或者减少代表邮编的域,必须知会用户,否则毫无意义。显然这种类型与实现细节密切相关,因而是具体的。作为抽象类型的例子,让我们看看队列(Queue)吧。队列是一种非常基本的数据结构,广泛应用于操作系统、网络和现实生活中。请问它的特征是什么?”

引号最擅长这类问题:“队列的特征是先进先出(FIFO)——每次数据只能从队尾加入,从队首移除。”

“好的。队列一般至少包括类似数据库的CRUD(增删改查)操作:创建操作——建队;删除操作——撤队;修改操作——入队、出队;查询操作——是否为空队、队列长度、队首。下面我们用C来表述队列的操作接口。”冒号投影出一段代码——

typedef char ItemType;     /* 队列成员的数据类型,char可换成其他类型 */ /* QueueType待定。。。 */ typedef QueueType* Queue; /** 初始化队列。成功返回0,否则返回-1。*/ int queue_initialize(Queue); /** 终结化队列 */ void queue_finalize(Queue); /** 加入队列尾部。成功返回0,否则返回-1。*/ int q

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号