我已经尝试将我的clojure图表嵌入到UML中可用的内容中,使用类块作为文件级命名空间和依赖关系链接来显示关系,但它很尴尬并且往往会阻碍功能模式。我也尝试过开发ad-hoc解决方案,但是我发现一个解决方案和Java一样好用Java(简单的有向图似乎工作模糊,但结果不详细足够)。此外,我在网上找不到任何关于此事的内容。
为了清楚起见,我并不想做任何像代码生成这样的事情;我只是为了自己的利益而谈论纸笔图。我假设我不是第一个考虑使用lisp语言的人。
提出了哪些解决方案?有没有常用的标准?您有什么推荐的吗?你使用什么工具?
答案 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中是一个糟糕的设计气味)。测试至关重要 - 恕我直言,在Clojure等动态语言中比在静态类型的OOP语言中更为重要。
我的代码的整体逻辑通常是我的主要源代码文件的最后几行。
答案 5 :(得分:2)
我也一直在努力解决这个问题。我发现流程图非常适合基本功能和数据。以这种方式显示数据和数据流很容易。条件和递归都很简单。 UML序列/协作图可以很好地捕获一些相同的信息。
然而,一旦你开始使用HOF,这根本不适用。
包的正常UML图适用于名称空间,而不是那么多。