由于Oracle公司在Java SE 8中引入了一些函数构造,现在大多数采访者都有兴趣问一些关于函数编程的问题。作为一名Java/Groovy/Scala开发人员或任何函数式编程开发人员,我们应该学习以下问题和答案以清楚地进行访谈:
1.什么是函数式编程?
2.函数式编程的利弊
是什么?
3.函数式编程和命令式编程有什么不同?
4.函数式编程和面向对象编程有什么不同?
5.函数式编程、命令式编程(IP)和面向对象编程有什么不同?
6.与命令式编程或面向对象编程相比,函数式编程的主要优势是什么?
7.何时使用函数式编程?
8.什么时候使用面向对象编程?
9.OOP的缺点是什么?
10.面向对象继承的缺点是什么?
..。还有更多
在这篇文章中,我们将逐一讨论以下三种流行的编程范式,并回答上述问题:
1.函数式编程(FP) 2.命令式编程(IP) 3.面向对象编程(OOP)
什么是函数式编程?
简单地说,函数式编程(FP) 是一种流行的编程范型,它像** 数学函数** 一样进行计算,而不需要** 改变状态** 和** 突变数据** 。在函数式编程中,函数是第一类候选函数。我们通过定义一组函数和不可变的数据来编写程序。** FP语言示例:-** Scala、Haskell、Earlang等是流行的FP语言。Java SE 8也有一些函数构造(有关更多详细信息,请参考Java 8文章)
FP有哪些特点?
像Scala这样的函数式编程语言具有以下特征
1.状态不存在。
FP程序不包含状态。这意味着所有数据都是不变的数据,函数不能更改状态。执行顺序重要性不高 在FP语言中,我们编写具有一组独立函数的程序。函数包含一组语句。在FP中,这些函数的执行顺序并不重要,因为它们没有状态,所有函数都独立工作。即使我们改变执行的顺序,它们产生的结果也是一样的。无状态编程模型 所有FP程序都使用不变的数据和函数,不能修改这些数据。这意味着FP语言支持无状态编程模型。函数是一等公民 在FP语言中,函数是第一类对象。函数是独立的单元,我们可以按任何顺序执行它们。主要操作单元 在FP语言中,主要的操作单元是函数和数据结构,因为所有程序都是由使用这些单元组成的。模块化编程 在FP语言中,我们需要编写更小的独立单元,称为纯函数来支持无状态编程模型。这意味着FP比OOP.7支持更好的模块化。高阶函数与惰性求值 函数式编程语言应该支持高阶函数和延迟求值特性。主流量控制 FP语言不使用For...Loop、Do...While Loop、While...Loop等流控制,也不使用If..Else或Switch语句等条件语句。所有FP语言都使用以下内容编写程序:
- 功能
- 函数调用
- 使用递归进行函数调用
10.抽象、捕获、继承、多态
与OOP一样,FP语言支持所有4个概念:抽象、捕获、继承和多态。FP语言支持带有类型类或隐含的继承。它们在泛型的帮助下支持多态。它也称为参数多态。
FP的重点是什么?
与OOP语言不同的是,所有的FP语言程序都主要关注你在做什么
或要做什么
。它们主要集中在以下几个方面:
- 需要什么信息就是输入。
- 需要什么转换才是实际的逻辑。
这意味着FP主要关注**要做什么
** 。它没有太多地关注** 如何做
** 。也就是说,我们可以编写函数式编程,就像问题域描述一样。这就是为什么,不仅是开发人员,其他人也可以很容易地理解FP代码。现在我们将讨论函数式编程的利弊
。
函数式编程的优势?
函数式编程语言有以下优点或优点:
- 无错误代码
由于FP语言不支持状态,它们不会产生任何副作用,这意味着我们可以编写无错误代码、无错误代码或较不容易出错的代码。-高效并行编程
由于FP语言没有可变状态,因此它们不会引发任何状态更改问题。这意味着它们只使用不可变的数据。他们使用独立单元来编写程序,即函数
。我们可以编写非常高效的并行或并发编程,因为它们独立运行而不改变状态。-更好的性能
由于FP程序由所有独立单元组成,因此它们可以并行或并发运行。正因为如此,FP应用程序获得了更好的性能。-更好的捕获
与OOP不同,FP支持使用纯函数进行更好的Encaspation。纯函数表示没有副作用。-支持嵌套函数
嵌套函数是指将函数与其他函数组合在一起来解决问题。FP支持嵌套函数-提高可重用性
由于FP程序由独立的单元组成,即函数
,我们可以非常容易地重用它们。-更好的模块化
在FP语言中,我们需要编写更小的独立单元,称为纯函数来支持无状态编程模型。这意味着FP比OOP支持更好的模块化。-轻松懒惰评估
在FP语言中,编写惰性求值非常容易。它们支持Lazy功能构造,如Lazy List、Lazy Maps等-增强可读性和可维护性
函数式编程(FP)也提高了可读性和可维护性,因为它们独立工作,并且不会改变状态。-增加可测试性
当我们使用独立单元(即)编写FP程序时,我们可以非常容易地对它们进行单元测试。-支持行为之上的抽象
与OOP不同,FP既支持数据抽象
,也支持行为抽象
。因为现实世界中两者都包含。-支持BigData
由于FP支持并行编程和更好的性能,所以FP非常适合开发BigData应用。-健壮可靠的代码
因为FP使用不可变的数据,所以我们可以使用FP轻松开发健壮可靠的代码。
函数式编程的缺点?
除了很大的好处之外,函数式编程语言也有很少或很小或可以忽略的缺点。他们只有以下缺点:
- 需要大量内存
FP没有状态。他们总是创建新对象来执行操作,而不是修改现有对象。正因为如此,FP应用程序占用大量内存。-不专注于利斯科夫替换
函数式编程的主要概念是什么?
以下概念是函数式编程的主要和重要概念。
- 一流的功能。
- 懒惰的评估。
- 高阶函数。
- 不可变性(不可变数据)。
- 模块化。
- 无副作用。
- 懒惰的评估。
- 递归函数调用。
什么是命令式编程?
命令式编程(IP)是一种流行的编程范例,它以某种顺序执行一系列步骤/指令/语句。IP语言示例:- Java、C、C++等
命令式编程的主要特点?
任何命令式编程(IP)语言都可以包含以下特征:
- 陈述的顺序。
- 语句的执行顺序非常重要。
- 它们包含国家。
- 他们既使用不可变数据,也使用可变数据。
- 他们可以改变状态。
- 它们可能会有副作用。
- 有状态编程模型。
- 它们直接更改计划的状态。
- 它们用数据字段表示州。
什么是面向对象编程?
面向对象编程是另一种编程范式。它将一切都表示为一个对象。每个对象都包含一些数据字段和方法。所有OOP程序都包含状态。它们使用可变数据和数据结构。像FP一样,我们可以通过使用不可变数据来编写完整的编程,但它不强制执行这一规则。面向对象编程(OOP)是命令式编程的超集。它遵循IP的所有特征,但有一些额外的功能。这些额外的功能包括:
- 一切都是客体。
- 每个对象都包含一些数据字段和方法。
- OOPS概念:抽象、捕获、继承和多态
与函数式编程语言不同,OOP语言主要关注**怎么做
** 。这意味着作为一名开发人员,我们关注的是你做得怎么样
。此外,OOP将** 您正在做什么
** 和** 您正在做什么
** 结合在一起。这就是为什么我们不能编写简洁和更具可读性的代码的原因。只有开发人员才能理解代码,其他人更容易混淆理解应用程序代码,他们不能理解它。
面向对象编程的弊端?
尽管OOP解决了许多实时问题,但仍然存在以下缺点(与FP相比):
- 它不支持完全可重用性。
- 它不是完全模块化的。
- 它打破了诱人的概念。
- 继承有很多缺点。
继承的主要缺点:
- 违反封装原则
- 当继承级别增加时,维护和创建对象非常困难和困难。
什么时候使用函数式编程?
在以下场景中,我们应该使用函数式编程(FP):
- 当我们要对已修复的数据执行许多不同的操作时。
- 换句话说,当我们有更多的操作的时候。
什么时候使用面向对象编程?
在以下场景中,我们应该使用面向对象编程(OOP):
- 当我们将在许多具有共同行为的不同变体上执行少量操作时。
- 换句话说,当我们的东西多而操作少的时候。
注意:- 这里的对象是真实世界的对象,操作是真实世界的动作。例如,在Java中,我们将这些真实世界的事物表示为)。
FP和OOP(IP)的区别?
函数式编程|OOP
-|
不存在状态|存在状态
使用不变数据|使用可变数据
遵循声明式编程模型|遵循命令式编程模型
无状态编程模型|有状态编程模型
Main Fcous on:你在做什么
|主要关注你在做什么
适合并行(并发)编程|不适合并行(并发)编程
适合BigData处理分析|不适合BigData处理分析
支持纯Encaspation|打破了Encaspation的概念
无副作用函数|有副作用的方法
函数是一等公民|对象是一等公民
主操作单元为函数|主操作单元为对象(类的实例)
流控:函数调用,带递归的函数调用|流控:循环,条件语句
|使用递归的概念迭代Collection数据。|使用循环的概念迭代Collection数据。例如:Java中的-For-Each循环
|执行顺序不太重要。执行顺序是必须的,也是非常重要的。|
|既支持数据抽象,也支持行为抽象。|仅支持数据抽象化。|
|当事物少而运算多时,我们使用FP。|当操作较少而操作较多时,我们使用OOP。例如:在Java中,对象是类,操作是方法。|
这就是关于三种流行的编程范例的全部内容。注:- 我基本上来自OOP,但一年前才开始从事FP的工作。因此,如果函数式编程专家在这篇文章中发现任何错误,请给我提供您的宝贵意见。如果你喜欢我的帖子,或者有任何疑问或建议,请给我留言。