面向过程与面向对象

梦冧

面向过程

理解

一种以过程为中心的编程思想。分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

特点

自顶向下的编程 「函数是一等公民」,如下图所示

优点

性能比面向对象高。

缺点

没有面向对象易维护、易复用、易扩展。

应用场景

性能要求较高且规模较小的问题。

面向对象

理解

一种以对象为基础的编程思想。把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述每个事物在整个解决问题的步骤中的行为和状态的变化。

特点

高度实物抽象化 「对象是一等公民」

优点

易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。

缺点

性能比面向过程低(面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小的都开销很大)。

应用场景

规模较大且对维护性、复用性及扩展性的要求较高。

三大特征

封装

将抽象得到的数据和行为(或功能)相结合,形成一个“黑盒”,仅对外暴露一些可调用的公共方法。

继承

继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

多态

同一个行为具有多个不同表现形式或形态的能力。一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

五大原则

单一职责原则(SRP)

一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。

开放封闭原则(OCP)

对象或实体应该对扩展开放,对修改封闭。

里氏替换原则(LSP)

在对象x为类型T时f(x)成立,那么当S是T的子类时,对象y为类型S时f(y)也应成立(即对父类的调用同样适用于子类)。

依赖倒置原则(DIP)

高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象(即具体实现应该依赖于抽象,而不是抽象依赖于实现)。

接口隔离原则(ISP)

不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多。

异同点

1.两者都是软件开发思想,先有面向过程,后有面向对象;
2.封装性:面向过程是封装的是功能,而面向对象封装的是数据和功能,并且面向对象具有继承性和多态性;
3.编程特点:面向过程是自顶向下的编程 「函数是一等公民」、面向对象是高度实物抽象化 「对象是一等公民」

举个栗子

造汽车

汽车的组成有发动机、轮胎等诸多配件组成,造汽车的步骤假设一般是先造发动机、再造轮胎、再造车架等配件、最后完成汽车的组装。

面向过程
将造汽车步骤分别封装成函数实现(如造发动机makeEngine()、造轮胎makeTyre()、组装汽车assembleVehicle()等),然后按照步骤依次调用实现造车(makeEngine()->makeTyre()->assembleVehicle())。

面向对象
分析造汽车这个问题中涉及的事物(汽车、发动机、轮胎等),分别为其封装构建一个类,如汽车Vehicle(属性:颜色、发动机、轮胎等,方法:启动、刹车等)、发动机Engine(属性:颜色、材质、重量等,方法:运行、停止等)、轮胎Tyre(属性:颜色、材质、重量等,方法:滚动、停止等)。造车的话就是先创建一个汽车对象,然后创建并赋值汽车组成部分(属性)需要的对象,一个汽车就造好了。

五子棋

五子棋的基本游戏规则大家都了解,就不过多的赘述了。

面向过程
首先分析问题的步骤:1.开始游戏 2.白子先走 3.绘制画面 4.判断输赢 5.轮到黑子 6.绘制画面 7.判断输赢 8.返回步骤2 9.输出最后结果。把上面分析出来的每个步骤用不同的方法来实现。

面向对象
分析五子棋这个问题中涉及的事物(玩家、棋子、棋盘、规则),分别为其封装构建一个类,1.五子棋分为黑白双方且这两方的行为一模一样 2.棋盘系统,负责绘制画面 3.规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接收用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

Q&A

面向过程和面向对象的区别是什么?

问题分析:
该问题主要涉及到面向过程和面向对象这两种编程思想的基本定义和异同点。

问题回答:
面向过程是一种以过程为中心的编程思想,将问题分解成一个一个的步骤,然后用函数去封装各个步骤的功能,再按照顺序调用函数就行了。面向对象是一种以对象为中心的编程思想,将问题涉及到的事物分解成各个对象,建立对象的目的不是为了描述某一个步骤,而是为了描述每个事物在解决问题的步骤中涉及的行为和状态的变化。面向过程是一种自上而下的编程,函数是一等公民;但面向对象是一种高度抽象化的编程,对象是一等公民(特点)。面向过程封装的是功能,而面向对象封装的是数据和功能并且面向对象还具有继承性和多态性(封装性)。虽然面向过程和面向对象都是编程思想,但是先有面向过程才有面向对象,其实面向对象的行为封装的执行方法内部其实也是针对这个具体行为或步骤的面向过程实现。

用面向对象的思想谈一谈面试的“过程”?

问题分析:
该问题主要想考察的是候选人对面向过程和面向对象这两种编程思想的理解并且能否灵活运用在实践场景,而不仅仅是背诵概念(这种面试题非常好,不仅能看到候选人对相关理论概念的理解还能考察其对相关概念的理解程度以及实践中对相关概念的应用情况如何)。
首先肯定是先要知道面试的步骤(一般情况-电面)=>1.面试官打电话给候选人预约面试时间2.在面试时间面试官和候选人都已在线,开始面试3.候选人做一下个人的自我介绍4.面试官开始提问5.候选人根据面试官的问题作答6.返回第四部,循环执行直到面试官不再提问7.面试官会在正式的面试提问环节结束后提出候选人是否有什么问题的问题8.候选人提问9.面试官作答10.面试结束。

问题回答:
用面向对象的思想分析这个“面试过程问题”,涉及的事物有面试官,候选人,通讯工具(电话),面试官属性有名字、身份标识(面试官)、候选人(在此种场景下是一个面试官面试一个候选人),行为有使用通讯工具、提出问题、解答问题、结束面试;候选人属性有名字、身份标识(候选人),行为有接听通讯工具、提出问题、解答问题。整个过程就非常清晰了,面试官使用指定的通讯工具联系候选人,候选人应答完成一对一连接建立,面试官对候选人提问,候选人对面试官的指定问题作答,候选人对面试官提问,面试官对候选人的指定问题作答。面试官和候选人都没有新的提问后,面试官结束面试。

参考

《Java核心技术·卷 I(原书第10版)》
面向对象与面向过程的本质的区别
深入理解面向过程和面向对象编程思想

阅读 1.8k

梦冧(lín)是一个爱笑的程序猿

1 声望
0 粉丝
0 条评论

梦冧(lín)是一个爱笑的程序猿

1 声望
0 粉丝
宣传栏