冒号和他的学生们(连载23)——数据抽象 - 编程入门网
dquo;
“不同的内部数据结构,导致不同的算法。正是注意到这一点,人们多采取‘整体设计以数据为中心,局部实现以算法为中心’的方针,以增强系统的可维护性。最后看看示例客户代码。”冒号继续放幻灯—— /* 客户测试代码 */
冒号指出:“尽管两种实现方式大相径庭,客户代码却毫无二致。这种数据类型的接口与实现的分离,有利于开发时间的分离以及开发人员的分离。开发时间的分离指的是:开发人员可以推迟在不同实现方式中作抉择,以保证整体开发进程;开发人员的分离指的是:程序的修改和维护不局限于原作者。” 问号发现一个问题:“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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |