假設有一個簡單的整數計算器,只支持加法和乘法運算。它將接收一個整數生成器和一個作為加法器或乘數的整數作為其輸入參數,并對來自生成器的每個元素應用相應的計算。我認為下面的粗略序列圖恰當地描述了這個邏輯。但是當我使用 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 是輕量級線程這一事實,并且在消費的通道(緩沖或非緩沖)上,你可能會對活動圖感興趣?;顒訄D也適用于突出功能設計中的值流(即對象流)。
如果你想顯示對象(包括仿函數)在特定場景中如何交互,保留序列圖,但完成它以顯示發生了什么:你至少需要一些消費者和生成器之間的消息(這對應于通過通道:箭頭不僅是函數調用;它們是消息,可以對應于函數調用,也可以對應于其他形式的通信)。如果頻道非常重要,您甚至可以考慮為其添加一條 liefline:這將解決您表達的大部分問題。
不相關:使用 UML 圖可視化記錄低級代碼,或進行某種可視化編程是完全有效的,但往往會創建非常復雜的圖表,比代碼更難閱讀。這可能不是最好的目的。
- 1 回答
- 0 關注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消