OOD启思录
工作后爱上了买书,至今买书已经快用了600大洋了,在“第二书店”的帐号也快要冲VIP了。买的书五花八门,涉及编译原理,数据库原理,网络,设计模式,OO思想,软件工程。书真是个不错的东西,看看大师们的想法,虽不一定能彻底参悟,不过总能有所领悟,慢慢提高,比起闭门造车,显然是个不错的捷径。
五一的时候看了鲍志云翻译的那本《OO启思录》,刚看到继承那一章,看过的一些部分也没有彻底领悟,不过感觉确实是一本不错的书,虽然不一定会像它宣称的“面向对象领域的effective C++”那样厉害。
面向对象的编程思想只是软件随着硬件的发展,对软件规模提出更高要求后的自然演变,而不是什么方法学的重大改变。想想计算机语言的演变过程吧!当用机器语言的0101去编程的时候,如果可以的内存不超过1K,没人会认为那样有什么不妥,随着硬件的发展,对计算机要做的事提出了更高的要求,让人们去记忆的0101组合也逐渐增多超出了人的记忆,于是出现了汇编,然后出现了高级语言,开始的时候人们对高级语言相当抵触,理由无非是效率低下,可是比起高级语言对于软件开发效率的贡献和硬件的不断发展,这些又算什么哪?计算机语言的发展实际上就是程序运行效率和开发效率互相折中的结果,当然有硬件的发展撑腰,开发效率总是可以获胜。关于垃圾回收机制,无非也是程序运行效率和开发效率的取舍的结果。在某些需要实时响应的领域,对运行效率要求极高的地方,该用0101就用0101。这实际上就是一个取舍的问题,不是说哪个做法一定比另一个好或不好。
什么是面向对象?面向对象这个概念被炒得沸沸扬扬,什么“世界万物皆对象”,感觉高不可测,好像不是面向对象就是错误的开发方式一样。正如前面所说的计算机的发展实际上就是程序运行效率和开发效率的取舍。面向过程(在OO启思录里被称为面向动作Action-Oriented,不知道为什么要这样称呼)的开发方式,最大的缺点就是数据和对数据进行操作的方法的单向性,即我可以知道方法操作了哪些数据,却很难知道某个数据被哪些方法操作了。当然风格良好的程序员的做法通常是把数据在一个文件中定义数据结构,然后在需要的操作这些数据结构的方法集合中包含这些数据,而这恰好就是面向对象的核心 类 所做的事情------将数据和操作它们的方法封装在一起,只不过面向对象的思想把这些具有风格良好的程序员的做法概念化了。由于将数据和方法封装在了一个类中,数据和对其进行操作的方法,我们就很容易地知道究竟哪些方法对其进行了操作。
就我个人觉得,面向对象只是在分析和设计(也即OOA和OOD)才用到的东西。在设计完成后,一个项目应该包含多少模块,一个模块应该包含哪些类,类之间的关系是聚合还是继承,哪些类存在交互,如何交互,都已经尘埃落定,具体去编写代码的人,根本就不会有面向对象的感觉。让你实现具体的“人”这个类,无非就是一些数据,口鼻眼耳手,一些操作,吃喝拉撒睡,这跟面向过程的编程有什么不同吗?完全一样!!!也就是面向对象在UML详细设计,类图出现后,就结束了,具体编码的coder根本就不知道自己到底是在面向对象还是面向过程,事实就是事实,不能说,我这个系统在设计的时候是按照面向对象的思想设计的,于是我这个项目的所有的coder都是熟谙面向对象思想的。试想一下,都是用函数去操作数据,难道你写到关键字class里面就是面向对象了?Naive,哈哈。所以coder应该从大局上把握整个项目,不要幼稚地以为在做一个面向对象的项目,自己就是OO Coder了。多多思考,自我救赎。
OO启思录里一共介绍了69条OO的经验,当看完这本书的时候再慢慢交待,哈哈。