比较函数式编程、命令式编程和面向对象编程

由于Oracle Corporation在Java SE 8中引入了一些功能性构造,如今大多数面试官都对功能性编程提出了一些问题。作为Java/Groovy/Scala开发人员或任何功能性编程开发人员,我们应该学习以下问题和答案以通过面试:

  1. 什么是函数式编程?
  2. 函数式编程的“优缺点”是什么?
  3. 函数式编程与命令式编程之间有什么区别?
  4. 函数式编程与面向对象编程之间有什么区别?
  5. 函数式编程、命令式编程(IP)和面向对象编程之间有什么区别?
  6. 函数式编程相较于命令式编程或面向对象编程的主要优势是什么?
  7. 何时使用函数式编程?
  8. 何时使用面向对象编程?
  9. 面向对象编程有什么缺点?
  10. 面向对象编程-继承有什么缺点?
    ……等等

在本文中,我们将依次讨论以下三种流行的编程范式,并回答上述问题:

  1. 函数式编程(FP)
  2. 命令式编程(IP)
  3. 面向对象编程(OOP)

什么是函数式编程?

简单来说,函数式编程(FP)是流行的编程范式之一,类似于使用数学函数进行计算,而不涉及状态改变数据变异。在函数式编程中,函数是第一类候选对象。我们通过定义一组函数和不可变数据来编写程序。FP语言的例子:Scala、Haskell、Erlang等是流行的函数式编程语言。Java SE 8也具有一些函数式构造(请参考Java 8的文章以获取更多详细信息)

函数式编程的特点是什么?

像Scala这样的函数式编程语言具有以下特点。

  1. 1. 状态不存在。
    FP(函数式编程)程序不包含状态。这意味着所有数据都是不可变的数据,函数不能改变状态。
    2. 执行顺序的低重要性
    在FP语言中,我们用一组独立的函数编写程序。函数包含一组语句。在FP中,这些函数的执行顺序并不重要,因为它们没有状态,所有函数都是独立工作的。即使我们改变执行顺序,它们仍然产生相同的结果。
    3. 无状态编程模型
    所有FP程序使用不可变数据和函数,这些函数不能修改数据。这意味着FP语言支持无状态编程模型。
    4. 函数是一等公民
    在FP语言中,函数是一等对象。函数是独立的单位,我们可以以任何顺序执行它们。
    5. 主要操作单元
    在FP语言中,主要的操作单元是函数和数据结构,因为所有程序都是使用这些单元构建的。
    6. 模块化编程
    在FP语言中,我们需要编写更小、独立的单元,称为纯函数,以支持无状态编程模型。这意味着FP支持比面向对象编程更好的模块化。
    7. 高阶函数和惰性评估
    函数式编程语言应该支持高阶函数和惰性评估特性。
    8. 主要流程控制
    FP语言不使用像For…Loop、Do…While Loop、While…Loop等流程控制,也不使用条件语句像If…Else或Switch语句。所有FP语言都是使用以下内容编写程序:
  • 函数
  • 函数调用
  • 使用递归的函数调用
  1. 抽象、封装、继承和多态
    像面向对象编程一样,函数式编程语言支持所有四个概念:抽象、封装、继承和多态。函数式编程语言使用类型类或隐式来支持继承。它们利用泛型来支持多态。这也被称为参数多态。

函数式编程的主要关注点是什么?

与面向对象编程语言不同,所有函数式编程语言程序主要关注“你在做什么”或“应该做什么”。它们主要关注以下几个方面:

  • 所需的信息是什么,即输入。
  • 需要进行的转换是什么,即实际逻辑。

这意味着函数式编程主要关注“应该做什么”。它不太关注“怎么做”。这样,我们可以将函数式编程写成问题域描述。这就是为什么不仅开发人员,而且其他人也可以非常容易地理解函数式编程代码的原因。现在我们将讨论函数式编程的“优点和缺点”。

函数式编程的优势?

函数式编程语言具有以下优势或好处:

  • 无错误代码
    FP语言不支持状态,因此它们不会产生任何副作用,这意味着我们可以编写无错误的代码或无错误的代码或较少出错的代码。- 高效并行编程
    由于FP语言没有可变状态,它们不会引发任何状态更改问题。这意味着它们仅使用不可变数据。它们使用独立的单元编写程序,即“函数”。我们可以编写非常高效的并行或并发编程,因为它们在不改变状态的情况下独立运行。- 更好的性能
    由于FP程序由所有独立单元组成,它们可以并行或同时运行。因此,FP应用程序获得了更好的性能。- 更好的封装
    与面向对象编程不同,FP支持使用纯函数进行更好的封装。纯函数意味着没有副作用。- 支持嵌套函数
    嵌套函数意味着在其他函数内部组合函数以解决问题。FP支持嵌套函数。- 增加可重用性
    由于FP程序由“函数”组成的独立单元构成,我们可以非常轻松地重用它们。- 更好的模块化
    在FP语言中,我们需要编写更小、更独立的单元,称为纯函数,以支持无状态编程模型。这意味着FP比OOP支持更好的模块化。- 简单的惰性评估
    在FP语言中,编写惰性评估非常容易。它们支持惰性函数构造,如惰性列表、惰性映射等。- 增加可读性和可维护性
    函数式编程(FP)也提高了可读性和可维护性,因为它们独立工作,不会改变状态。- 增加可测试性
    由于我们使用“函数”编写FP程序的独立单元,我们可以非常容易地对它们进行单元测试。- 支持行为抽象
    与面向对象编程不同,FP支持“数据的抽象”和“行为的抽象”。因为现实世界包含了两者。- 支持大数据
    由于FP支持并行编程和更好的性能,FP非常适合开发大数据应用程序。- 健壮可靠的代码
    由于FP使用不可变数据,我们可以很容易地使用FP开发健壮可靠的代码。

