这篇博客的主要原因:简历上面写的 熟悉面向对象和函数式编程思想,正好被面试官问到,解释一下函数式思想,才发现自己没有完全理解,于是写下这篇博客。
函数式编程(Functional Programming)
函数式编程是一种编程范式,除了函数式编程之外还有命令式编程,声明式编程等编程范式。
相对于面向对象编程(Object-oriented programming)关注的是数据而言,函数式编程关注的则是动作,其是一种过程抽象的思维,就是对当前的动作去进行抽象。
命令式编程(Imperative Programming)
命令式编程以计算机指令的形式来描述程序的执行过程。在命令式编程中,程序员需要明确地指定程序的每一个步骤,以实现特定的功能。命令式编程通常使用变量、赋值、条件语句、循环语句等基本结构来组织代码,以实现程序的逻辑控制和数据处理。
程序的执行过程就是一系列的指令,这些指令按照一定的顺序执行,从而完成特定的任务。命令式编程的核心思想是通过一系列的命令来改变程序的状态,从而实现特定的功能。
命令式编程的优点是直观、易于理解和实现,适用于一些简单的、功能单一的程序。但是随着程序规模的增大,命令式编程的缺点也逐渐显现出来,如代码复杂度高、可维护性差、可重用性低等。因此,随着计算机科学的发展,面向对象编程和函数式编程逐渐成为了主流的编程范式。
声明式编程(Declarative Programming)
声明式编程(Declarative Programming)是一种编程范式,它以描述问题的形式来描述程序的执行过程,而不是指定如何执行。在声明式编程中,程序员只需要描述问题的本质和所需的结果,而不需要指定如何实现这些结果。声明式编程通常使用函数式编程或逻辑编程的方式来组织代码,以实现程序的逻辑控制和数据处理。
程序的执行过程是由编程语言的运行时系统来自动推导的,程序员不需要关心具体的实现细节。声明式编程的核心思想是将程序看作是一组约束条件的集合,这些约束条件描述了问题的本质和所需的结果。
声明式编程的优点是简洁、易于理解和维护,可以提高程序的可读性和可重用性。但是随着程序规模的增大,声明式编程的缺点也逐渐显现出来,如性能问题、不易调试等。因此,在实际应用中,需要根据具体的问题选择合适的编程范式。
SQL 语句就是最明显的一种声明式编程的例子。
函数式编程(Functional Programming)
而函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。
函数式编程(Functional Programming)是一种编程范式,它将计算机程序视为一系列函数的组合,强调函数的纯粹性和不可变性。在函数式编程中,函数是一等公民,函数可以作为参数传递给其他函数,也可以作为返回值返回给调用者。函数式编程通常使用不可变数据结构、高阶函数、闭包等概念来组织代码,以实现程序的逻辑控制和数据处理。
函数式编程的核心思想是将程序看作是一系列函数的组合,每个函数都是一个独立的模块,它接受输入参数,返回输出结果,不会产生任何副作用。
函数式编程的优点是简洁、易于理解和维护,可以提高程序的可读性和可重用性。由于函数是纯函数,不会产生任何副作用,因此可以有效地避免一些常见的编程错误,如竞态条件、空指针引用等。但是函数式编程也有一些缺点,如性能问题、不易调试等。因此,在实际应用中,需要根据具体的问题选择合适的编程范式。
面向过程(Procedure Oriented 简称 PO)
面向过程编程(Procedural Programming)是一种编程范式,它以过程(Procedure)为中心,将程序分解为一个个小的可重用的模块,每个模块都包含了一系列指令,用于执行某个特定的任务。面向过程编程的核心思想是将程序看作是一系列指令的集合,这些指令按照一定的顺序依次执行,从而完成特定的任务。
在面向过程编程中,数据和函数是分离的,函数只能操作传递给它的数据。因此,面向过程编程更加注重过程和数据的处理,而不是对象之间的交互。面向过程编程通常使用顺序、选择和循环等基本结构来组织代码,以实现程序的逻辑控制和数据处理。
面向过程编程的优点是简单、直观、易于理解和实现,适用于一些简单的、功能单一的程序。但是随着程序规模的增大,面向过程编程的缺点也逐渐显现出来,如代码复杂度高、可维护性差、可重用性低等。因此,随着计算机科学的发展,面向对象编程逐渐成为了主流的编程范式。
面向对象(Object Oriented 简称 OO)
面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它将程序看作是一组对象的集合,每个对象都有自己的状态和行为。在面向对象编程中,程序员将问题看作是一组对象之间的交互,通过定义对象的属性和方法来描述问题的本质和所需的结果。面向对象编程通常使用类、继承、封装、多态等概念来组织代码,以实现程序的逻辑控制和数据处理。
在面向对象编程中,对象是程序的基本单位,每个对象都有自己的状态和行为。状态是对象的属性,行为是对象的方法。对象之间通过消息传递来实现交互,每个对象都可以接收和发送消息。面向对象编程的核心思想是将程序看作是一组对象之间的交互,每个对象都有自己的职责和行为,通过定义对象之间的关系来实现程序的逻辑控制和数据处理。
面向对象编程的优点是模块化、可维护性和可重用性都很好,可以有效地提高程序的可读性和可扩展性。由于对象之间的关系是通过继承、封装和多态等概念来实现的,因此可以有效地避免一些常见的编程错误,如竞态条件、空指针引用等。但是面向对象编程也有一些缺点,如代码复杂度高、性能问题等。因此,在实际应用中,需要根据具体的问题选择合适的编程范式。
函数式编程本质
函数式编程中的函数并不是指计算机中的函数,而是指数学中的函数,即自变量的映射。函数的值取决于函数的参数的值,不依赖于其他状态,比如abs(x)函数计算x的绝对值,只要x不变,无论何时调用、调用次数,最终的值都是一样。
函数式编程的特点
- 函数是第一等公民
- 函数是纯函数
函数是第一等公民
第一等公民是指函数跟其它的数据类型一样处于平等地位,可以赋值给其他变量,可以作为参数传入另一个函数,也可以作为别的函数的返回值。
1 | // 赋值 |
函数是纯函数
纯函数是指相同的输入总会得到相同的输出,并且不会产生副作用的函数。
从纯函数的概念我们可以知道纯函数具有两个特点:
- 同输入同输出
- 无副作用
无副作用指的是函数内部的操作不会对外部产生影响(如修改全局变量的值、修改 dom 节点等)。
1 | // 是纯函数 |
ChatGPT中关于函数式编程的解释
函数式编程是一种编程范式,它主要关注于构建函数和避免共享状态的副作用。在函数式编程中,函数被看做是数学中的函数,它们接受输入并产生输出,而且不会改变程序的状态。
函数式编程的核心思想是函数的纯粹性。一个纯函数在任何时候只会返回相同的输出,无论什么时候运行它,只要提供相同的输入参数,输出总是相同的。这使得函数的行为更加可预测和可控,也更容易进行测试和调试。
在函数式编程中,函数通常被视为一等公民,这意味着它们可以像数据一样被传递和操作。这种方式使得函数可以被组合和重用,这是函数式编程的另一个重要特点。
此外,函数式编程还提供了一些常用的技术,如高阶函数、递归、惰性求值等。这些技术可以使代码更加简洁、清晰、可读性高,也更容易进行并行处理。
总之,函数式编程是一种强调函数和避免状态副作用的编程范式,它可以提供更加简洁、清晰、可读性高的代码,同时也有助于提高程序的可测试性和可维护性。
ChatGPT中关于函数式编程和面向对象编程不同之处的解释
函数式编程和面向对象编程是两种不同的编程范式,它们的主要区别在于它们的思想和实践方法。以下是它们的主要区别:
- 编程思想: 面向对象编程强调的是对象和类的概念,将问题分解成一个个对象,通过对象之间的交互来解决问题。而函数式编程强调的是函数的概念,将问题分解成一个个函数,通过函数之间的组合来解决问题。
- 可变性: 面向对象编程中,对象的状态可以被修改,而函数式编程中,函数是没有状态的,它们只接受输入并产生输出,因此不会对程序的状态造成影响。这也是函数式编程中避免副作用的一个重要原因。
- 副作用: 在函数式编程中,副作用(比如修改全局变量、I/O 操作等)是被禁止的,因为它们会对程序的状态造成影响,导致程序的行为不可预测。而在面向对象编程中,副作用是允许的,因为对象的状态可以被修改。
- 数据结构: 在函数式编程中,数据结构是不可变的,因为函数不会修改它们的值。而在面向对象编程中,数据结构是可变的,因为对象的状态可以被修改。
- 代码复用: 在面向对象编程中,代码复用通常通过继承和多态来实现。而在函数式编程中,代码复用通常通过函数的组合和高阶函数来实现。
ChatGPT关于命令式编程和面向过程编程不同之处的解释
命令式编程和面向过程是两个相关但不完全相同的编程范式。
命令式编程是一种编程范式,其中程序被视为一系列指令或命令,这些指令告诉计算机执行哪些操作以达到期望的结果。命令式编程通常使用变量、循环和条件语句等基本结构来实现控制流程和数据流。
面向过程编程是一种程序设计范式,其中程序被视为一系列函数或过程的集合,这些函数或过程按照特定的顺序执行以完成特定的任务。面向过程编程通常使用函数、变量和结构体等基本结构来实现控制流程和数据流。
因此,命令式编程和面向过程编程都是关注程序的控制流程和数据流,并使用类似的基本结构来实现这些流程和数据。但是,命令式编程更加强调程序的指令和命令,而面向过程编程更加强调程序的函数和过程。
参考文章:
详解Java中的三种函数式编程,以及具体的实现方法 | w3c笔记 (w3cschool.cn)
面向对象和函数式编程的本质区别 - 知乎 (zhihu.com)
面试官:面向对象和函数式编程你有了解吗? - 掘金 (juejin.cn)
面向过程编程(pop),面向对象编程(oop),函数式编程(fp)_oop和fp是什么_大海和天空的博客-CSDN博客