计算机诞生以来,为适应程序不断增长的复杂过程,程序设计方法论发生了巨大变化。例如,在计算机发展初期,程序设计是通过输入二进制机器指令来完成的。在程序仅限于几百条指令的情况下,这种方法是可接受的。随着程序规模的增长,人们发明了汇编语言,这样程序员就可以使用代表机器指令的符号表示法来处理大型的、复杂的程序。随着程序规模的继续增长,高级语言的引入为程序员提供了更多的工具,这些工具可以使他们能够处理更复杂的程序。
20世纪60年代诞生了结构化程序设计方法,Pascal和C语言是使用这种方法的语言。结构化编程采用了模块分解与功能抽象和自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子程序,便于开发和维护。但是由于在实际开发中需求会经常发生变化,因此,它不能很好地适应需求变化的开发过程。结构化程序设计是面向过程的。
面向对象程序设计师一种功能强大的设计方法。它吸收了结构化程序设计的思想精华,并且提出了一些新的概念。广义上讲,一个程序可以用两种方法组织:一是围绕代码(发生了什么);二是围绕数据(谁受了影响)。如果仅使用结构化程序设计技术,那么程序通常围绕代码来组织。
面向对象程序则以另一种方式工作,它们围绕数据来组织程序。在面向对象语言中,需要定义数据和作用于数据的操作。
1 面向过程
面向过程编程(Procedure Oriented Programming,OPP)是一种以事物为中心的编程思想。主要关注“怎么做”,即完成任务的具体细节。它以过程(可以理解为方法、函数、操作)作为组织代码的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
2 面向对象
2.1 概述
面向对象编程(Object Oriented Programming,OOP)是一种以对象为基础的编程思想。主要关注“谁来做”,即完成任务的对象。使用这种方法开发的软件具有易维护性、可重用和可扩展等特性。
2.2 基本概念
1.对象
在现实世界中,对象无处不在。人们身边存在的一切事物都是对象。例如,一个人、一辆汽车、一台电视机、一所学校甚至一个地球,这些都是对象。除了这些可以触及的事物是对象外,还有一些抽象的概念,如一次会议、一场足球比赛、一个账户等也都可以抽象为一个对象。
一个对象一般具有两方面的特征:状态和行为。状态用来描述对象的静态特征,行为用来描述对象的动态特征。
例如,一辆汽车可以用下面的特征描述:生产厂家、颜色、最高时速、出厂年份、价格等。汽车可以启动、加速、转弯和停止等,这些是汽车所具有的行为或者说施加在汽车上的操作。又如,一场足球比赛可以通过比赛时间、比赛地点、参加的球队和比赛结果等特性来描述。软件对象也是对现实世界对象的状态和行为的模拟,如软件中的窗口就是一个对象,它可以有自己的状态和行为。
通过上面的说明,可以给“对象”下一个定义,即对象是现实世界中的一个实体,它具有如下特征:有一个状态,用来描述它的某些特征。有一组操作,每个操作决定对象的一种功能或行为。
因此,对象是其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的实体。一个对象可以非常简单,也可以非常复杂。复杂的对象往往是由若干个简单对象组合而成。例如,一辆汽车就是由发动机、轮胎、车身等许多其他对象组成。
2.类
类(class)是面向对象系统中最重要的概念。在日常生活中经常提到类这个词,如人类、鱼类、鸟类等。类可以定义为具有相似特征和行为的对象的集合,如人类共同具有的区别于其他动物的特征有直立行走、使用工具、使用语言交流等。所有的事物都可以归到某类中。例如,汽车属于交通工具类,手机属于通信工具类。
属于某个类的一个具体的对象称为该类的一个实例(instance)。例如,我的汽车是汽车类中的一个实例。实例与对象是同一个概念。
类与实例的关系是抽象与具体的关系。类是多个实例的综合抽象,实例是某个类的个体实物。
3.消息
对象与对象之间不是孤立的,它们之间存在着某种联系,这种联系是通过消息传递的。例如,开汽车就是人向汽车传递消息。
一个对象发送的消息包含三方面的内容:接收消息的对象;接受对象采用的方法(操作);方法所需要的参数。
2.3 面向对象的基本特征
面向对象最基本的特征为:封装性、继承性、多态性。
1.封装性
封装(encapsulation)就是把对象的状态(属性)和行为(方法)结合成一个独立的系统单位,并尽可能的隐藏对象的内部细节。封装使得一个对象形成两个部分:接口部分和实现部分。对用户来说,接口部分是可见的,而实现部分是不可见的。封装提供了两种保护。首先封装可以保护对象,防止用户直接存取对象的内部细节;其次封装也保护了客户端,防止对象实现部分的改变可能产生的副作用,即实现部分的改变不会影响到客户端的改变。
2.继承性
继承(inheritance)的概念普遍存在于现实世界中。它是一个对象获得另一个对象属性的过程。继承之所以重要,是因为它支持层次结构类的概念。可以发现,在现实世界中,许多知识都是通过层次结构方式进行管理的。
3.多态性
多态性(ploymorphism)是面向对象编程语言的一个重要特征。所谓多态,是指一个程序中相同的名字表示不同含义的情况。面向对象中多态有多种情况。在简单的情况下,在同一个类中定义了多个名称相同的方法,即方法重载;另一种情况是子类中定义的与父类中的方法同名的方法,即方法覆盖。这两种情况都称为多态,且前者为静态多态,后者称为动态多态。
3 面向对象与面向过程的区别
如今主流的软件开发思想有两种:一个是面向对象,另一个是面向过程。面向过程出现的较早,典型代表为C语言,开发中小型项目的效率很高,但是很难适应如今主流的大中型项目开发场景。面向对象则出现的更晚一些,典型代表为Java和C++等语言,更加适用于大型开发场景。两种开发思想各有长短,
对于面向过程的思想:当需要实现一个功能时,看中的是每一个步骤怎么做,整体的过程是怎样的,每一个过程都需要自己亲力亲为。
对于面向过程的思想:当需要实现一个功能时,不看重具体的过程和步骤是怎样的,而是关心“谁能帮我做这件事”。
面向过程是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。
面向对象是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。类和继承是是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和类的继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性。