函数式编程的缺点?

除了巨大的优势之外,函数式编程语言还有一些非常少或可以忽略的缺点。它们仅有以下缺点:

  • 需要大量内存
    函数式编程没有状态。它们总是创建新对象执行操作,而不是修改现有对象。因此,函数式编程应用程序占用大量内存。- 不关注 Liskov 替换原则

函数式编程的主要概念是什么?

以下是函数式编程的主要重要概念。

  • 头等函数。
  • 惰性评估。
  • 高阶函数。
  • 不可变性(非可变数据)。
  • 模块化。
  • 无副作用。
  • 惰性评估。
  • 递归函数调用。

什么是命令式编程?

命令式编程(IP)是流行的编程范式之一,它按照一定的顺序执行一系列步骤/指令/语句。命令式编程语言的例子:Java、C、C++ 等。

命令式编程的主要特点是什么?

任何命令式编程语言都可能具有以下特点:

  • 语句的序列。
  • 语句的执行顺序非常重要。
  • 它们包含状态。
  • 它们使用不可变和可变数据。
  • 它们可以改变状态。
  • 它们可能具有副作用。
  • 有状态的编程模型。
  • 它们直接改变程序的状态。
  • 它们用数据字段表示状态。

什么是面向对象编程?

面向对象编程是另一种编程范 paradigm 的形式。它将所有内容都表示为对象。每个对象包含一些数据字段和方法。所有面向对象编程程序都包含状态。它们使用可变数据和数据结构。与 FP 一样,我们可以通过使用不可变数据编写完整的程序,但它不强制执行此规则。面向对象编程(OOP)是命令式编程的超集。它遵循所有 IP 特征并具有一些额外的特性。这些额外的特性包括:

  • 一切都是对象。
  • 每个对象包含一些数据字段和方法。
  • OOP 概念:抽象、封装、继承和多态

与函数式编程语言不同,面向对象编程语言主要关注于“它如何完成”。这意味着作为开发者,我们关注“你是如何做的”。此外,OOP 结合了“你正在做什么”“你是如何做的”。这就是为什么我们无法编写简洁且更易读的代码。只有开发者能够理解代码,其他人可能会对理解应用代码感到困惑,他们无法理解它。

面向对象编程(OOP)的缺点?

尽管面向对象编程解决了许多实时问题,但仍然有以下缺点(与 FP 相比):

  • 它不支持完全的可重用性。
  • 这不是完全的模块化。
  • 它破坏了封装概念。
  • 继承有很多缺点。

继承的主要缺点:

  • 破坏了封装原则。
  • 当继承层级增加时,维护和创建对象非常困难。

何时使用函数式编程?

我们应该在以下情况下使用函数式编程(FP):

  • 当我们将对具有固定数据的许多不同操作进行操作时。
  • 换句话说,当我们有少量事物但有更多操作时。

何时使用面向对象编程?

我们应该在以下情况下使用面向对象编程(OOP):

  • 当我们将在许多具有共同行为的不同变体上执行少量操作时。
  • 换句话说,当我们有更多的事物时,却进行了较少的操作。

注意: 这里的”事物”是指现实世界中的对象,”操作”是指现实世界中的动作。例如,在Java中,我们将这些现实世界的事物表示为”类”,将现实世界的动作表示为方法(操作)。

函数式编程(FP)和面向对象编程(OOP)之间的区别?

Functional Programming OOP
Does not exist State Exists State
Uses Immutable data Uses Mutable data
It follows Declarative Programming Model It follows Imperative Programming Model
Stateless Programming Model Stateful Programming Model
Main Fcous on: “What you are doing” Main focus on “How you are doing”
Good for Parallel (Concurrency) Programming Poor for Parallel (Concurrency) Programming
Good for BigData processing and analysis NOT Good for BigData processing and analysis
Supports pure Encaspulation It breaks Encaspulation concept
Functions with No-Side Effects Methods with Side Effects
Functions are first-class citizens Objects are first-class citizens
Primary Manipulation Unit is “Function” Primary Manipulation Unit is Objects(Instances of Classes)
Flow Controls: Function calls, Function Calls with Recursion Flow Controls: Loops, Conditional Statements
It uses “Recursion” concept to iterate Collection Data. It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java
Order of execution is less importance. Order of execution is must and very important.
Supports both “Abstraction over Data” and “Abstraction over Behavior”. Supports only “Abstraction over Data”.
We use FP when we have few Things with more operations. We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java.

这就是三种流行的编程范式的全部内容。注意: 我基本上是从面向对象编程(OOP)出发的,但是一年前开始研究函数式编程(FP)。因此,如果函数式编程专家在这篇文章中发现任何错误,请给我提供宝贵的意见。如果您喜欢我的文章或有任何疑问或建议,请给我留言。

Source:
https://www.digitalocean.com/community/tutorials/functional-imperative-object-oriented-programming-comparison