一文教你区分面向过程和面向对象编程

(本文完整的pdf版原文,请关注 “张张学算法” 公众号并回复 “006” 领取~)

一、编程思想

    编程的本质是逻辑,要想学好编程,不仅要掌握基本功——编程语言,更要培养良好的编程思想,面向过程和面向对象是两种重要的编程思想。数据结构与算法是编程能力,而不是编程思想。

    优秀代码的原则:高复用、低耦合。这两个原则保证代码的灵活性高、方便改动、复用性高,能够提高代码编写效率。

二、面向过程

2.1 面向过程定义

    面向过程是绝大部分程序员的思想,它一种以过程为中心,依次把解决问题的步骤分析出来,并用函数封装好,后续在主函数中按照具体步骤调用相应的函数。

    面向过程编程的程序主体是函数,一个函数就是一个封装起来的模块,各个子步骤往往是通过各个函数来完成,因此面向过程是以行为(函数)为中心,始终关注的是怎么一步一步解决问题,从而实现函数的顺序执行。传统的面向过程的编程思想总结起来就八个字——自顶向下,逐步细化,它将要实现的功能描述为一个从开始到结束按部就班的连续的步骤(过程),依次逐步实现完成这些步骤。

2.2 优缺点

三、面向对象

3.1 面向对象定义

    当问题的规模变得很大时,用面向过程的思想是远远不够的,所以就出现了面向对象的编程思想。

    面向对象编程是以数据(对象)为中心的编程思想,它把要解决的问题分解成各个对象(而不是各个步骤),比如世界上有很多的人事物,每个人事物都是一个独立的对象,都有自己的属性和行为,对象与对象之间通过方法来交互。建立对象的目的不是为了完成一个步骤,而是为了描述某个对象在解决整个问题步骤中的属性和行为。

    面向对象编程的分析问题步骤:分析问题中参与其中的有哪些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。现实世界中,任何一个操作或者是业务逻辑的实现都需要一个实体来完成,实体就是动作的支配者,没有实体,就没有动作发生。

    面向对象编程是比较高级和抽象的思想,它具有三大特性五大原则:封装、继承、多态、单一、开闭、里氏替换、依赖倒置、接口隔离。

    面向对象的思想就是优秀代码原则的体现:

  • 面向对象的继承性是高复用的体现;
  • 面向对象使得面向过程的变量和函数限制在对象里面,变成了对象的一部分,使得变量和函数有了单独的执行环境,从而使得变量和函数与外界隔离,这就是低耦合的体现。

    如何培养面向对象编程思想?

  • 时刻谨记面向对象的三大特性五大原则;
  • 不断地重构已经写好的业务逻辑代码。

3.2 优缺点

3.3 面向过程和面向对象的区别

  • 面向过程适合开发中小型项目,面向对象适合开发大型项目;
  • 面向对象和面向过程最本质的区别在于考虑问题的出发点不同。面向过程是以事件流程为考虑问题的出发点,而面向对象则是以参与事件的角色(对象) 为考虑问题的出发点,所以面向对象在处理问题时更加灵活;
  • 对于面向过程的思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为。对于面向对象的思想:当需要实现一个功能的时候,看重的并不是过程和步骤,而是关心的是对象,每个对象执行什么行为。

四、一个小例子

4.1 例1

    以已知圆的半径,求圆的周长和面积为例,理解面向过程和面向对象编程的区别。

    面向过程的分析思路是:分别定义求周长、面积的两个函数,这两个函数的输入都是圆的面积,在主函数中依次调用两个函数即可。

def cal_round(para):
    pass
    
def cal_area(para):
    pass
    
    
if __name__ == '__main__':
    r = 1
    round = cal_round(r)
    area = cal_area(r)

    面向对象的分析思路是:这个问题有一个对象/类(圆),对象/类有一个属性(半径),对象/类有两个方法(求周长、面积),所以构造圆这个类之后使用半径就可以把这个类初始化了。

class circle(object):
    def __init__(self, r):
        self.r = r

    def cal_round(self):
        round = 2 * 3.14 * self.r
        return round

    def cal_area(self):
        area = 3.14 * self.r * self.r
        return area


if __name__ == '__main__':
    r = 2
    cir = circle(r)
    round = cir.cal_round()
    area = cir.cal_area()

猜你喜欢

转载自blog.csdn.net/weixin_40583722/article/details/127622199