快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ueue_add(Queue, ItemType); /** 移除队列头部。成功返回0,否则返回-1。*/ int queue_remove(Queue, ItemType*); /** 队列是否为空?*/ int queue_empty(Queue); /** 队列长度 */ int queue_length(Queue); /** 返回(但不移除)队列头部。成功返回0,否则返回-1。 */ int queue_head(Queue, ItemType*);

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

时间:2011-07-03 BlogJava 郑晖

冒号解释:“特意用C语言是为了表明ADT不独OOP专有。由于C不支持异常(exception),因此用非零返回值来表示错误发生。我们尚未定义队列类型QueueType,其核心是队列的成员集合。无论是用数组来实现,还是用链表来实现,用户根本不需关心。这便是队列的抽象所在——用户不应知道也不必知道它的具体实现,只能通过指定接口来进行‘暗箱操作’。这样经过数据抽象,队列的本质特征由API展现,非本质特征则屏蔽于客户的视野之外。”

问号问道:“这种数据抽象与前面提到的参数抽象和规范抽象有何关系?”

“参数抽象使得数据接口普适化,规范抽象使得数据接口契约化。”冒号的回答简明扼要,“此外,一个完整的数据抽象除了对每个接口作规范说明外,还需对该数据类型作整体规范说明,OOP中的类注释文档即作此用。”

逗号要求:“能不能给出完整的实现代码?光有接口没实现,似乎不太过瘾。”

冒号戏言:“我感觉你在把程序当烟抽——光有烟嘴的接口,没有香烟的实现,的确不太过瘾。”

众笑。

冒号借题发挥:“许多程序员都有一个通病:重实现,轻接口。在编写代码时表现为:不等接口设计好就技痒难忍,揎拳捋袖地开始大干;在阅读代码时表现为:看到API文档便恹恹欲睡,看到代码便两眼放光。务必谨记:接口是纲,实现是目。纲若不举,目无以张。也就是常说的:‘Programming to an Interface, not an Implementation’。不过为满足你们的要求,我还是写了一段基于循环数组的实现代码。”

逗号正感当靶子的滋味不好受,一见代码便心旌摇荡,宠辱皆忘了。

/* 队列类型定义*/

typedef struct {    ItemType* data;     /**//* 队列成员数据 */    int first;           /**//* 队首位置 */    int last;            /**//* 队尾位置 */    int count;          /**//* 队列长度 */    int size;            /**//* 队列容量 */ } QueueType;/* 文件QueueImpl.c:队列的循环数组(circular array)实现 */

int queue_initialize(Queue q) {    int size = 100;       /**//* 初始容量 */    q->size = size;    q->data = (ItemType*)malloc(sizeof(ItemType) * size);    if (q->data == NULL) return -1; /**//* 内存不足 */    q->first = 0;    q->last = -1;    q->count = 0;    return 0; } void queue_finalize(Queue q) {    free(q->data);    q->data = NULL;    q->first = 0;    q->count = 0; } int queue_empty(Queue q) {    return q->count <= 0; } int queue_length(Queue q) {    return q->count; } /**//* (内部函数)扩大队列容量 */ static int queue_resize(Queue q) {    int oldSize = q->size;    int newSize = oldSize * 2;    int newIndex;    int oldIndex = q->first;    ItemType* data = (ItemType*)malloc(sizeof(ItemType) * newSize);    if (data == NULL) return -1; /**//* 内存不足 */    for (newIndex = 0;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号