连载:面向对象葵花宝典:思想、技巧与实践(1) - 程序设计思想的发展

史前时代:面向机器

最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。简单来说,就是直接编写0和1的序列来代表程序语言。例如:使用0000 代表 加载(LOAD),0001 代表 存储(STORE)等。 

机器语言由机器直接执行,速度快,但一个很明显的缺点就是:写起来实在是太困难了,一旦你发现自己写错了,改起来更蛋疼!这样直接导致程序编写效率十分低下,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。 

有一个关于机器语言和比尔盖茨的笑话,是说比尔盖茨拿着绣花针在一张光盘上戳,把Windows给戳出来了!但如果真的让你去戳,不要说Windows,连一个简单的“Hello world”都要让人戳到眼睛冒烟! 

由于机器语言实在是太难编写了,于是就发展出了汇编语言。汇编语言亦称符号语言,用助记符代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,。汇编语言由于是采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。例如使用LOAD 来代替 0000,使用STORE来代替0001。 

即使汇编语言相比机器语言提升了可读性,但其本质上还是一种面向机器的语言,编写同样困难,也很容易出错。相信很多计算机毕业的学生至今都对学校的汇编课程中的练习程序心有余悸。 

 

脱离机器第一步:面向过程

面向机器的语言通常情况下被认为是一种“低级语言”,为了解决面向机器的语言存在的问题,计算机科学的前辈们又创建了面向过程的语言。面向过程的语言被认为是一种“高级语言”,相比面向机器的语言来说,面向过程的语言已经不再关注机器本身的操作指令、存储等方面,而是关注如何一步一步的解决具体的问题,即:解决问题的过程,这应该也是面向过程说法的来由。 

相比面向机器的思想来说,面向过程是一次思想上的飞跃,将程序员从复杂的机器操作和运行的细节中解放出来,转而关注具体需要解决的问题;面向过程的语言也不再需要和具体的机器绑定,从而具备了移植性和通用性;面向过程的语言本身也更加容易编写和维护。这些因素叠加起来,大大减轻了程序员的负担,提升了程序员的工作效率,从而促进了软件行业的快速发展。 

典型的面向过程的语言有:COBOL、FORTRAN、BASIC、C语言等。

 

第一次软件危机:结构化程序设计

