Oop 函数式编程、面向对象编程和数据隐藏
每个人都说函数式编程可能比面向对象编程更好,因为它具有不变性。好的,但是FP如何比OOP更好地隐藏或组织数据呢? 如果我很清楚的话,OOP是用来解决这个问题的,因为过程范式在这方面做得不够好。FP为此做了什么 如果您以良好的方式使用OOP,并且不编写贫乏风格的类和可变对象,那么FP仍然是比OOP更好的日常编程任务选择吗 TL;DR 函数式编程与封装无关,但大多数现代函数式语言都支持封装 封装(您称之为“数据隐藏”)是现代编程的一个重要组成部分,无论采用何种模式。在开发库时,您希望对库用户隐藏部分代码 面向对象方面 OOP语言允许您定义私有内容:属性、方法、类等等。私有的东西不能从外部作用域访问,仅此而已Oop 函数式编程、面向对象编程和数据隐藏,oop,functional-programming,Oop,Functional Programming,每个人都说函数式编程可能比面向对象编程更好,因为它具有不变性。好的,但是FP如何比OOP更好地隐藏或组织数据呢? 如果我很清楚的话,OOP是用来解决这个问题的,因为过程范式在这方面做得不够好。FP为此做了什么 如果您以良好的方式使用OOP,并且不编写贫乏风格的类和可变对象,那么FP仍然是比OOP更好的日常编程任务选择吗 TL;DR 函数式编程与封装无关,但大多数现代函数式语言都支持封装 封装(您称之为“数据隐藏”)是现代编程的一个重要组成部分,无论采用何种模式。在开发库时,您希望对库用户隐藏部分
# Ruby
class A
def a
# This is public
end
private
def b
# This is private
end
end
模块化方面
使用模块代替类,但它们基本相同。您可以将模块接口与实现分开定义
(* 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
功能性风格比命令式风格的好处有待讨论,但我暂时不讨论
把它们放在一起
事实上,语言不必在模块化、面向对象或函数式之间进行选择。从上面可以看出,这三个概念确实是不同的,而语言只是倾向于结合这些特性
例如,OCaml主要是功能性和模块化的,但它也支持OOP和命令式风格,因此只要您知道自己在做什么,就可以充分利用所有方面。(这是一种“权力越大,责任越大”的说法。)
因此,为了回答您的问题,函数式编程本身与封装数据无关,但函数式语言提供了诸如类或模块之类的功能来为它们实现封装。这是一个咆哮,而不是一个问题。在这个网站和其他地方有很多OOP和FP的比较。如果你的数据是不可变的,你就不需要隐藏它。函数式编程几乎不是一种“新范式”。@d.j.brown事实上,它比面向对象编程更古老。没有最佳范式。不同的范式各有利弊。FP非常适合构造编译器。@mosomedve为什么您认为在函数式编程中不能隐藏数据,或者这样做对面向对象编程至关重要?这是一个非常好的答案。所以我应该学习FP,结合OOP,这将是一个很好的结果。谢谢,基本上是的。你知道的越多,你就越能够为正确的问题选择正确的解决方案。你会发现FP对于某些问题非常好,而OOP对于其他类型的问题则更好。此外,如果您对答案感到满意,请随时将其标记为已接受。:)