我熟悉面向对象的体系结构,包括使用设计模式和类图进行可视化,我知道面向服务的体系结构及其契约和协议绑定,但是对于用函数式编程语言编写的系统的软件体系结构有什么特点吗?
我知道 FP 已用于中型到大型项目。Paul Graham 在 Common Lisp 中编写了 Yahoo!Store 的第一个化身。一些 lisp 开发系统很复杂。用功能语言编写的人工智能和金融系统可能会变得相当大。但是,它们都至少具有某种固有的体系结构,我想知道它们是否有共同点?
基于表达式求值的架构是什么样的?FP 架构更可组合吗?
更新:凯尔提醒我,SICP是该主题的一个很好的资源。
更新 2:我找到了一个关于该主题的好帖子:How does functional programming affect the structure of your code?
使用功能语言的项目的“体系结构”中的共同点是,它们往往被分成代数层,而不是传统系统体系结构意义上的子系统。
有关此类项目的最佳示例,请查看XMonad、Yi和HappS。如果您检查它们的结构,您会发现它们由单层结构组成,中间有一些组合粘合剂。
还要看一下The Scala Experiment论文,它概述了一个体系结构,其中系统由对其依赖关系进行抽象的组件组成。
我目前正在写《函数式编程中的设计与架构》这本书。它描述了许多存在于纯 FP 世界 (主要语言是 Haskell) 中的设计模式和方法,但不仅如此。这本书教你如何从零开始构建大应用程序与纯和不纯的状态,多线程,网络,数据库,GUI,如何将其分成层并获得简单性。它还展示了如何对域和语言进行建模,如何组织和描述应用程序的
主题列表包括:
使用图进行体系结构建模的方法;
需求分析;
嵌入式 DSL 领域建模;
外部 DSL 设计与实现;
作为具有效果的子系统的单子;
作为功能接口的自由单子;
箭头表示的 eDSL;
使用免费的一元 eDSL 反转控制;
软件事务存储器;
透镜;
状态、读取器、写入器、 RWS 、 ST 单子;
不纯状态:IORef 、 MVar 、 STM;
多线程和并发域建模;
GUI;
UML 、 SOLID 、 GRASP 等主流技术和方法的适用性;
与不纯子系统的相互作用。
本书基于我正在研究的 Haskell 项目,尤其是 SCADA 应用程序Andromeda。本书的代码可用here。当本书正在开发中(将在 2017 年完成)时,我可以建议您熟悉我的文章“FP 中的设计和体系结构”here(Rus)。
UPDATE我在网上分享了我的书(前 5 章)。See post on Reddit
在函数式语言中你会发现最大的共性是使用函数来存储数据。这有点像在没有对象的对象上使用访问器函数。相反,函数是在它可以访问所需数据的环境中创建的。现在这个函数可以在任何地方传递和使用,仍然保留使用数据的能力。
这是一个非常简单的例子。这不是纯粹的功能,因为它确实改变了状态,但它很常见:
(define (make-counter)
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(define x (make-counter))
(x) returns 1
(x) returns 2
...etc...
所以我们有一个函数 make-counter,它返回另一个函数,其中包含计数器的状态。我们可以调用新创建的计数器并观察内部的变化。
这就是函数程序的结构。你有函数作为参数,你有函数返回隐藏状态的函数,等等。这一切都比自己管理内存更干净。
我打印出来并查看了Design Patterns in Ocaml,他们使用模块和函子(和对象)来重新创建我们习惯的常规设计模式。这很有趣,但是我认为他们使用对象太才能真正看到功能语言的好处。FP 非常可组合,是它的一部分。我想我的简短答案是使用模块和 em函子。
我目前的项目是相当大的,我们通过文件分离每个模块-在 ocaml 中隐含我一直在寻找一个全面的资源,以及可能有一些替代的观点或一些想法,一个真正成功的设计出来的一个项目。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(22条)