Java之路:面向对象与面向过程

一、结构化程序设计

早期的程序设计,大量使用共享变量(全局变量)和goto语句,这使得代码结构比较混乱,不容易改错和复用。

后来有人证明所有的有意义的程序流程都可以使用顺序、选择和循环来实现,并由此提出结构化程序设计。

它的主要观点是采用自顶向下逐步求精模块化的程序设计方法,使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环这三种基本控制结构来构造。

结构化程序设计主要强调的是程序的易读性。在该程序设计思想的指导下,编程基本是通过写不同目的的函数/过程来实现,故又称为面向过程编程(Procedure Oriented Programming,POP))。

面向过程开发方式是对计算机底层结构的一层抽象,它把程序的内容分为数据和操纵数据的操纵两个部分。这种编程方式的核心问题是数据结构和算法的开发和优化。

结构化程序设计方法可以用一句话概括:

程序 = 算法 + 数据结构

这里的“算法”可以用顺序、选择、循环这三种基本控制结构来实现。
这里的“数据结构”是指数据以及其相应的存取方式。

算法和数据结构的关系如下图:

在这里插入图片描述

二、面向对象程序设计

(Object-oriented programming,OOP)

面向对象的思想主要是基于抽象数据类型(Abstract Data Type, ADT)。

在结构化编程过程中,人们发现把某种数据结构和专用于操纵它的各种操作以某种模块化方式绑定到一起会非常方便,做到“特定数据对应特定处理方法”,使用这种方式进行编程时数据结构的接口是固定的。 如果对抽象数据类型进一步抽象,就会发现把这种数据类型的实例当作一个具体的东西、事物、对象,就可以引发人们对编程过程中怎样看待所处理的问题的一次大的改变。

抽象数据类型方法虽然也有一定的抽象能力,但其核心仍然是数据结构和算法

而面向对象方法直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。可以说,面向对象革命的最重要价值就在于改变了人们看待和处理问题的方式

例如,在现实世界中桌子代表了所有具有桌子特征的事物,人类代表了所有具有人特征的生物。

这个事物的类别映射到计算机程序中,就是面向对象(class)的概念。

可以将现实世界中的任何实体都看作是对象

例如在人类中有个叫张三的人,张三就是人类中的实体。

对象之间通过消息相互作用

比如张三这个对象和李四这个对象通过说话的方式相互传递消息。

现实世界中的对象均有属性和行为

例如张三有属性:手、脚、脸等,行为有:说话、走路、吃饭等。

类似的,映射到计算机程序上,属性则表示对象的数据行为表示对象的方法(其作用是处理数据或同外界交互)

现实世界中的任何实体都可归属于某类事物,任何对象都是某一类事物的实例。

所以在面向对象的程序设计中一个类可以实例化多个相同类型的对象

面向对象编程达到了软件工程的三个主要目标:重用性灵活性扩展性

三、面向对象程序设计的基本特征

主要特征:封装性继承性多态性

1、封装性(encapsulation)

封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。

封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。

封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓其行为实现的细节,只须用设计者提供的消息来访问该对象。

2、继承性

继承性是子类共享其父类数据和方法的机制。它由类的派生功能体现

一个类直接继承其他类的全部描述,同时可修改和扩充。

继承具有传递性。

继承分为单继承(一个子类有一父类)和多重继承(一个类有多个父类)。

类的对象是各自封闭的,如果没继承性机制,则类的对象中的数据、方法就会出现大量重复。

继承不仅支持系统的可重用性,而且还促进系统的可扩充性。

3、多态性

对象根据所接收的消息而做出动作。

同一消息被不同的对象接受时可产生完全不同的行动,这种现象称为多态性。

利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。

例如:同样是run方法,飞鸟调用时是飞,野兽调用时是奔跑。

多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。

在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。

综上可知,在面对象方法中,对象传递消息分别表现事物事物间相互联系的概念。

类和继承是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。

这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性类的继承性

通过封装能将对象的定义对象的实现分开,通过继承体现类与类之间的关系,以及由此实现动态联编实体的多态性,从而构成了面向对象的基本特征。

四、面向对象编程和面向过程编程的比较

1、两种编程范式之间的区别

  1. 面向过程

面向过程编程采用的是“自上而下步步求精”的编程思想,人们更易于理解这种思想。

将程序一步一步的分解,并按照一定的顺序执行。这就是面向过程程序设计,以过程为中心以算法为驱动

程序 = 算法 + 数据结构

缺点:面向过程的程序上一步和下一步环环相扣,如果需求发生变化那么代码的改动会很大,这样很不利于软件的后期维护和扩展

  1. 面向对象

面向对象程序设计的出现就可以很好的解决了这一问题,它的设计思想是:

程序 = 对象 + 消息传递

用户首先自定义的数据结构——“类”,然后用该类型下的“对象” 组装程序。对象之间通过“消息”进行通讯。每个对象包括数据以及对数据的处理,每个对象都像是一个小型的“机器” 。

优点:面向对象设计使程序更容易扩展,也更加符合现实世界的模型

缺点:但是 “任何事物都有两面性”,面向对象程序设计有其优点,但也带来了“副作用”——执行效率要低于面向过程程序设计

所以进行科学计算和要求高效率的程序中,面向过程设计要好于面向对象设计。而且面向对象程序的复杂度要高于面向过程的程序,如果程序比较小,面向过程要比面向对象更加清晰。

更为具体来说,为解决某个任务,面向过程程序设计首先强调的“该怎么做(How to do?)” 。

这里的“How对应的解决方案就形成一个个功能块—function(函数)

面向对象程序设计首先考虑的是 “该让谁来做(Who to do?)”。

这里的Who就是对象,这些对象完成某项任务的能力就构成一个个method(方法),最后一系列具备一定的方法的对象“合力”能把任务完成。

例如,对于“吃东西”这个任务,面向过程强调的是“如何去吃”,“人”只是一个参数;而面向对象强调的是“人”,“吃东西”只是人内部能实现的一个方法。二者之间的对比如下图所示。

2、两种编程范式之间的联系

面向对象是在面向过程的基础上发展而来的,只是添加了它独有的一些特性

面向对象程序中的对象就是由数据和方法构成,所以完整的面向对象概念应该是:

对象 = 数据 + 方法

更进一步的可以描述为:

程序 =对象 + 消息传递 = (数据 + 方法) +消息传递

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84777991