【问题标题】:Analysis and Design for Functional Programming [closed]函数式编程的分析和设计
【发布时间】:2012-04-12 17:57:13
【问题描述】:

当您计划使用 Haskell 等函数式编程语言开发系统时,您如何处理分析和设计阶段?

我的背景是命令式/面向对象的编程语言,因此,我习惯于用例分析和使用 UML 来记录程序的设计。但问题是 UML 本质上与面向对象的软件开发方式相关。

我很感兴趣,什么是为将要使用函数式编程开发的系统开发文档和定义软件设计的最佳方式。

  • 您还会使用use case analysis 还是structured analysis and design
  • 软件架构师如何定义系统的高级设计以便开发人员遵循它?
  • 当您应该展示解决方案的设计时,您会向客户或新开发人员展示什么?
  • 如何在不先全部写完的情况下记录整个事物的图片?
  • 在函数世界中是否有与UML 相媲美的东西?

【问题讨论】:

标签: haskell functional-programming analysis software-design purely-functional


【解决方案1】:

我不是专业人士,但我会尽力回答其中一些问题。

你还会使用用例分析吗[?]

我不明白为什么不。收集用例,并设计一个您希望公开的满足用例的模块 API。确定用例是需要类型类,还是只需要普通函数。

或者也许是结构化的分析和设计?

我不熟悉这种方法,但从我从 wiki 文章中收集到的信息来看,它似乎可以正常工作。

软件架构师如何定义系统的高级设计以便开发人员遵循它?

我假设他们指定了一个模块以及模块的每个部分应具有的类型。再说一次,我不是专业人士,所以我不太确定在实践中做了什么。

当您应该展示解决方案的设计时,您会向您的客户或新开发人员展示什么?

您向客户展示对他们有意义的东西。如果您的客户足够精明,只需向他们展示类型签名并解释重要功能即可。如果他们不那么精明,那就画漂亮的画,或者你必须做的任何事情。 OOP 与现实世界的对象进行比较,而 FP 与......嗯......函数进行比较。向新手说明功能的典型方法是将其描述为一台机器,您可以在其中放入某些东西,然后再取出其他东西。

如何在不必先写完所有内容的情况下记录整个事情的图片?

“图片”?只需为重要函数定义类型签名,然后将实现保留为undefined。有一个包可以为您提供更好的存根,它会在编译时提醒您哪些部分还需要实现。

在功能世界中有什么可以与 UML 相媲美的吗?

嗯...不是吗?

【讨论】:

    【解决方案2】:

    让我们来看看这个说法:

    UML 本质上与面向对象的工作方式相关 软件。

    首先,这不是真的。无论实现是什么,您仍然可以在 UML 中对交互、用例、状态和数据模型进行建模。

    其次,Haskell 的类型类是面向对象的一种形式:它们在其参数类型上提供多态分派(这允许使用该类型中存在的数据的不同函数实现)。

    所以,是的,如果您真的想继续使用 UML,请继续。

    【讨论】:

    • Haskell 的类型类不是面向对象的一种形式。它们是一种特殊的多态性,通常也可以从对象系统中获得。但它们不耦合数据和方法,这是面向对象的标志。
    • 结合了数据和方法的类型haskell.org/haskellwiki/OOP_vs_type_classes
    • @sclv 是对的; Haskell 类型类比 OOP 类更接近 OOP 接口,但即使是这样的类比也不完美。事实上,Haskell 中最接近 OOP 类的就是 data types containing functions and monadic actions
    • @sclv 我不认为这是真的(尽管这是可以接受的“对孩子的谎言”)。如果你不考虑约束系统,类型类只是一个稍微受限的对象系统。在那个类型类中有 1. 子类型 2. 隐式自引用 3. 可替换的自引用(又名继承)。类型类只是 oop 中的(参数化)抽象类,而实例只是从该抽象类继承的对象。使用 GHC 7.4 和一些涉及 newtypeunsafeCoerce 和隐式参数的技巧,这种对应关系变得完整。
    • 我也认为“耦合数据和方法”确实独立于OO。将 Go 视为方法与结构分离的语言示例,但它非常 OOP。
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2013-01-26
    • 2010-09-06
    • 2011-01-11
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多