随着计算机硬件的飞速发展,以及应用复杂度越来越高,软件规模越来越大,原有的程序开发方式已经越来越不能满足需求了。1960年代中期开始爆发了第一次软件危机,典型表现有软件质量低下、项目无法如期完成、项目严重超支等,因为软件而导致的重大事故时有发生。例如1963年美国(http://en.wikipedia.org/wiki/Mariner_1) 的水手一号火箭发射失败事故,就是因为一行FORTRAN代码错误导致的。 

软件危机最典型的例子莫过于IBM的System/360的操作系统开发。佛瑞德·布鲁克斯(Frederick P. Brooks, Jr.)作为项目主管,率领2000多个程序员夜以继日的工作,共计花费了5000人一年的工作量,写出将近100万行的源码,总共投入5亿美元,是美国的“曼哈顿”原子弹计划投入的1/4。尽管投入如此巨大,但项目进度却一再延迟,软件质量也得不到保障。布鲁克斯后来基于这个项目经验而总结的《人月神话》一书,成了史上最畅销的软件工程书籍。 

为了解决问题,在1968、1969年连续召开两次著名的NATO会议,会议正式创造了“软件危机”一词,并提出了针对性的解决方法“软件工程”。虽然“软件工程”提出之后也曾被视为软件领域的银弹,但后来事实证明,软件工程同样无法解决软件危机。 

差不多同一时间,“结构化程序设计”作为另外一种解决软件危机的方案被提出来了。 Edsger Dijkstra 于1968发表了著名的《GOTO有害论》的论文,引起了长达数年的论战,并由此产生了结构化程序设计方法。同时,第一个结构化的程序语言Pascal也在此时诞生,并迅速流行起来。 

结构化程序设计的主要特点是抛弃goto语句,采取“自顶向下、逐步细化、模块化”的指导思想。结构化程序设计本质上还是一种面向过程的设计思想,但通过“自顶向下、逐步细化、模块化”的方法,将软件的复杂度控制在一定范围内,从而从整体上降低了软件开发的复杂度。结构化程序方法成为了1970年代软件开发的潮流。 

科学研究证明,人脑存在人类短期记忆一般一次只能记住5-9个事物,这就是著名的 7+- 2原理。结构化程序设计是面向过程设计思想的一个改进,使得软件开发更加符合人类思维的7+-2特点。

 

第二次软件危机:面向对象程序设计

结构化编程的风靡在一定程度上缓解了软件危机,然而好景不长,随着硬件的快速发展,业务需求越来越复杂,以及编程应用领域越来越广泛,第二次软件危机很快就到来了。 

第二次软件危机的根本原因还是在于软件生产力远远跟不上硬件和业务的发展,相比第一次软件危机主要体现在“复杂性”,第二次软件危机主要体现在“可扩展性”、“可维护性”上面。传统的面向过程(包括结构化程序设计)方法已经越来越不能适应快速多变的业务需求了,软件领域迫切希望找到新的银弹来解决软件危机,在这种背景下,面向对象的思想开始流行起来。 

面向对象的思想并不是在第二次软件危机后才出现的,早在1967年的Simula语言中就开始提出来了,但第二次软件危机促进了面向对象的发展。 面向对象真正开始流行是在1980s年代,主要得益于C++的功劳,后来的Java、C#把面向对象推向了新的高峰。到现在为止,面向对象已经成为了主流的开发思想。 

虽然面向对象开始也被当做解决软件危机的银弹,但事实证明,和软件工程一样,面向对象也不是银弹,而只是一种新的软件方法而已。 

虽然面向对象并不是解决软件危机的银弹,但和面向过程相比,面向对象的思想更加贴近人类思维的特点,更加脱离机器思维,是一次软件设计思想上的飞跃。

========================================================================

转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/17249863

========================================================================

时间: 2024-08-30 19:14:05

连载:面向对象葵花宝典:思想、技巧与实践(1) - 程序设计思想的发展的相关文章

连载:面向对象葵花宝典:思想、技巧与实践(28) - 设计原则:内聚&耦合

前面通过实例讲解了一个一环扣一环的面向对象的开发流程:用例模型 -> 领域模型 -> 设计模型(类模型 + 动态模型),解答了面向对象如何做的问题.接下来我们就要讲"如何做好面向对象设计"的技巧了 =================================================================== [内聚] 参考维基百科的解释,内聚的含义如下: cohesion refers to the degree to which the eleme

连载:面向对象葵花宝典:思想、技巧与实践(3) - 面向过程 vs 面向对象

面向过程 在介绍面向对象之前,我们首先要介绍"面向过程",首先是因为"面向过程"是软件思想中的鼻祖:其次是因为只有了解了面向过程,你才能更好的了解面向对象!正所谓:知己知彼百战百胜!  面向过程是一种以"过程"作为中心的编程思想,其中过程的含义就是"完成一件事情的步骤".  面向过程其实是一种"机械的思想",它就像流水线一样,一个阶段衔接一个阶段,每个阶段都有自己的输入.处理.输出,而在流水线上流动的就是我

《.NET程序员面试秘笈》----第1章 .NET概念题 面试题1 简述面向对象的程序设计思想

第1章 .NET概念题 .NET程序员面试秘笈 本章内容包含面向对象程序设计和.NET的基础概念题,由于这部分题目涉及的范围比较广,因此在很多公司的面试题中占了比较大的比重.很多.NET程序员在编写代码时非常熟练,但往往缺乏对基础知识的深刻理解,从而导致面试失败.这类知识是程序设计的基础,如果不加以重视,程序编写就没有创造性,只能学一步,做一步. 面向对象编程是当前流行的编程方式,被大多数高级语言支持..NET程序同样是基于面向对象的设计,只有深刻理解面向对象的编程理念,才可以开发出结构良好的.

连载:面向对象葵花宝典:思想、技巧与实践(26) - 类模型三板斧

类模型设计其实就是程咬金打天下 -- 三板斧 而已 :) 第一斧(照猫画虎):领域类映射 面向对象类设计首先要解决的一个问题是:类从哪里来 ? 有的人可能会认为,要发挥想象力.创造力.....等各种"力"--这种方法的主要问题是:我们不是在进行纯粹的艺术创造,而是要最终满足客户需求,而不能天马行空. 有的人可能会想到,参考其它的系统吧,把类似系统拿过来改吧改吧 --这种方法的主要问题是:如果没有其它类似系统给你参考呢 ?还有的人干脆就说:拍脑袋吧,凭感觉吧 -- 这种方法的主要问题是:

