1.概述:
面向对象是目前最流行的一种设计思想,无论你从事企业级开发,互联网应用开发,还是手机软件开发,都会使用面向对象的技术,主流编程语言中,C++,Java,C#,PHP等都是面向对象的语言,在编程语言排行榜的前十位中,面向对象能够稳定的占据7~8种语言,所有的现象,都展示了面向对象的流行程度和受欢迎程度。如果你是一个程序员,但是却不懂面向对象,那么你真的会被嘲笑为“程序猿”。
2.程序设计思想的发展
史前时代:面向机器
最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。其中0000代表加载,0001代表存储等。
机器语言由机器执行,速度快,但是一个很明显的缺点:太难写了。一旦写错,改起来更加蛋疼!这样导致程序编写效率低下,编写程序花费时间往往是实际运行时间的几十或几百倍。
由于机器语言太难编写了,于是就有了汇编语言。汇编语言也叫符号语言。是采用助记符号来编写程序,比机器语言的二进制代码要方便,一定程度上简化了编程过程。用LOAD代替0000,用STORE代替0001。
汇编语言依旧是面向机器的语言,编写同样困难,也容易出错。
脱离机器第一步:面向过程
面向过程的语言通常情况下被认为“高级语言”,相比较面向机器语言来说,不再关注机器本身的操作指令,存储方面,而是关注如何一步步的解决具体问题,即:解决问题的过程,这就是面向过程的来由。
典型的面向过程语言有:COBOL,FORTRAN,BASIC,C语言等。
第一次软件危机:结构化程序设计
1960年代中期开始爆发了第一次软件危机,典型表现为软件质量低下,项目无法如期完成,项目严重超支等。例如1963年水手一号发射失败就是因为FORTRAN代码中一行错误导致。
1968,1969年连续两次著名的NATO会议召开,正式创造“软件危机”一词,并且针对性的提出解决方法“软件工程”。
结构化程序设计差不多同一时间提出,1968年著名的《GOTO有害论》的论文,引起长达数年的论战。并由此产生结构化程序设计方法。同时第一个程序语言Pascal诞生,并迅速流行。
结构化程序设计主要特点是抛弃goto语句,采用“自顶向下,逐步模块细化,化”的指导思想。结构化程序设计本质还是一种面向过程的设计思想,将软件复杂度控制在一定范围内,从而整体降低了开发的复杂度。结构化程序设计方法是1970年代的软件开发潮流。
第二次软件危机:面向对象程序设计
第二次软件危机的根本原因还是在软件生成力远远跟不上硬件和业务的发展,相比较第一次软件危机主要体现在“复杂性”,第二次软件危机体现在“可扩展性”“可维护性上面”。面向过程已经越来越不能适应多变的业务需求了,在这种背景下,面向对象思想开始流行起来。
面向对象的语言:SIMulate语言,Smalltalk,
SIMulate67是最早的面向对象语言,是面向对象的祖师,它引入了后来面向对象的基础概念:对象,类,继承,但是他的实现不完整。并且因为本身复杂难学,最终也没有流行起来,但是SIMulate对程序语言的发展产生了巨大和深远的影响。
Smalltalk是第一个完整实现了面向对象技术的语言。
C++,C#,O-C,Java等语言无一不是受到Smalltalk的影响。
90年代的许多软件开发思想得力于Smalltalk,如设计模式,代码重构,敏捷编程等。
C++是第一个大规模使用的面向对象语言,面向对象的程序设计在80年代成为一种主导思想,很大程度上得益与C++的流行。
C++1983年推出,它进一步的扩充和完善了C语言,成为一种面向对象的程序语言。
C with Class,最强大的竞争对手就是C语言,对C语言的一种扩充。
两个问题:运行时间,代码紧凑性和数据紧凑性。
正因为C++兼容C,同时具备面向对象的能力,所以C++大行其道,广受欢迎,正是由于C++是一个大杂烩,语言本身很复杂,导致存在很多批评和争议。
Java是目前使用最广的面向对象的语言。C++促进了面向对象的流行,Java将面向对象推向王座。
Java编程语言是个简单,面向对象,分布式,解释性,健壮,安全与系统无关,可移植,高性能,多线程和动态的语言。大大提升了生成力,降低了复杂度,客观上促进了Java的流行。
面向过程:
面向过程是一种以过程作为核心的编程思想,其中过程的含义就是“完成一件事情的步骤”
面向过程其实是一种机械的思想,像流水线一样,一个阶段衔接另一个阶段,每个阶段都有自己的输入,处理,输出,流水线上流动的是我们的原料或者中间产品,每个阶段一个机械进行处理,最后输出产品。
即使是面向对象的语言进行开发,最后转换为CPU能执行的指令,还是面向过程的,所以面向过程无处不在,是计算机的基石。
面向对象:
面向对象是一种以对象为中心的编程思想,其中对象的含义可以理解为“存在的东西”。
面向对象不在局限于计算机的本质,而更加侧重于对现实世界的模拟。本质是一种“人的思想”,这是一个质的飞跃,意味着程序员可以按照认得思想来观察,分析,设计系统。
人大部分的时间都是按照面向对象的方式进行思考的,而且人类世界主要按照面向对象的方式进行运转的,所以,面向对象其实更加符合ren得思维习惯。
面向过程:程序=数据结构+算法
面向对象:程序=对象+交互。其中对象就是具体存在的事物,而交互是事物之间的相互作用,互动。
为什么用面向对象:
面向过程缺点:流程和原料固定,扩展比较麻烦。
面向对象的核心:可扩展性。
面向对象能做什么?
经常变化的地方就是面向对象的应用地方。
不能做什么?
面向对象性能低下吗?
性能好坏由设计决定,而不是语言。