`
阿尔萨斯
  • 浏览: 4169343 次
社区版块
存档分类
最新评论

雷声大,雨点小——《多任务下的数据结构与算法》初印象

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

本文由恋花蝶最初发表于:http://blog.csdn.net/lanphadayhttp://lanphaday.bokee.com,转贴请保留这一声明,谢谢。

雷声大,雨点小

《多任务下的数据结构与算法》初印象

这本书是今天当当网送到的,看了前面二十页,已经激动得非写下点东西不可了。

这本被冠之以国内第一本原创多任务下的数据结构与算法图书之名的书籍的确吸引了我的眼球,并在我能做到的第一时间在当当网买了下来,读来二十页后,不得不说:大失所望!

作者周伟明,我在网络上找不到更多关于他的信息,因为同名的人太多。所以这篇短文所说的都是针对于这本书而言,事先声明一下。因为我要批评这本书,肯定是会被很多人拿砖头过来拍我的;原因是就目前而言,我在网上看到的都是说这本书好、推荐这本书的网页。

根据第二书店的网页(http://www.dearbook.com.cn/2006/data/index.htm)介绍,“本书在传统数据结构与算法的基础上,提出了许多新的思想概念和设计方法,重点介绍了如何使数据结构与算法支持多任务;还介绍了复合数据结构与动态数据结构的设计,并对商业应用实例进行分析讲解。”因为还没有读完整本书,不敢对上而的说法作反驳,现在只根据已经阅读的前二十页谈谈自己的想法。

第一、 这本书作者说得太满了。很多方面作者提出自己的见解是无可厚非的,但多处把话题说死。比如第2页关于STL的讨论之一是说模板库的内存开销大,在内存受限系统中不合适,实在太过荒唐。举个例子,实现Max函数比较两个对象,用C的话因为要适应各种数据结构要做出N个不同的版本,编译之后占用多大内存?用C++的话,只要写一个模板函数然后依要求特化即可。甚至C语言版本在比较自定义数据结构的时候还需要写一个比较函数,而C++只要写一个重载了操作符的函数对象即可,连函数调用的开销都省下了。不知道C++占内存更大的观点从何而来?又如在第3页关于参数校验方面的论述,作者说对于需要在大的循环里调用的函数,不需要要函数内对参数进行校验;在列表的遍历函数。这句话我不敢苟同,把自己的函数执行的正确性依赖在调用者身上,正是与软件工程里高内聚低偶合的原则相抵触的,而且放眼当前流行的程序库,尚未见哪个是这样设计的。

第二、 这本书作者的个人经验太多,很多东西没有拿出来大家讨论是否合适就写到书中去了。比如第5页关于switchif…else的论述,作者举的例子实现太不合适了。不知道有哪个程序员会在那种情况下使用switch语句来实现?恐怕连最初等的初学者都懂得那应该用if…else来实现吧?又如第5页谈及goto语句时说“从多重嵌套的循环判断里跳出去就是不允许的。”我看过很多论及goto语句的言论,与作者相反,大家都是认为从多重嵌套中直接跳出有利于程序的清晰性,还有,如果不允许goto跳出多重循环,不知道goto还有哪些更充足的理由存在?

第三、 这本书有不少错误。比如第20页实现的Stact_Pop函数,用以弹出栈顶元素并在当栈为空的时候返回NULL。这个函数是有设计错误的,当我在里面存储的数据包含一个NULL指针时,我不知道根据返回值怎么去判断我的弹出操作是成功还是成败了?一个改进的方法就是返回两个值,一个是数据指针一个是操作状态。还有在第24页里定义队列时说“栈是后进先出,而队列的进出方向刚好和栈相反。”不知道作者所言的方向是指什么?根据上下文,应该是说栈是FIFO,栈是FILO吧?但也没有相反之说啊?还有回到<chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899" w:st="on"><span lang="EN-US"><font face="Times New Roman">2.1.2</font></span></chsdate>节的栈的实现上去,当栈满的时候,作者的设计是增加一倍空间,且不说使用realloc函数造成的效率损失,这种只增不减的设计在内存的浪费问题上应该被BS的!我相信作者在实际工作中不会采用这样的设计,这只是作为书中的例子做了简化,但你既然简化了内存组织方式,那就不应该再实现当栈满时自动增加栈空间的功能!栈满直接返回操作失败即可。其它诸如“栈是一种最常用的操作,(17)、“这样实现起来可以充分利用数组操作的高效性,避免移动数据。”(18)就不一一枚举了。

第四、 作者对自己不算纯熟的领域大放厥词。在第1415页,作者在名为软件设计简介的章节里大谈自己对软件工程的见解,而且海吹胡擂,为软件开发划分了结构化和面向对象两个阶段,并对COM等横加指责,安名加罪。作者甚至断言在“软件设计发展的第三阶段才能彻底解决。”他自创了宏观设计学和微观设计学两个“重要”理论,这样的论调,对于广大的程序员,特别是一些初学程序开发的学生是有害的、是不负责任的胡说。

第五、 作为一本论述数据结构与算法的书籍,没有设计一些跨平台的自己的程序库是非常失败的。这本基于Windows内部互斥量、事件的数据结构与算法书,把读者的思维禁锢在一个平台之上,而数据结构与算法却是计算机科学里最最平台语言无关的学科,这一点,未免让人大失所望。

这本书现在为止,读的只有这么二十余页,但我觉得已经非常失望了。当然,这怪不得作者,从字里行间我依然可以感受到作者非常用心想把自己所学所感所悟传导给大家,作者的心是热切的,但可能作者因为工作原因(比如不方便举出更详尽的例子和实际应用中的例子)和时间原因(作者已经伏案十年写下此书)而不得不为之删减吧!这本书,对于广大的有一定经验的程序员和正在成长中的程序员是有好处的,可以买来一看,只要看的时候取精去糙,相信仍会收获不小。但还处于学习期的大学生和广大初学者就不要看了罢,恐怕对你们有造成一些不良影响。

附:我这样写,肯定是有很多人要拍砖的,所以我开放了blog的评论功能,希望大家心平气和地就事论事。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics