...可能是OOP所基于的那些文章之一。
并非如此,但这确实增加了讨论的范围,特别是对于当时受过训练的从业人员,使用他在论文中描述的第一个标准分解系统的从业人员。
首先,我想知道我的评估是否正确。FP范式和本文在哲学上是否不一致?
不,而且,在我看来,您对FP程序的外观的描述与使用过程或函数的其他程序没有什么不同:
数据从一个函数传递到另一个函数,每个函数都密切了解数据并在此过程中“更改”它。
... 除了 “亲密关系”部分外,因为您可以(而且经常这样做)具有对抽象数据进行操作的功能,以精确地避免这种亲密关系。因此,您确实可以控制“亲密关系”,并且可以通过设置要隐藏的内容的界面(即功能)来随意调节它。
因此,我认为没有理由为什么我们不能使用函数式编程来遵循Parnas的信息隐藏标准,而最终实现了KWIC索引的实现,其收益与他的第二种实现相似。
假设他们同意,我想知道什么是FP数据隐藏实现。很明显在OOP中看到了这一点。您可以有一个私有字段,班级以外的任何人都不能访问。在FP中,没有明显的比喻。
就数据而言,您可以使用FP来详细说明数据抽象和数据类型抽象。这些功能中的任何一个都隐藏了混凝土结构,并使用函数作为抽象来隐藏这些混凝土结构。
编辑
越来越多的断言指出,在FP上下文中“隐藏数据”并不是那么有用(或OOP式(?))。因此,让我在此标记SICP中一个非常简单清晰的示例:
假设您的系统需要使用有理数。您可能想要表示它们的一种方法是成对或两个整数列表:分子和分母。从而:
(define my-rat (cons 1 2)) ; here is my 1/2
如果您忽略数据抽象,很可能会使用car
和获得分子和分母cdr
:
(... (car my-rat)) ; do something with the numerator
按照这种方法,操纵有理数的系统的所有部分都将知道有理数是cons
-他们将对cons
数进行编号以创建有理数并使用列表运算符提取它们。
您可能面临的一个问题是何时需要简化形式的有理数-整个系统都需要进行更改。同样,如果您决定在创建时减少,则以后可能会发现,访问一个有理术语时减少会更好,从而产生另一次全面变化。
另一个问题是,假设是否首选它们的替代表示形式,而您决定放弃该cons
表示形式,请再次进行满量程更改。
处理这些情况的任何明智的努力都可能会开始隐藏界面背后的理性表示。最后,您可能会得到如下结果:
并且系统将不再(也应该不再)知道构成什么理性。这是因为cons
,car
而cdr
不是固有的有理数,但是make-rat
,numer
和denom
是。当然,这很容易成为FP系统。因此,“数据隐藏”(在这种情况下,更好地称为数据抽象,或者是努力封装表示和具体结构)是相关的概念和广泛使用和探索的技术,无论是在OO,函数式编程还是在随你。
重点是……尽管人们可能会试图区分他们正在执行的“某种隐藏”或封装(无论是隐藏设计决策,数据结构还是算法,在过程抽象的情况下),所有这些都具有相同的主题:它们是由一个或多个点帕纳斯作出了明确的动机。那是:
- 可变性:所需的更改是可以在本地进行还是通过系统传播。
- 独立开发:在多大程度上可以并行开发系统的两个部分。
- 可理解性:需要了解多少系统才能理解其一部分。
上面的示例取自SICP的书,因此,为了在书中对这个概念进行完整的讨论和介绍,我强烈建议您阅读第2章。我还建议您在FP上下文中熟悉Abstract Data Types,这会带来其他问题。