「一篇闲谈」到底什么是面向对象和面向过程

一、前言

今天一个小盆友问我,到底什么是「面向对象」,什么是「面向过程」,我想起了自己刚开始摸索编程的时候,听了众多老师讲解各种编程语言,各自的特性等等,都是在网上找的视频教程,有问题的时候根本没有人问。就像我建立的那几个专栏一样,我希望我可以尽我所能,把我所理解的知识也好、小技巧也罢,都能分享给大家,今天我们主要来说一下什么是「面向对象」,什么是「面向过程」

二、编程就像做菜

在讲解「面向对象」「面向过程」之前,我们先来理解一下什么是编程,这段话对大神来说,不如鸡肋,我这个人比较喜欢逻辑性特别强的东西,在理解「面向对象」「面向过程」之前,我还是希望我能给一些小白按照逻辑一步一步的讲解下去。

首先,让我们理解一下什么是「编程」

1.「 百度百科解释 」

编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。

2.「 我的理解 」

编程的过程,就像是我们在厨房里面忙来忙去,最后做出来一道色、香、味俱全的美味佳肴。

比如我们现在有一个需求,要做一道美味的蛋炒饭,编程其实就是制定一个详细的蛋炒饭指南,计划好应该如何准备材料、进行处理、进行烹饪,最终得到一份可口的蛋炒饭的过程,而这个做出来的蛋炒饭,就是我们按照既定需求,通过编程一步一步实现出来的软件或程序。

三、来自于天南海北的烹饪方式

我们平时出去旅游,有飞机、高铁、自驾、出租、骑行、步行、大炮、坦克,不对,大炮和坦克是不会有的哈;我们平时睡觉休息,有趴着睡、躺着睡、蹲着睡、站着睡;我们平时打游戏;有PC端游、WEB页游、Android/IOS手游;我们平时做饭,有煎、炒、烹、炸、闷、溜、熬、炖。墨迹了一大堆,看看上面的例子,做一件事会有多种方式方法,我们把这种方式方法称之为「范式」

如果上面的解释,你还没有理解「范式」,那我们这么说,「范式」就是一个领域里面被普遍认可和采纳的标准方法或模式,比如:

  • 点菜过程:当你坐在餐厅里想要吃饭时,通常会有一个明确的流程。你会先看菜单,然后选择你想要的菜品。这个过程就是一个范式,被广泛用于许多不同的餐厅。

  • 上菜流程:一旦你点好菜,服务员会把菜端上桌。这也是一个范式,顾客期望服务员按照一定的次序和方式将菜品送至桌上。

那我们把上面讲过的两个名词:「编程」「范式」结合起来,就是「编程范式」了。

「烹饪范式」包括煎、炒、烹、炸、闷、溜、熬、炖,不管你采用哪一种范式,最后都能得到一碗/一盆/一锅的美味佳肴。

「编程范式」包括面向对象、面向过程、函数式编程、逻辑式编程、声明式编程、并行编程,不管你采用哪一种范式,最后都能得到一个/一堆美味程序。

四、详解烹饪

烹饪有许多不同的方式,每种方式都有自己的特点和适用场景,简单的说,你今天想吃烤肉,你就烤,今天你想吃锅包肉,你就炸,今天你想吃酸菜鱼,你就炖,你就熬,你爱咋咋地,想咋吃你就咋做呗?

  1. 炒:炒菜是一种迅速、高温的烹饪方式,高端的食材往往采用最朴素的烹饪方式,热油凉锅,食材下锅,噼里啪啦一顿炒,有条件的放点耗油啥的调味品,就出锅了啊。这就类似于「面向过程」编程,按照顺序执行一系列操作来达到特定目标。我就想吃个西红柿炒鸡蛋,就别扯别的。
    • 西红柿去皮
    • 鸡蛋敲碎搅匀
    • 下锅炒鸡蛋
    • 盛出鸡蛋、下锅炒西红柿,炒至出汤
    • 放入鸡蛋,继续炒
    • 放调料、盐,喜欢番茄味道放点番茄酱
    • 出锅

侵权必删

