快速业务通道

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

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

“不同的内部数据结构,导致不同的算法。正是注意到这一点,人们多采取‘整体设计以数据为中心,局部实现以算法为中心’的方针,以增强系统的可维护性。最后看看示例客户代码。”冒号继续放幻灯——

/* 客户测试代码 */

QueueType queue; Queue q = &queue; char item; int i; queue_initialize(q); for (i = 0; i < 26; ++i) /**//* 将26个字母加入队列 */ {    queue_add(q, ''a'' + i); } printf("Queue is %s\n", queue_empty(q) ? "empty" : "nonempty"); printf("Queue length = %d\n", queue_length(q)); while (queue_remove(q, &item) == 0) /**//* 一一出队 */ {    printf("removing queue item:[%c].\n", item); } printf("Queue is %s\n", queue_empty(q) ? "empty" : "nonempty"); queue_finalize(q);

冒号指出:“尽管两种实现方式大相径庭,客户代码却毫无二致。这种数据类型的接口与实现的分离,有利于开发时间的分离以及开发人员的分离。开发时间的分离指的是:开发人员可以推迟在不同实现方式中作抉择,以保证整体开发进程;开发人员的分离指的是:程序的修改和维护不局限于原作者。”

问号发现一个问题:“C语法中没有private关键词,用户仍然有权访问和修改队列的域成员,整个代码逻辑有可能被破坏。”

“没错。但作为一个合格的程序员,写出的代码不仅要合法,还要合理。”冒号掷地有声,“合法指合乎语法,合理指合乎语义。既然用到队列这个数据结构,当然要遵循其使用规范。打个比方,法律只是维护社会秩序的最低限度的规范,一个只遵守法律而不遵守通用规范的人必定与社会格格不入。从另一个角度看,假设所有程序员都是遵守规范的,那么类似C这种非OOP语言,只要将数据抽象与过程抽象有机结合,同样具有与OOP不相上下的可维护性和可重用性。”

引号有些困惑:“OOP中的类是否就是ADT?”

冒号释疑:“可以将类理解为具有继承和多态机制的ADT。但严格说来,并不是所有的类都有抽象性,比如前面提到的仅作存储用的值对象。在C#中有值类型与引用类型之分,分别用struct和class的关键字来指明。可以把ADT作为选择原则:是ADT则采用引用类型,否则采用值类型。C++中struct与class在机制上没有区别,只是前者成员缺省为public而后者缺省为private。但习惯上也是前者作具体类型,后者作抽象类型。Java和C中没有类似的区分,一个只支持class,一个只支持struct。”

句号沉吟半晌,忽道:“能不能这样总结一下抽象数据类型?抽象——接口与实现相分离;数据——以数据为中心组织逻辑;类型——单纯而定义良好的概念。”

“精辟!”冒号赞赏有加,“许多人能将OOP中的封装、继承和多态说得头头是道,用得得心应手,便自认为精通OOP了。殊不知抽象——尤其是数据抽象——才是OOP的核心和起源,尽管它们并非OOP的专利。没有抽象作基础,封装、继承和多态尽皆无本之木。只有贯彻ADT思想,设计出来的类才会是‘万人迷’:有优雅的外形——抽象,有丰富的内涵——数据,有鲜明的个性——类型。”

本文配套源码

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