面向对象概述

241 阅读5分钟

前言

  • 学习之路需深耕细作,切勿轻视任一知识点,因其存在必蕴含深意

想要细致的了解面向对象的思想,首先要知道什么是对象?面向对象是什么?带着这两个问题读这篇文章可能会令你更清晰理解面向对象的核心理念。在此之前,先尝试理解面向过程的编程思想,将两者进行对比理解

面向过程

面向过程(Procedure-Oriented Programming,简称POP),它侧重于按照功能或步骤来组织代码。在面向过程编程中,程序被分解为一系列的步骤,每个步骤负责完成特定的任务。按照步骤流程执行以完成整个程序的功能。

假设你要制作手工面条,面向过程的步骤可能如下:

  • 准备材料:面粉、水、盐等。
  • 将面粉、水和盐混合在一起,揉成面团。
  • 让面团静置一段时间,醒面。
  • 将醒好的面团擀成薄片。
  • 将擀好的面片切成细条。
  • 将切好的面条放入沸水中煮熟。
  • 捞出面条,加入调料,如酱油、醋等。

在这个过程中,你需要按照步骤一步一步来做,每个步骤都有明确的目标和任务。这就是面向过程,它更关注解决问题的步骤和流程

面对对象

  • 对象是数据(属性)和作用于数据的操作(方法)的封装体,简单来说就是对象具有属性和方法,属性用于存储数据,方法用于执行操作。

  • 面向对象是一种将数据和对这些数据的操作封装在一起的编程范式。它把同类对象抽象出其共性,形成类,类中的大多数数据只能被本类的方法处理。对象与对象之间通过消息进行通信。程序流程由用户在使用中决定,更加灵活。

面向对象的思维则会将制作手工面条的过程看作一系列对象的交互:

  • 定义面条类:这个类包含面条的属性(如面条的粗细、口感等)和方法(如制作面条的步骤)。

    • 属性:粗细、口感
    • 方法:准备材料、和面、醒面、擀面、切条
  • 定义调料类:这个类包含调料的属性和方法(如添加调料到面条中)。

    • 属性:种类、量
    • 方法:添加到面条中
  • 创建面条对象:使用面条类创建一个面条对象,并调用其方法来制作面条。

  • 创建调料对象:使用调料类创建多个调料对象,并根据个人口味设置其属性。

  • 组合和交互:将制作好的面条和调料组合在一起,形成一碗完整的手工面条。

在这个过程中,数据和操作被封装在对象中,对象之间通过消息传递进行交互。如果需要改变制作流程或添加新功能(如加入新的调料),只需要修改相关的类或对象,而不需要修改整个流程。

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81ODg5OTM1LWRkZmI1Y2RkM2ExYmU5ODkuanBn.png

面向对象优点

模块化: OOP通过将数据和操作数据的函数封装在一起,形成对象,实现了高度的模块化。这使得代码更易于管理和维护。

代码重用: 通过继承和组合机制,OOP允许开发者创建新的类时复用现有的类,从而减少重复代码,提高开发效率。

可维护性: 由于代码模块化,并且对象之间的依赖关系通过接口和抽象类进行定义,这使得代码更加清晰和易于理解。当需要修改或扩展功能时,影响范围较小。

扩展性: OOP支持开放-封闭原则,即软件实体(类、模块、函数等)应该是可扩展的,但不可修改的。通过继承和多态,可以在不修改现有代码的情况下添加新功能。

灵活性: OOP支持多态性,即允许使用父类类型的引用来操作子类对象。这使得程序更加灵活,能够根据不同的对象类型执行不同的行为。

两者比较

特性/编程范式面向对象(OOP)面向过程(POP)
核心思想以对象为核心,强调对问题领域的抽象和建模以过程为中心,注重解决问题的步骤和流程
基本单位类和对象过程或函数
封装性支持封装,隐藏内部实现细节,仅暴露必要的接口无封装概念,所有数据和方法都是公开的
复用性通过继承和多态提供高复用性复用性较差,通常需要手动复制和粘贴代码
灵活性设计灵活,可以根据需求进行扩展和修改设计较为僵硬,需求变化时可能需要大量修改代码
维护性易于维护,因为代码模块化,依赖关系清晰维护困难,因为代码线性,全局变量共享导致耦合度高
扩展性支持扩展,可以在不修改现有代码的情况下添加新功能扩展性差,因为修改一个过程可能影响其他部分