上面噼里啪啦一顿炒,我们就利用「面向过程」解决掉了一个我们需要的程序。

  1. 烤:今天我要吃烤羊排,总不可能一根一根的去烤吧?美味、酥脆、外焦里嫩的羊排,得烤一个多小时,我要吃十根,烤十次,啥也不用干了。那咋办,十根放进烤箱一起烤,烤箱可聪明了,他可以一下子帮你烤十根,如果你烤箱足够大的话,直接烤一只羊也行啊。这就类似于「并行编程」,多个任务在同一时间段内并行执行,效率极高啊~~!。

    • 半碗蚝油、半碗淀粉,搅拌均匀成浆糊
    • 均匀的涂抹在一堆羊排上(10根、20根,多大烤箱放多少根
    • 盖上保鲜膜等待1小时
    • 入烤箱,190度烤,1小时翻面
    • 自己看好,外焦里嫩出锅吃

侵权必删
得嘞,利用「并发编程」解决掉了一个我们需要的程序,执行效率极高,到底多高,看你烤箱的性能呗。

  1. 凉拌菜:辣椒有辣椒的味道,黄瓜有黄瓜的味道,香菜有香菜的味道,花生有花生的味道,这些味道,都是上述食材的独特属性,我们利用拌菜技术,将他们混合在一起,创作出一个新的混合物,还蛮好吃的啊~~!这就是面向对象编程,不同的对象有各自的属性和方法,通过交互创建出更复杂的功能。

    • 锅中放少许油,花生米小火炸至变色,盛出备用。
    • 辣椒切开,然后切丝,如果怕太辣,可以去掉里面的筋。
    • 香菜切段、黄瓜切丝
    • 混合辣椒丝,黄瓜丝和香菜段,加入盐,生抽和香油。
    • 倒入炸好的花生米,拌匀就好了。

侵权必删
不增加负担,这里我们就只说「并发编程」、「面向对象」、「面向过程」

五、直接加热的烹饪方式

人类最早烹饪食物的方式可以追溯到史前时代。虽然确切的历史细节已经失去了记录,但根据考古学和人类进化的研究,最早的烹饪方法可能是直接用火烤煮。

你想啊,我们的老祖宗在经历了一个雷把树劈着火了、接触火、保留火种,后面肯定是想着用火去烤那些捕猎得来的动物,所以大街小巷的烤肉,是我们老祖宗最原始的烹饪方式啦~!反过来思考,上面的讲解过程,不管是「并发编程」,还是「面向对象」,还是「面相过程」,似乎都涉及到了做菜的步骤,而我们说了,这个步骤其实是过程,那岂不是所有「编程范式」都包含「面向过程」了,是滴,你如果注意到这个问题了,那你思考的是对的,不同的编程范式出现的时间各有不同,所以肯定有一个最最最基础的编程范式,他就是「面相过程」

  • 面向过程编程: 这是编程中最早出现的范式,可以追溯到计算机科学的早期。它开始于1950年代,当时程序被认为是一系列按照顺序执行的步骤,其中主要关注算法和流程控制。

  • 面向对象编程: 起源可以追溯到1960年代,但它的流行和广泛应用发生在20世纪80年代和90年代。编程语言如Simula、Smalltalk和C++在面向对象的发展中扮演了关键角色。

  • 函数式编程: 函数式编程的基本概念可以追溯到20世纪30年代,但它在编程社区中真正引起关注的时间相对较晚,尤其是在20世纪80年代和90年代。编程语言如Lisp、Haskell和ML推动了函数式编程的发展。

  • 逻辑编程: 逻辑编程范式主要与Prolog编程语言有关,Prolog在20世纪70年代诞生,并在80年代广泛应用于人工智能领域。

  • 声明式编程: 声明式编程的概念早在20世纪70年代就出现了,但它的流行程度在后来的几十年中逐渐上升。领域特定语言(DSL)的出现以及SQL等领域的广泛应用都涉及声明式编程思想。

需要注意的是,编程范式的发展是逐步的,它们的界限也可能模糊。很多现代编程语言和框架结合了多种编程范式的特点,因此在实际应用中往往会看到不同范式的交叉和融合。

这回你知道为什么不管是「并发编程」,还是「面向对象」,还是「面相过程」,似乎都涉及到了做菜的步骤了吗??

六、言归正传

1.面向过程

面向过程编程语言是一类专注于处理按照顺序执行的过程和步骤的编程语言,就像我们上面做菜一样,有具体的过程。

面向过程例子:准备午餐
想象一下你在家里准备午餐。这是一个面向过程的情景。

你要做一份三明治:

  • 拿出面包、蔬菜、肉类和调味料。
  • 切片面包、切菜和煮熟肉类。
  • 在面包上放上肉和蔬菜。
  • 涂上调味料。
  • 吃掉三明治。

这就像你一步一步按照指令完成任务,你需要自己管理每个步骤和材料,确保一切都按照正确的顺序进行。

  • C语言: C语言是一种广泛使用的面向过程编程语言,它强调程序的流程控制和函数的使用。C语言的设计注重效率和低级别的硬件控制,适用于系统编程、嵌入式系统和性能关键的应用。

  • FORTRAN: 初衷于科学和工程计算的FORTRAN(Formula Translation)是一种早期的面向过程编程语言,用于数值计算和科学应用。

  • COBOL: COBOL(Common Business-Oriented Language)是一种用于商业应用的面向过程编程语言,特别适用于处理大规模数据和事务处理。

  • Pascal: Pascal是一种教学和通用编程语言,强调结构化编程,适用于学习编程和开发中等规模的应用。

  • BASIC: BASIC(Beginner’s All-purpose Symbolic Instruction Code)是一种面向初学者的编程语言,用于教育和小规模的应用开发。

这些编程语言强调过程、函数、流程控制和数据管理,是面向过程编程范式的代表。然而,随着编程语言的发展,更多的语言开始融合多种编程范式,使得开发人员可以在同一语言中使用面向对象、函数式等多种编程方式。

2. 面向对象

面向对象例子:玩具小汽车
现在想象你有一个遥控玩具小汽车。

你的玩具小汽车有:

属性:颜色、大小、速度等。
方法:前进、后退、左转、右转等。

你可以:

  • 调用方法使小汽车前进、后退、转弯等。
  • 不需要知道小汽车内部是如何实现这些方法的,你只需要知道如何使用它们。
  • 如果你有多辆小汽车,它们都可以基于相同的类创建,共享相同的方法和属性。
  • 每辆小汽车可以有自己的属性值,比如不同的颜色或速度。

在这个例子中,你可以把玩具小汽车想象成一个对象,而你只需要关心如何与它互动,而不必关心内部的细节。

那你说,面向对象,不需要考虑实现方法,那到底面向对象背后的实现方法是谁来做的呢?

是这样的,当我们说面向对象编程中不需要关心具体的实现方法时,是指在使用对象时,我们不必关心对象内部是如何实现它的方法和功能的。这个工作通常由程序员在创建类和定义方法时完成的。

事实上,面向对象编程的核心思想是一种对面向过程编程的扩展和抽象,它在一定程度上基于面向过程的原理。

因此,可以说面向对象编程是在面向过程编程基础上的一种更高层次的抽象和组织方式,它使代码更具结构性、可扩展性和可理解性。

虽然在实现时仍然涉及面向过程的概念,但这些概念被封装在对象中,不需要直接暴露给使用者。这样的抽象使得编程更加符合人类思维模式,并且有助于构建更复杂的软件系统。

面向对象的实现在很大程度上是基于面向过程的编程原理。面向对象编程可以看作是对面向过程的一种抽象和扩展,它在底层仍然涉及到面向过程的思维方式。

这回明白为什么面向对象不需要考虑具体过程了吗?你要思考的某个模型的「面相过程」的实现方法,那个模型的作者已经帮你思考好了,你只需要「面相对象」直接使用模型就好了。

最通俗易懂的例子来了哈:

你现在要用python-docx依赖库去处理一个docx文件,你知道的,python-docx库里面有 Document、Paragraph、Run等供你调取,当你敲下以下代码,你所做的就是面向对象编程:

from docx import Document

# 面向对象:创建一个文档对象
doc = Document()

# 面向对象:添加标题段落
title_paragraph = doc.add_paragraph()
title_run = title_paragraph.add_run("这是标题")
title_run.bold = True
title_run.font.size = docx.shared.Pt(16)

# 面向对象:添加正文段落
content_paragraph = doc.add_paragraph("这是正文内容。")

你可以自己思考一下,你是不是只调用了 Document 就可以读取文档或者创建文档了呢?那文档到底是怎么读取的?怎么创建的?add_paragraph 又是怎样添加段落的?具体步骤是什么?难道是先热锅、再倒油、再放葱花吗?当然不是,具体的过程不用你思考,因为Document是一个对象,你是面向对象,而这个对象如何实现的,python-docx的作者已经基于面向过程帮你实现好了。

具体来说,以下几点说明了为什么 Document 是面向对象的:

  • 属性和方法: Document 对象具有属性(例如,文档的标题、作者等)和方法(例如,add_paragraph、add_table 等),这些属性和方法用于描述和操作文档对象。

  • 封装: Document 对象将文档的结构和内容封装在一个对象中,隐藏了底层的细节。你不需要直接操作文档的文件格式,而是通过对象方法来进行操作。

  • 抽象: Document 提供了一种高级的抽象,使你可以通过调用方法来实现复杂的操作,而无需了解底层的实现。

七、用 python 举例说明

  1. 下面是一个简单的面向过程编程例子哈:
# 定义一个函数来执行加法运算
def add_numbers(a, b):
    result = a + b
    return result

# 获取用户输入
num1 = float(input("请输入第一个数:"))
num2 = float(input("请输入第二个数:"))

# 调用函数进行加法运算并输出结果
sum_result = add_numbers(num1, num2)
print("两个数的和为:", sum_result)

在这个例子中,我们定义了一个名为add_numbers的函数,该函数接受两个参数并返回它们的和。然后,我们获取用户输入的两个数,并调用函数执行加法运算,最后打印出结果。

  1. 下面是一个简单的面向对象编程示例,展示了如何创建一个表示汽车的类,并实例化对象来操作该类:
# 定义一个表示汽车的类
class Car:
    def __init__(self, make, model, year):
        self.make = make  # 设置汽车制造商
        self.model = model  # 设置汽车型号
        self.year = year  # 设置汽车生产年份
        self.mileage = 0  # 初始化总里程为0

    def drive(self, miles):
        self.mileage += miles  # 增加行驶里程
        print(f"行驶了 {miles} 英里。总里程:{self.mileage} 英里")

    def display_info(self):
        print(f"汽车信息:{self.year} {self.make} {self.model}")  # 显示汽车信息
        print(f"总里程:{self.mileage} 英里")  # 显示总里程

# 创建一个Car对象
my_car = Car("Toyota", "Camry", 2022)  # 使用制造商、型号和年份实例化Car对象

# 显示汽车信息
my_car.display_info()

# 行驶一段距离并显示总里程
my_car.drive(100)
my_car.drive(150)

# 再次显示汽车信息
my_car.display_info()

在这个例子中,我们创建了一个名为Car的类,具有构造函数__init__来初始化汽车的属性。类中还定义了两个方法drive和display_info,用于模拟驾驶汽车和显示汽车信息。然后,我们实例化一个Car对象my_car,并通过调用对象的方法来操作它。

今天的「面向对象」「面向过程」就说到这里哈。

敲键盘两个多小时,只希望能给大家带来一些收获,我只是一个编程小白,如果有说的不对的地方,还望各位大神、大咖不吝指教,如果本文对您有帮助,希望您给个收藏或关注或点赞。

「深入探索OpenPyXL」专栏:https://blog.csdn.net/m0_64359306/category_12399127.html?spm=1001.2014.3001.5482
「python-PDF」专栏:https://blog.csdn.net/m0_64359306/category_12343585.html
「python-DOCX」专栏:https://blog.csdn.net/m0_64359306/category_12318138.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布啦啦李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值