每个人都说由于不变性,函数式编程可能比OOP更好。好的但是FP如何比OOP更好地隐藏或组织数据? 如果我知道OOP被引入来解决这个问题,因为程序范式不能很好地做到这一点。什么有FP这个?
如果你以一种好的方式使用OOP并且你不会写出贫血的风格类和可变对象,那么FP对于日常编程任务来说仍然是比OOP更好的选择吗?
答案 0 :(得分:1)
<强> TL; DR 强>
函数式编程与封装无关,但大多数现代函数式语言都支持封装。
封装(你称之为&#34;数据隐藏&#34;)是现代编程的重要组成部分,无论范式如何。在开发库时,有一部分代码要隐藏在库的用户之外。
OOP语言允许您定义私有事物:属性,方法,类和诸如此类的东西。私密的东西无法从外部范围访问,而且是关于它的。
# Ruby
class A
def a
# This is public
end
private
def b
# This is private
end
end
Modular languages使用模块代替类,但它们几乎相同。您可以将模块接口与实现分开定义。
(* OCaml *)
module A : sig
(* Here is the interface *)
val a : int -> int
end = struct
(* Here is the implementation *)
let a = (* This is public *)
let b = (* This is private *)
end
正如您所看到的,模块化语言在封装内容方面与OOP语言一样好。
简而言之,功能语言意味着一种不使用变异的语言。当然,更真实的定义会更加复杂。
让我们看一个例子:
# Python
def sum(l):
sum = 0
for e in l:
sum += e # Mutations occur here
return sum
以功能方式,即没有任何突变:
(* OCaml *)
let rec sum l =
match l with
| [] -> 0
| h::t -> h + sum t
功能性风格优于强制性风格的好处值得讨论,但我现在暂时将其排除在外。
实际上,语言不必在模块化,OOP或功能之间进行选择。正如您从上面所看到的,这三个概念彼此真正不同,语言只是倾向于组合这些特征。
例如,OCaml 主要是功能和模块化,但它也支持OOP和命令式风格,这样你就可以获得最好的世界,只要你知道你是什么这样做。 (它是一个&#34;强大的力量带来了巨大的责任感&#34; 等等。)因此,回答你的问题,函数式编程本身与封装数据无关,但是函数式语言提供了诸如类或模块之类的功能来为它们做这些。