Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 函数式编程、面向对象编程和数据隐藏_Oop_Functional Programming - Fatal编程技术网

Oop 函数式编程、面向对象编程和数据隐藏

Oop 函数式编程、面向对象编程和数据隐藏,oop,functional-programming,Oop,Functional Programming,每个人都说函数式编程可能比面向对象编程更好,因为它具有不变性。好的,但是FP如何比OOP更好地隐藏或组织数据呢? 如果我很清楚的话,OOP是用来解决这个问题的,因为过程范式在这方面做得不够好。FP为此做了什么 如果您以良好的方式使用OOP,并且不编写贫乏风格的类和可变对象,那么FP仍然是比OOP更好的日常编程任务选择吗 TL;DR 函数式编程与封装无关,但大多数现代函数式语言都支持封装 封装(您称之为“数据隐藏”)是现代编程的一个重要组成部分,无论采用何种模式。在开发库时,您希望对库用户隐藏部分

每个人都说函数式编程可能比面向对象编程更好,因为它具有不变性。好的,但是FP如何比OOP更好地隐藏或组织数据呢? 如果我很清楚的话,OOP是用来解决这个问题的,因为过程范式在这方面做得不够好。FP为此做了什么

如果您以良好的方式使用OOP,并且不编写贫乏风格的类和可变对象,那么FP仍然是比OOP更好的日常编程任务选择吗

TL;DR

函数式编程与封装无关,但大多数现代函数式语言都支持封装

封装(您称之为“数据隐藏”)是现代编程的一个重要组成部分,无论采用何种模式。在开发库时,您希望对库用户隐藏部分代码

面向对象方面 OOP语言允许您定义私有内容:属性、方法、类等等。私有的东西不能从外部作用域访问,仅此而已

# 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对于其他类型的问题则更好。此外,如果您对答案感到满意,请随时将其标记为已接受。:)