Functional Programming Architecture我熟悉面向对象的体系结构,包括使用设计模式和类图进行可视化,并且我知道带有契约和协议绑定的面向服务的体系结构,但是用这种语言编写的系统的软件体系结构有什么特点?功能编程语言? 我知道FP已用于中型到大型项目。保罗·格雷厄姆(Paul Graham)撰写了Yahoo!的第一个化身。存放在Common Lisp中。一些Lisp开发系统很复杂。用功能语言编写的人工智能和金融系统可能会变得非常庞大。它们都至少具有某种固有的体系结构,但是,我想知道它们是否有共同点? 基于表达式评估的体系结构是什么样的? FP架构是否更具可组合性? 更新:凯尔(Kyle)提醒我,SICP是此主题的不错资源。 更新2:我在以下主题上找到了一篇不错的文章:函数式编程如何影响代码的结构? 使用功能性语言的项目"体系结构"中的共同点是,它们倾向于分为代数层,而不是传统系统体系结构意义上的子系统。 有关此类项目的绝佳示例,请查看XMonad,Yi和HappS。如果检查它们的结构,您会发现它们由单层结构组成,中间夹有一些组合胶。 另请参阅Scala实验论文,该论文概述了体系结构,其中系统由对其依赖项进行抽象的组件组成。 我目前正在写《函数式编程中的设计和体系结构》一书。它描述了纯FP世界中存在的许多设计模式和方法(主要语言是Haskell),但不仅如此。这本书教您如何从头开始构建具有纯净和不纯状态,多线程,网络,数据库,GUI的大型应用程序,以及如何将其划分为多个层并获得简单性。它还显示了如何为域和语言建模,如何组织和描述应用程序的体系结构以及如何对其进行测试,等等。 主题列表包括:
这本书基于我正在研究的Haskell项目,尤其是SCADA应用程序Andromeda。本书的代码可在此处获得。虽然本书正在开发中(将在2017年完成),但我建议您在这里熟悉我的文章" FP中的设计和体系结构"(俄罗斯)。 更新 我在线上分享了我的书(前5章)。见Reddit上的帖子 在功能语言中,最大的共性是使用函数存储数据。这有点像在没有对象的对象上使用访问器函数。而是在可以访问所需数据的环境中创建该函数。现在,此函数可以在任何地方传递和使用,并且仍然保留使用数据的功能。 这是一个非常简单的示例。这不是纯粹的功能,因为它确实会改变状态,但是很常见:
因此,我们有一个函数,make-counter,它返回另一个具有内部计数器状态的函数。我们可以调用该新创建的计数器并观察内部的变化。 这就是功能程序的结构。您有将函数作为参数的函数,有返回具有隐藏状态的函数的函数,等等。这比自己管理内存要干净得多。 希望不要太切切,但对于浏览此问题答案的任何人来说可能很有趣,这是Peter Norvig的演示"动态编程中的设计模式"。 我打印并查看了Ocaml中的"设计模式",它们使用模块和函子(和对象)来重新创建我们习惯的正常设计模式。这很有趣,但是我认为他们过多地使用对象,以至于无法真正看到功能语言的好处。 FP非常容易组合,这是其本质的一部分。我想我的简短答案是使用模块和函子。 我当前的项目很大,我们通过文件将每个模块分开-隐含在ocaml中。我也一直在寻找全面的资源,对于从项目中获得的真正成功的设计,可能会有一些其他观点或想法。 我已经处理了一些相当大的功能项目。它们通常分为两个阵营(至少是我使用过的阵营):
我认为这可能会有所帮助;
[AIM-2002-005] Gregory T. Sullivan,可执行设计模式的高级编程语言功能"通过反射实现更好的模式 2002年3月22日
|