面向过程编程 (Procedural Programming)

核心思想

“怎么做” – 像写菜谱一样一步步告诉计算机怎么做

把问题分解成一系列步骤(函数),然后依次执行这些步骤来解决问题。

基本特征

  • 以函数为中心:程序由多个函数构成
  • 顺序执行:从上到下按顺序执行代码
  • 数据与操作分离:数据是独立的,函数处理数据
  • 线性思维:像流水线一样一步步处理问题

代码示例:计算员工工资

def calculate_salary(hours, rate):
    if hours > 40:
        overtime = hours – 40
        regular_pay = 40 * rate
        overtime_pay = overtime * rate * 1.5
        return regular_pay + overtime_pay
    else:
        return hours * rate

# 主程序
employee_hours = 45
employee_rate = 20
salary = calculate_salary(employee_hours, employee_rate)
print(f“工资是: ${salary}”)

大白话解释

想象你做饭:

  1. 洗菜(函数)
  2. 切菜(函数)
  3. 炒菜(函数)
  4. 装盘(函数)

整个过程是一步一步的指令,每个步骤处理食材(数据)。如果要做不同的菜,就得写新的步骤组合。

面向对象编程 (Object-Oriented Programming)

核心思想

“谁做什么” – 像管理团队一样让各个对象协作完成任务

把问题分解成多个对象,每个对象有自己的数据和操作数据的方法。

基本特征

  • 以对象为中心:程序由多个对象组成
  • 封装:数据和方法打包在一起
  • 继承:子类可以继承父类的特性
  • 多态:不同对象对同一消息做出不同响应
  • 抽象:只暴露必要信息,隐藏实现细节

代码示例:计算员工工资

class Employee:
    def __init__(self, name, rate):
        self.name = name
        self.rate = rate

    def calculate_salary(self, hours):
        if hours > 40:
            overtime = hours – 40
            regular_pay = 40 * self.rate
            overtime_pay = overtime * self.rate * 1.5
            return regular_pay + overtime_pay
        else:
            return hours * self.rate

# 主程序
employee = Employee(“张三”, 20)
salary = employee.calculate_salary(45)
print(f“{employee.name}的工资是: ${salary}”)

大白话解释

想象一个餐厅:

  • 厨师(对象)知道如何做菜(方法)
  • 服务员(对象)知道如何点单(方法)
  • 收银员(对象)知道如何结账(方法)

每个员工有自己的职责,你只需要告诉他们干什么(发送消息),他们知道怎么完成自己的工作。要扩展时,可以增加新员工(新类),或者培训现有员工新技能(继承)。

本质区别对比

比较维度 面向过程 (Procedural) 面向对象 (Object-Oriented)
核心关注点 关注如何执行(步骤和逻辑) 关注谁在执行(对象和交互)
程序组织方式 函数和顺序执行的指令 相互协作的对象
数据与操作的关系 数据与操作分离(函数处理数据) 数据与操作绑定(对象包含数据和操作数据的方法)
代码复用方式 通过函数调用复用代码 通过继承、组合复用代码
修改和扩展 修改数据可能影响多个函数 修改一个类通常不影响其他类
适合解决的问题 线性任务、简单计算、脚本 复杂系统、GUI应用、游戏开发
典型语言 C, BASIC, Pascal Java, C++, Python, C#
思考方式 自顶向下分解问题 自底向上构建组件
状态管理 状态通常保存在全局或局部变量中 状态封装在对象内部

什么时候用哪种?

面向过程适用场景:

  • 简单任务或一次性脚本(如数据处理脚本)
  • 性能要求极高的场合(如操作系统内核)
  • 不需要频繁修改的程序

面向对象适用场景:

  • 大型复杂系统(如企业软件、游戏引擎)
  • 需要频繁扩展和维护的项目
  • 涉及多个实体交互的系统(如GUI应用)
  • 需要代码高度复用的项目

终极比喻:造房子

面向过程:像一份详细的建房手册,包含所有步骤:

  1. 打地基
  2. 砌墙
  3. 安装门窗
  4. 铺屋顶

面向对象:像一个建筑团队,有不同工种的工人:

  • 瓦工(对象)知道如何砌墙
  • 木工(对象)知道如何做门窗
  • 电工(对象)知道如何布线
  • 你只需要告诉他们要做什么