假设有一个简单的整数计算器,只支持加法和乘法运算。它将接收一个整数生成器和一个作为加法器或乘数的整数作为其输入参数,并对来自生成器的每个元素应用相应的计算。我认为下面的粗略序列图恰当地描述了这个逻辑。但是当我使用 goroutines 和 channels 来实现相同的逻辑时,直接的方法/函数调用关系消失了,因为 goroutines 使用通道来发送和接收数据。generator := func(integers ...int) <-chan int { intStream := make(chan int) go func() { defer close(intStream) for _, i := range integers { intStream <- i } }() return intStream}multiply := func(intStream <-chan int, multiplier int) <-chan int { multipliedStream := make(chan int) go func() { defer close(multipliedStream) for i := range intStream { multipliedStream <- i*multiplier } }() return multipliedStream}add := func(intStream <-chan int, additive int) <-chan int { addedStream := make(chan int) go func() { defer close(addedStream) for i := range intStream { addedStream <- i+additive } }() return addedStream}intStream := generator(1, 2, 3, 4)pipeline := multiply(add(intStream, 1), 2)for v := range pipeline { fmt.Println(v)}诞生的goroutinegenerator作为生产者发送整数;add和中诞生的协程multiply既是生产者又是消费者;他们接收整数,处理它们,并将它们放入新的通道中。最后用两个channel把这3个goroutine连接成一个pipeline,但是我没有想到要呈现的一目了然。有没有一种面向goroutines的UML图?
1 回答

慕田峪7331174
TA贡献1828条经验 获得超13个赞
在这个领域没有放之四海而皆准的方法。这完全取决于您希望在设计中将重点放在何处:
如果你想坚持 goroutine 是轻量级线程这一事实,并且在消费的通道(缓冲或非缓冲)上,你可能会对活动图感兴趣。活动图也适用于突出功能设计中的值流(即对象流)。
如果你想显示对象(包括仿函数)在特定场景中如何交互,保留序列图,但完成它以显示发生了什么:你至少需要一些消费者和生成器之间的消息(这对应于通过通道:箭头不仅是函数调用;它们是消息,可以对应于函数调用,也可以对应于其他形式的通信)。如果频道非常重要,您甚至可以考虑为其添加一条 liefline:这将解决您表达的大部分问题。
不相关:使用 UML 图可视化记录低级代码,或进行某种可视化编程是完全有效的,但往往会创建非常复杂的图表,比代码更难阅读。这可能不是最好的目的。
- 1 回答
- 0 关注
- 125 浏览
添加回答
举报
0/150
提交
取消