连载:面向对象葵花宝典:思想、技巧与实践(38) - 设计模式之道

很多人能够熟练背诵出所有的设计模式,能够快速画出各种设计模式的UML类图,也能够熟练的写出<设计模式>一书中各个模式的样例代码.但一到实际的项目设计和开发的时候,往往都会陷入迷茫:要么无从下手,不知道哪个地方要用设计模式:要么生搬硬套,胡乱使用设计模式,将方案和代码搞得一团乱麻. =========================================================================== [知易行难 -- 设计模式应用的问题] 形而下者谓之器,形而上者

连载:面向对象葵花宝典:思想、技巧与实践(14) - 面向对象开发技术流程

抛开项目流程,让我们来谈谈"技术流程"吧!! 谈到流程,很多人立刻就会想到熟悉的瀑布模型.螺旋模型.迭代开发.敏捷.RUP等一堆软件工程相关的软件开发流程,但对于大部分人来说,这些流程仅仅是项目管理上的概念,只有项目经理开例会时那红红绿绿的甘特图.燃尽图.路径图等,或者只有评估工作量和是否要加班的时候,我们才会意识到这些流程的存在.   通俗的讲,项目管理上的流程主要是用于指导项目经理如何管理项目用的,但对于如何指导开发人员如何开发项目,并无多大用处.一个典型的情况就是刚毕业的大学生,

连载:面向对象葵花宝典:思想、技巧与实践(23) - 领域建模三字经

看起来有点不可思议,需求阶段"白纸黑字"的用例文档,经过我们一步一步的操作,逐步就得到了"图形化"的领域模型,面向对象初具雏形. 领域建模的三字经方法:找名词.加属性.连关系.   我们接下来以一个样例看看领域模型具体如何建模. 1.1. 找名词 我们以POS机买单的用例来看看具体如何建领域模型.   首先,将用例中所有的名词挑选出来(如下用例文档中蓝色加粗的词组): [用例名称] 买单 [场景] Who:顾客.收银员 Where:商店的收银台 When:营业时间

连载:面向对象葵花宝典:思想、技巧与实践(12) - “继承” 详解

继承 = 遗传 继承是面向对象最基本的特征,如果一个语言没有继承机制,就谈不上真正的面向对象的语言.   继承本身很好理解,和我们日常生活中的"继承"概念基本一样:子承父业!所以,你可以看到面向对象的编程语言里面,有了"父类"."子类"的概念.   但是我个人认为"继承"这个说法并不确切,一般我们理解"继承",都是理解为继承产业.继承财产,例如李泽钜继承李嘉诚的事业.但在面向对象的领域里面,并不是"

连载:面向对象葵花宝典:思想、技巧与实践(36) - 设计原则如何用?

经过前面深入的阐述,SOLID的原则我们已经基本上讲清楚了,但如果想熟练的应用SOLID原则,仅仅知道SOLID是什么(what)还不够,我们还需要知道SOLID原则在什么时候和什么场景应用(when或where).   幸运的是,SOLID原则的5个独立原则在实际应用中基本上都是独挡一面,并不会在某个地方需要同时从可选的几个原则中挑选一个最优的原则来应用,这样大大降低了我们应用SOLID原则的难度.   SOLID原则具体的应用场景如下: SRP原则:用于类的设计 当我们想出一个类,或者设计出