首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数式程序设计有软件工程方法吗?

函数式程序设计有软件工程方法吗?
EN

Stack Overflow用户
提问于 2011-01-31 14:50:30
回答 13查看 23.2K关注 0票数 205

今天教授的软件工程完全集中在面向对象的编程和面向对象的世界观上。有一种详细的方法描述了如何使用多个步骤和大量(UML)构件(如用例图或类图)将域模型转换为类模型。许多程序员已经内化了这种方法,并且对如何从头开始设计一个面向对象的应用程序有了很好的想法。

新的炒作是函数式编程,这在许多书籍和教程中都有教授。但是功能软件工程呢?在阅读关于Lisp和Clojure的文章时,我看到了两个有趣的陈述:

  1. 功能程序通常是自下而上开发的,而不是自上而下( Paul )。
  2. 函数式程序员使用地图,OO程序员在其中使用对象/类( Rich所说的‘Clojure for Java程序员’)。

那么,系统(基于模型)的方法是什么呢?功能应用程序的设计,即在Lisp或Clojure中?常见的步骤是什么,我使用什么工件,如何将它们从问题空间映射到解决方案空间?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-02-05 06:17:21

感谢上帝,软件工程人员还没有发现函数式编程。以下是一些相似之处:

  • 许多面向对象的“设计模式”被捕获为高阶函数。例如,在功能世界中,访问者模式被称为“折叠”(或者如果你是一个尖脑袋的理论家,则称为“变态”)。在函数式语言中,数据类型大多是树或元组,每种树类型都有与it.These高阶函数相关联的自然变态,通常伴随着某些编程定律,也就是“自由定理”。
  • 函数式程序员使用图表的次数比OO程序员少得多。在OO图中表达的大部分内容都是用类型或“签名”来表示的,您应该把它们看作是“模块类型”。Haskell也有“类型类”,这有点像接口类型。 那些使用类型的函数式程序员通常认为“一旦类型正确,代码实际上是自己编写的。” 并不是所有的函数式语言都使用显式类型,但是如何设计程序书是一本优秀的学习Scheme/Lisp/Clojure的书,它严重依赖于与类型密切相关的“数据描述”。

那么,系统(基于模型)的方法是什么呢?功能应用程序的设计,即在Lisp或Clojure中?

任何基于数据抽象的设计方法都能很好地工作。我碰巧认为,当语言有显式类型时,这会更容易,但即使没有显式类型,它也能工作。一本很好的关于抽象数据类型的设计方法的书,很容易适应函数式编程,是Barbara和John第一版的“程序开发中的抽象和规范”。李斯科夫获得图灵奖的部分原因是他的作品。

Lisp特有的另一种设计方法是确定哪些语言扩展在您工作的问题领域中是有用的,然后使用卫生的宏将这些结构添加到您的语言中。了解这种设计的一个好地方是Matthew的文章http://queue.acm.org/detail.cfm?id=2068896。这篇文章可能在付费墙后面。通过搜索术语“特定于领域的嵌入式语言”,您还可以找到关于这种设计的更一般的材料;对于Matthew所涵盖的特定建议和例子,我可能会从格雷厄姆的http://www.paulgraham.com/onlisp.html或者http://www.paulgraham.com/acl.html开始。

常见的步骤是什么,我使用什么工件?

共同步骤:

  1. 标识程序中的数据及其操作,并定义表示此数据的抽象数据类型。
  2. 确定常见的操作或计算模式,并将它们表示为高阶函数或宏.希望将此步骤作为重构的一部分。
  3. 如果您使用的是类型化函数式语言,请尽早经常使用类型检查器。如果您正在使用Lisp或Clojure,最佳实践是首先编写函数契约,包括单元测试--它是测试驱动的开发到最大。您将希望使用任何版本的QuickCheck已移植到您的平台,在您的情况下,它似乎被称为ClojureCheck。它是一个非常强大的库,用于构造使用高阶函数的随机代码测试。
票数 169
EN

Stack Overflow用户

发布于 2011-01-31 15:07:54

对于Clojure,我建议回到良好的旧关系建模。从酒窖里出来是一个鼓舞人心的读物。

票数 47
EN

Stack Overflow用户

发布于 2011-01-31 15:27:02

就我个人而言,我发现OO开发中的所有通常的良好实践也适用于函数式编程--只是在考虑到功能世界观的情况下做了一些小小的调整。从方法论的角度来看,你并不需要做任何根本不同的事情。

我的经验来自于近年来从Java迁移到Clojure。

下面是一些例子:

  • 理解您的业务域/数据模型-同样重要的是您是要设计对象模型还是使用嵌套映射创建功能数据结构。在某些方面,FP可能更容易一些,因为它鼓励您将数据模型与函数/流程分开来考虑,但仍然必须两者兼顾。
  • 在设计中面向服务-实际上从FP的角度来看非常好,因为一个典型的服务实际上只是一个有一些副作用的函数。我认为,有时在Lisp世界中支持的“自下而上”的软件开发视图实际上只是另一种伪装下的好的面向服务的API设计原则。
  • 测试驱动的开发-在FP语言中工作得很好,实际上有时甚至更好,因为纯函数非常适合编写清晰、可重复的测试,而不需要设置有状态的环境。您还可能希望构建单独的测试来检查数据完整性(例如,此映射中是否有我所期望的所有键,以平衡在OO语言中类定义将在编译时为您强制执行这一事实)。
  • 计划/迭代-与FP同样有效。如果您非常擅长构建工具/ DSL并在REPL中使用它们,您甚至可以与用户一起创建原型。
票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4852251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档