功能编程,OOP和数据隐藏

时间:2018-01-04 00:04:36

标签: oop functional-programming

每个人都说由于不变性,函数式编程可能比OOP更好。好的但是FP如何比OOP更好地隐藏或组织数据? 如果我知道OOP被引入来解决这个问题,因为程序范式不能很好地做到这一点。什么有FP这个?

如果你以一种好的方式使用OOP并且你不会写出贫血的风格类和可变对象,那么FP对于日常编程任务来说仍然是比OOP更好的选择吗?

1 个答案:

答案 0 :(得分:1)

  

<强> TL; DR

     

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

封装(你称之为&#34;数据隐藏&#34;)是现代编程的重要组成部分,无论范式如何。在开发库时,有一部分代码要隐藏在库的用户之外。

OOP方

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; 等等。)

因此,回答你的问题,函数式编程本身与封装数据无关,但是函数式语言提供了诸如类或模块之类的功能来为它们做这些。