[总结]软件开发及面向对象编程

本文是一篇关于架构师训练营第二周学习总结文章,主要对架构师实现自己架构目标的主要手段一课中,将涉及的内容进行总结。本文为第一部分,主要谈谈软件开发简史、什么是计算机和程序、编程语言的实质、编程方法的演进、什么是面向对象编程和面向对象编程三大特征。

软件开发简史

计算机软件编程是个非常新兴的行业,程序员这一职业的出现不过半个多世纪,但是人类从事软件编程的探索却要久远的多,在计算机出现之前,甚至蒸汽机出现之前,人类就开始探索软件编程了。

最早开始编程探索的人是德国人莱布尼茨,早在 1700 年,莱布尼茨就期望将各种事物都通过一种逻辑语言进行描述,然后用一种可执行演算规则的机器计算事物的各种结果,这种思想和我们现代软件编程及计算机已经差不多了,莱布尼茨为了实现这个想法,进行大量的工作,获得了丰硕的成果,其中就包括了微积分和二进制。

莱布尼茨制造的可编程计算机的梦想没有成功,过了大概 100 年,法国人雅卡尔发明了一台可编程的织布机,这种织布机读取纸带上的打孔,进而控制织布机不同的图案。于是人们开始尝试将打孔纸带用于计算机编程。19 世纪中叶,英国人 Ada 利用打孔纸带写出人类第一个软件程序,该程序已经包含了循环和子程序,但能够运行这个程序的计算机却在 100 年以后才被发明,Ada 因此被为是人类第一个程序员。科技发明受时代的限制,天才们的想象力和聪明才智却可以超越时代。

什么是计算机和程序?

人类发明制造计算机器有非常悠久的历史,但是这些计算机器都是专门进行数值计算的,加减乘除、微积分等。而从莱布尼茨、Ada到图灵、冯诺依曼,这些现代计算机的开创者们试图创造的是一种通用的计算机,这种计算机不是读取数据进行计算,而是读取数据进行计算,这些数据本身包含着计算机的逻辑,这个数据就是程序。

现代计算机与现代的程序

当冯诺依曼在ENIAC计算机上输入第一个程序的时候,标志着现代计算机的诞生,也意味着软件编程这一新兴的行业即将出现。 最早的计算机编程非常麻烦,程序员需要将电线编来编去,作为输入数据,以控制计算机执行,这也是编程这个词的由来,不过很快人们就将打孔纸带应用到计算机上,编程的效率极大提升。

编程语言的实质

编程的目的是用计算机来解决现实世界的问题,编程的过程是,在计算机所能理解的“模型”(解空间)和现实世界(问题空间)之间,建立一种联系。编程语言是一种“抽象”的机制,问题是对“谁”来抽象。

编程语言的实质
编程语言的实质

抽象的种类

  • 机器代码和汇编语言——对基础机器进行抽象
  • 非结构化的高级语言(如Basic、Fortran)——对计算处理逻辑抽象
  • 结构化的程序设计——开始对问题领域进行一定程度的抽象
  • 面向对象的程序设计——直接表达问题空间内的元素

编程方法的演进

编程方法演进
编程方法演进

编程的核心要素

编程核心要素
编程核心要素

什么是面向对象编程 

第一个成功的面向对象语言Smalltalk描述:

万物皆为对象 
程序是对象的集合,它们通过发送消息来告知彼此所要做的 
每个对象都有自己的由其他对象所构成的存储 
每个对象都拥有其类型 
某一特定类型的所有对象都可以接收同样的消息

后期的面向对象语言如C++、Java、C#等,都是在这个定义的基础上设计的。

什么是对象? 

对象即具有状态、行为和标识。

状态每个对象可以有自己的数据
行为每个对象可以产生行为
标识每个对象都区别于其它的对象

面向对象编程的三大特征

封装性:定义对外接口,隐藏实现细节(访问控制)。

封装并不是面向对象编程语言独有,面向过程的编程语言如C语言,也可以实现封装特性,在头文件.h里面定义方法,而在实现文件.c文件里定义具体的结构和方法实现,从而使用依赖 .h头文件的外部程序只能够访问头文件里定义过的方法,这样同样实现了变量和函数的封装,以及访问权限的控制。

面向对象-封装
面向对象-封装

继承性:IS-A关系和HAS-A关系,接口的重用。

继承也不是面向对象独有的。C语言也可以实现继承。如果A 结构体包含B结构体的定义,那么就可以理解成A继承了B,定义在B结构上的方法可以直接通过强制类型转换执行A结构体的数据。

面向对象-继承
面向对象-继承

多态性:向上转形,对象互换的魔法

多态也不是面向对象独有的。因为有指向函数的指针,多态事实上在C语言中也可以实现,但是使用指向函数的指针实现多态是非常危险的,因为这种多态没有语法和编译方面的约束,只能靠程序员之间约定,一旦出现Bug,调试非常痛苦。因此在面向对象过程语言的开发中,这种多态并不能频繁使用。而在面向对象的编程语言中,多态非常简单:子类实现父类或者接口的抽象方法,程序使用抽象父类或者接口编程,运行期注入不同的子类,程序就表现不同的形态,是为多态。

《[总结]软件开发及面向对象编程》的相关评论

发表评论

必填项已用 * 标记,邮箱地址不会被公开。