oop - "Many functions operating upon few abstractions"原理 vs 面向对象

标签 oop clojure functional-programming reusability

Clojure 语言的创造者 claims “开放的、大型的函数集在开放的、小型的可扩展抽象集上运行是算法重用和库互操作性的关键”。显然,它与典型的 OOP 方法相矛盾,在这种方法中,您创建大量抽象(类)和相对较小的一组操作它们的函数。请推荐一本书、书中的一章、一篇文章或您的个人经历来详细说明这些主题:

  • OOP 中出现的问题的激励示例,以及如何使用“基于少量抽象的多函数”来解决这些问题
  • 如何有效地进行 MFUFA* 设计
  • 如何重构面向 MFUFA 的 OOP 代码
  • OOP 语言的语法如何妨碍 MFUFA

  • *MFUFA:“在很少的抽象上有很多功能”

    最佳答案

    编程中有两个主要的“抽象”概念:

  • 参数化(“多态性”,通用性)。
  • 封装(数据隐藏),

  • [编辑:这两个是双重的。第一个是客户端抽象,第二个是实现方抽象(如果你关心这些事情:在形式逻辑或类型理论方面,它们分别对应于普遍和存在量化)。]

    在 OO 中,类是实现这两种抽象的厨房水槽功能。

    广告 (1),对于几乎每个“模式”,您都需要定义一个自定义类(或多个)。另一方面,在函数式编程中,您通常有更多轻量级和直接的方法来实现相同的目标,尤其是函数和元组。例如,经常有人指出,GoF 中的大部分“设计模式”在 FP 中都是多余的。

    Ad (2),如果您没有可变状态徘徊在需要检查的任何地方,则需要较少地进行封装。您仍然在 FP 中构建 ADT,但它们往往更简单和更通用,因此您需要的它们更少。

    关于oop - "Many functions operating upon few abstractions"原理 vs 面向对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10565116/

    相关文章:

    clojure - 我有两个版本的函数来计算前导哈希(#)字符,哪个更好?

    functional-programming - 我应该如何映射可能列表?

    Python:重新定义函数,使其引用自己

    c# - 如何在接口(interface)类中设置正确方法的参数

    c# - 如何防止property setter修改私有(private)属性数据

    javascript - 如何从子调用父方法

    java - 访问未在 Clojure 中导入的 Java 类的字段和方法

    oop - 如何决定是使用 IS A 还是 HAS A Relation

    clojure - `binding` 是否与 `iterate` 一起使用?

    java - 功能分解与柯里化(Currying)与部分应用