2017-03-31 43 views
0

我目前正在研究用C語言編寫的REST API,我很想聽聽關於我當前架構的第二種意見以及它如何被重構。關於媒體流式架構的第二種觀點

所以基本上它是一個音頻流媒體平臺,有兩種類型的調用 - 同步和異步。我們正在建立它,尤其是audiobridge插件。

問題:我們目前janus_audiobridge文件已長得太大,它相當困難的導航槽它(在一個單一的文件5K左右行代碼)。所以我決定了重構的時間。

我目前的解決方案和它的問題:我的想法是分離同步和異步調用到2個單獨的文件。通過這種方式,混合音頻和rtp轉發的所有內容將位於主要janus_audiobridge文件中,實際的端點將是分離的。

但是,這種方法的問題是同步/異步調用仍然使用來自主要janus_audiobridge文件的結構和靜態變量。所以我必須將它們傳遞給處理程序方法。這很醜陋。

您將如何構建這種系統?

謝謝!

+1

通過編譯單元共享全局變量通常是一個壞主意。您應該考慮將變量分組到結構對象中,這些對象可以在需要時輕鬆傳遞給函數。最小化模塊之間的依賴關係。 – user694733

+1

另外,2個源文件聽起來很少。如果文件與其他代碼明顯不同,那麼使用少於100行代碼的文件是毫無恥的。 – user694733

+0

謝謝,結構的好主意(我可以將一個指針傳遞給一個結構的方法,它應該可以訪問所有的東西)。是的,我已經打破了幾件事。謝謝! – IvRRimUm

回答

1

一個快速而骯髒的解決方案是將兩個源文件之一的變量聲明爲正常,並在另一個文件中將其聲明爲extern。這樣,兩個文件都可以引用相同的變量,但是隻有一個聲明。

我認爲更好的方法是看看其他庫如何處理這個問題。函數調用的第一個參數通常是一個指向內部結構的指針,該結構保存了您放入全局的所有信息。這爲大多數函數增加了一個參數,但僅僅是一個指針。這樣可以避免在聲明全局變量時出現問題,並且可以在單個進程中同時爲不同的上下文(多個客戶端或多個端點)重用代碼。

+0

第二個解決方案基本上是一個結構,它將包含我想跨多個文件使用的所有數據,對嗎?類似於@ user694733提出的? – IvRRimUm

+0

是的。與使用extern相比,我認爲這是兩種解決方案的更好選擇。 – Lunar