大厂面试必问:FP/OOP 编程范式

函数式编程(Functional Programming, FP)是一种编程范式——一种构建计算机程序结构和元素的方式,它将计算视为数学函数的评估,并避免改变状态和可变数据。

面向对象编程(Object-oriented Programming, OOP)是一种基于“对象”概念的编程范式,它可以包含字段(通常称为属性或属性)形式的数据,以及过程(通常称为方法)形式的代码。

FP 与 OOP 的区别

计算机著名定论:

程序 = 数据结构 + 算法

无论什么编程范式,都必须处理数据结构和算法。让我们换种说法,把算法视作是某种逻辑行为,即‘程序 = 数据 + 行为’。

OOP 会把数据和相关行为放到某个对象中处理,所谓的对象就是数据与行为的集合,是对现实某个实体的抽象,比起数据,对象更关心实体有哪些行为,像一些支持 OOP 的语言,比如 java,对象一般就是某个类的实例,实例中的数据一般不会暴露给外部代码,外部代码能接触到的只有实例提供的方法。

比起 OOP,FP 则把数据和行为完全分开处理,比起行为,FP 更加关注数据结构是什么样的,怎么样由 A 数据衍生计算出 B 数据。FP 更适合数据结构稳定清晰的场景,数据驱动开发模式就是基于 FP 范式的。FP 带来的很大好处是数据不可变,由于数据不可变,开发者不用关心什么某个数据在什么时候什么条件下会改变。

举个例子来说明两者的区别:作为一名老板,你需要给每个雇员加薪。

OOP 模式:

  1. 构建一个雇员 Employee 类,初始化需要雇员的姓名 name 和工资 salary 信息。
  2. 给每个雇员实例化一个 Employee 实例。
  3. 通过 Employee 的 addSalary 方法给每个员工涨薪。
// 雇员类
class Employee {
    constructor(name, salary){
        this.name = name
        this.salary = salary
    }
    
    // 增加工资
    addSalary(pay) {
        this.salary += pay
    }
}

// 初始化所有员工
const employees = [
    new Employee('jack', 1000),
    new Employee('john', 2000)
]

// 给每个员工涨薪 1000
employees.forEach(employee => {
    employee.addSalary(1000)
})
复制代码

FP 模式:

  1. 新建一个包含雇员姓名 name 和工资 salary 的对象数组。
  2. 定义一个给所有员工涨薪的函数 addSalary
  3. 生成一个涨薪后的雇员信息数组。
// 雇员信息数组
const employees = [
    {name: 'jack', salary: 1000},
    {name: 'john', salary: 2000}
]

// 涨薪函数
function addSalary(employees, salary) {
    return employees.map(employee => ({...employee, salary: employee.salary + salary}))
}

// 生成涨薪后数组
const newEmployees = addSalary(employees, 1000)
复制代码

对于这个例子来说,我们是围绕雇员这个概念来进行建模的,我们更关心的是雇员的涨薪动作(后续可能还有请假等动作)而不是雇员涨薪后的数据,因此从这个角度说,OOP 模式更适合这个场景。这个结论不是绝对的,还得看开发人员对两个范式的理解和掌握。

参考资料

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菠萝-琪琪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值