如何将clojure / lisp程序建模为图表?

时间:2011-03-01 17:36:48

标签: clojure lisp diagram

我已经尝试将我的clojure图表嵌入到UML中可用的内容中,使用类块作为文件级命名空间和依赖关系链接来显示关系,但它很尴尬并且往往会阻碍功能模式。我也尝试过开发ad-hoc解决方案,但是我发现一个解决方案和Java一样好用Java(简单的有向图似乎工作模糊,但结果不详细足够)。此外,我在网上找不到任何关于此事的内容。

为了清楚起见,我并不想做任何像代码生成这样的事情;我只是为了自己的利益而谈论纸笔图。我假设我不是第一个考虑使用lisp语言的人。

提出了哪些解决方案?有没有常用的标准?您有什么推荐的吗?你使用什么工具?

6 个答案:

答案 0 :(得分:13)

这取决于您想要在程序中描述的内容。

<强>依赖关系

使用类图来模拟命名空间之间的依赖关系;在这种情况下,如果在图中使用包而不是类,则更清楚。

您还可以使用类图来模拟actor之间的依赖关系

数据流

您还可以使用Communication Diagrams为程序中的数据流建模。在这种情况下,将每个名称空间描述为一个实体,将每个功能描述为该实体的方法。

或者,在演员的情况下,将每个演员描绘为一个实体,并将每个消息描述为一种方法。

在任何情况下,尝试用UML描述程序的算法都没有用。根据我的经验,它们在源文件的注释中有更好的描述。

答案 1 :(得分:9)

我认为它不是关于语言,而是关于你的概念模型。如果您采用“流处理”方法,那么数据流网络图可能是正确的方法,如某些Scheme diagrams in SICP。如果你采用更面向对象的方法(在Lisp中得到很好的支持),那么UML活动图可能更有意义。

答案 2 :(得分:8)

嗯,UML深深植根于OO设计(使用C ++!),因此用UML映射功能方法将非常困难。我不太了解Clojure,但你可能能够代表类似于Java类和接口(协议?)的东西,对于其他所有东西来说它真的很难。 FP更像是从输入到输出的一系列转换,没有明确的UML图(可能是活动图?)。最常见的图表是静态结构和对象之间的交互,但它们对FP范例并不真正有用。 根据您的目标,组件和部署图可以适用。

答案 3 :(得分:8)

我个人的想法是模拟数据流而不是代码结构,因为从我所看到的大型(不是那么大)Clojure项目代码布局倾向于真是太无聊了,有一大堆 composeable utilities 和一个用map,redure和STM事务将它们连接在一起的类。

Clojure在您选择的模型中非常灵活,因此您可能希望采用相反的方式。首先制作图表,然后选择干净地表达您构建的模型的语言的部分和模式。

答案 4 :(得分:5)

我认为像UML这样的东西不适合Clojure - UML更侧重于面向对象的范例,而这在Clojure中通常是不鼓励的。

当我进行函数式编程时,我倾向于在数据函数方面考虑更多:

  • 我需要哪些数据结构?在Clojure中,这通常归结为为我正在处理的每个重要实体定义一个地图结构。在简单的情况下,简单的字段列表通常就足够了。在具有许多不同实体的更复杂的情况下,您可能希望绘制一个来显示数据结构(树中的每个节点代表一个地图或记录类型)
  • 这些数据结构如何通过不同的转换函数来获得正确的结果?理想情况下,这些是纯函数,它将不可变值作为输入,并将不可变值作为输出。通常我将这些草图绘制为管道/流程图

如果你已经仔细考虑了上述内容,那么转换为Clojure代码非常简单。

  1. 为您的数据结构定义一个或多个构造函数,并编写几个测试以证明它们正在工作
  2. 自下而上地编写转换函数(即,首先使最基本的操作工作和测试,然后将它们组合在一起以定义更大的函数)。为每个功能编写测试。
  3. 如果您需要GUI或IO等实用程序功能,请在需要时根据需要进行编写。
  4. 将所有内容粘合在一起,在REPL进行测试以确保一切正常。
  5. 请注意,您的源文件通常也会按照上面列出的顺序进行结构化,顶部有更多基本功能,而更高级别功能组成底部功能。你不应该需要任何循环依赖(这在Clojure中是一个糟糕的设计气味)。测试至关重要 - 恕我直言,在Clojure等动态语言中比在静态类型的OOP语言中更为重要。

    我的代码的整体逻辑通常是我的主要源代码文件的最后几行。

答案 5 :(得分:2)

我也一直在努力解决这个问题。我发现流程图非常适合基本功能和数据。以这种方式显示数据和数据流很容易。条件和递归都很简单。 UML序列/协作图可以很好地捕获一些相同的信息。

然而,一旦你开始使用HOF,这根本不适用。

包的正常UML图适用于名称空间,而不是那么多。