如何在UML中建模递归调用

2 投票
2 回答
3902 浏览
提问于 2025-04-16 10:15

我想用UML(统一建模语言)来描述我用Python写的应用程序中的函数调用,但我遇到了两个问题。

第一个问题是,我尝试画序列图,但序列图主要是用来描述对象之间的方法调用,而我的应用程序是按程序流程写的,也就是说,我实际上只有一些库中的类型实例(比如html5lib)作为对象。

第二个问题是,我有一些递归调用,我需要在UML图上表示这些递归调用,但序列图似乎不太适合这个。

那么我应该使用哪种UML图呢?还有,如何表示递归调用,比如下面这个函数?

def node_preprocessing(node):
    global tags_remove, tags_special
    if node.nodeType==3: # Text node
        return preprocessing(node.wholeText)
    if node.nodeType==1 and node.tagName not in tags_remove: # Tag node
        if node.tagName in tags_special:
            return tags_special[node.tagName](node)
        return convert_tag(node) % u"".join(map(node_preprocessing, node.childNodes))
    return u""

另一方面,我并不想详细展示这个函数里发生的所有事情。我只想显示它调用了哪些东西(比如它自己、preprocessing(text)、convert_tag(node))以及它们的调用顺序。

补充说明:tags_special是一个字典,里面存放的是一些lambda函数。我不需要把它们的调用也画出来。

2 个回答

0

一个UML状态图可能是个不错的选择。这个例子中有一些反向箭头,可能对展示递归很有帮助。

2

你可以很简单地模拟递归调用。其实你不需要用到对象就可以使用时序图。不过如果你只关心被调用的方法和它们的顺序,我觉得最合适的就是通信图。你可以在这里了解更多:http://en.wikipedia.org/wiki/Communication_diagram。递归调用可以用迭代来表示。在时序图中,递归可以通过循环分区来表示。

撰写回答