在第二版的839页上,史蒂夫·麦康奈尔(Steve McConnell)讨论了程序员在大型程序中“克服复杂性”的所有方式。他的提示最终体现在:
“面向对象的编程提供了同时适用于算法和数据的抽象级别,这是仅功能分解无法提供的那种抽象。”
加上他的结论“降低复杂度可以说是成为有效程序员的最重要的关键”(同一页),这似乎对函数式编程构成了很大的挑战。
FP和OO之间的辩论通常由FP支持者围绕复杂性问题进行,这些复杂性问题特别来自于并发或并行化的挑战。但是并发当然不是程序员必须克服的唯一复杂性。也许专注于减少一种复杂性会在其他方面大大增加它的复杂度,以至于在许多情况下,增加收益是不值得的。
如果我们将FP和OO之间的比较术语从并发性或可重用性等特定问题转移到全局复杂性的管理上,那场辩论会如何?
编辑
我想强调的对比是,OO似乎封装和抽象了数据和算法的复杂性,而函数式编程似乎鼓励在整个程序中使数据结构的实现细节更加“暴露”。
例如,参见Stuart Halloway(Clojure FP的支持者)在这里说,“数据类型的过度规范”是“惯用的OO风格的负面结果”,并主张将AddressBook概念化为简单的矢量或映射而不是更丰富的OO对象。以及其他(非向量化和非地图类)属性和方法。(此外,OO和领域驱动设计的支持者可能会说,将地址簿公开为向量或映射会使封装的数据过度暴露于从域的角度来看无关紧要甚至危险的方法)。