《松本行弘的程序世界》之面向对象
最近读《SICP》把脑细胞搞死大半,还没看完2章,而且看得也是一知半解,实在是受不了了,改读一本浅显点的,不然,自己就要丧失阅读的乐趣了,于是挑了这本《松本行弘的程序世界》刚看完第三章,其第二章“面向对象”写得极为精彩,不得不记录一下收获。
在第一节里,松本就抛出了程序员的”阿尔法综合症“,作为应该主宰计算机,发掘计算机能力的程序员,正在一步步的沦为计算机的奴隶,我们总是在想如何去迎合计算机的各种限制条件。而我们的目标就是夺回主动权,把尽量多的工作交给计算机,充分发挥计算机的高速计算能力和信息处理能力,完成工作。程序员夺回主动权的武器就是编程语言,如何选择一门最合适的语言完成自己的任务是每个程序员都应该修炼的技能,
面向对象----一切都是为了开发效率。
软件开发中最大的敌人就是复杂性,人脑的记忆力和理解力都是有限的,随着越来越多的数据通过计算机处理,我们面临的计算机系统越来越复杂,另外,计算机的性能提升也越来越快,可是,人脑的性能提升却没有那么快,人脑成为限制开发效率的瓶颈,因此牺牲一下电脑的性能,来换取人脑处理速度的提升,对整个软件开发效率的提升是有积极影响的。
人们解决复杂性的第一个手段是”结构化编程“,通过把程序控制流程抽象化成顺序,分支,循环三种,从而使得程序不至于过于复杂,并且不影响程序的实现能力。这样就把汇编中的各种goto语句,替换成了switch,for....
计算机程序=算法+数据,人们通过结构化编程部分解决了算法的复杂性问题,随着处理数据的增加,复杂性仍然不可控制,于是,面向对象承担着对抗数据复杂性的重任诞生了。面向对象通过数据抽象的方式,把数据和其处理方法结合起来成为黑盒子,把复杂性隐蔽其中。另外,通过数据抽象,程序处理的数据就不在是一些单纯的数值,而是人脑比较容易想象的事物,从而把我们的想象过程”具体“化了。
面向对象的三原则,数据抽象、多态和集成;关于数据抽象,上面一段已经有了说明。而多态性则使程序能够把不同种类的东西当做相同的来处理。这样对程序有三个好处,一是各种数据统一处理,程序员只需关注处理什么(What),而不用关心怎么处理(How);二是程序能够根据对象的不同选择最合适的方法。三是增强了程序的扩展性。继承有2种继承,一是对规格的继承,即我需要对外部提供什行为,java中的这类继承就是指实现接口;另一个是实现的继承,即父类中都用了哪些数据结构和算法。java中的extends就是这类继承。
关于面向对象有2大误解,一是对象是现实世界中具体物体的反应,另一个是多重继承都是不好的。面向对象的目的就是通过数据抽象以应对程序的复杂性,因此,面向对象中的每一个对象都是为了完成任务而存在的,它们的存在只是数据和算法结构化的需要,并不是现实世界具体物体的反应,即使在程序中有Cat,Dog之类看是现实世界物体的对象,其也只是这个物体一个侧面的抽象概念而已,我们不需要把现实世界物体的所有属性都考虑到程序中去,程序只处理抽象数据;多重继承给大家不好的观感主要是有2个原因,一是其使得类的继承层次复杂化,这可以通过巧妙和适当的设计避免这个问题,第二个是因为继承功能名字重复。但是在数据抽象的过程中,不可避免的存在多重继承的现象,一位父亲同时是一名程序员。因此,在各类面向对象的语言中,必需以某种形式支持多重继承,Java通过Implement,Ruby通过Mix-in。