乐趣区

关于编程思想:面向过程与面向对象

面向过程

了解

一种以过程为核心的编程思维。剖析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,应用的时候一个一个顺次调用就能够了。

特点

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

长处

性能比面向对象高。

毛病

没有面向对象易保护、易复用、易扩大。

利用场景

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

面向对象

了解

一种以对象为根底的编程思维。把形成问题的事物分解成各个对象,建设对象的目标不是为了实现一个步骤,而是为了形容每个事物在整个解决问题的步骤中的行为和状态的变动。

特点

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

长处

易保护、易复用、易扩大,因为面向对象有封装、继承、多态性的个性,能够设计出低耦合的零碎,使零碎更加灵便、更加易于保护。

毛病

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

利用场景

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

三大特色

封装

将形象失去的数据和行为(或性能)相结合,造成一个“黑盒”,仅对外裸露一些可调用的公共办法。

继承

继承机制容许创立分等级档次的类。继承就是子类继承父类的特色和行为,使得子类对象(实例)具备父类的实例域和办法,或子类从父类继承办法,使得子类具备父类雷同的行为。

多态

同一个行为具备多个不同表现形式或状态的能力。一个类实例(对象)的雷同办法在不同情景有不同表现形式。多态机制使具备不同内部结构的对象能够共享雷同的内部接口。

五大准则

繁多职责准则(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 版)》
面向对象与面向过程的实质的区别
深刻了解面向过程和面向对象编程思维

退出移动版