2017-03-31 2 views
0

私は現在C言語で書かれたREST APIに取り組んでいます。私の現在のアーキテクチャとそれがどのようにリファクタリングできるかについての第二の意見を聞きたいと思います。メディアストリーミングアーキテクチャに関する第2の意見

これは基本的に、2種類のコール(syncとasync)を持つオーディオストリーミングプラットフォームです。私たちはヤヌスの上に、具体的にはaudiobridgeプラグインを構築しています。

問題:私たちの現在のjanus_audiobridgeファイルはトラフそれ(単一ファイル内のコードの5Kの周りのライン)をナビゲートするには大きすぎるし、そのかなり難しい成長してきました。だから私はリファクタリングのための時間を決めました。

私の現在の解決策と問題点:私の考えは、2つの別々のファイルに同期と非同期の呼び出しを分離することでした。こうすることで、オーディオとrtpフォワードをミキシングするためのすべてのものがメインのjanus_audiobridgeファイルにあり、実際のエンドポイントは別々になります。

しかし、このアプローチの問題は、同期/非同期呼び出しでも、メインjanus_audiobridgeファイルの構造体と静的変数が使用されることです。だから私はハンドラメソッドにそれらを渡す必要があります。それはかなり醜いです。

どのようにこの種のシステムを設計しますか?

ありがとうございました!

+1

一般に、コンパイル単位でグローバル変数を共有するのは悪い考えです。変数を必要に応じて関数に簡単に渡すことができるstructオブジェクトに変数をグループ化することを検討する必要があります。モジュール間の依存関係を最小限に抑えます。 – user694733

+1

また、2つのソースファイルはほとんど聞こえません。それが他のコードとは明確に異なる場合、100行未満のコードを持つファイルに恥ずかしいことはありません。 – user694733

+0

ありがとう、structs(私はメソッドへの構造体へのポインタを渡すことができ、それからすべてのものにアクセスする必要があります)と素晴らしいアイデア。ええ、私はすでにいくつかのことを壊しました。ありがとう! – IvRRimUm

答えて

1

2つのソースファイルのうちの1つの変数を通常のように宣言し、それを他のファイルのexternとして宣言します。このようにして、両方のファイルは同じ変数を参照できますが、宣言は1つしかありません。

私の意見では、他のライブラリがこれをどのように処理しているかを見るのが良い方法です。関数呼び出しの最初の引数は通常、グローバル構造体に入れるすべての情報を保持する内部構造体へのポインタです。これは、ほとんどの関数に1つの引数を追加しますが、単なるポインタに過ぎません。これにより、グローバルを宣言する際の問題を回避し、コードを一度に複数のクライアントまたは複数のエンドポイントで異なるコンテキストで再利用できるようにします。

+0

2番目の解決策は、基本的には複数のファイルで使用したいすべてのデータを含む構造体です。 @ user694733が提案したのと同様に? – IvRRimUm

+0

はい。私は、externを使用するのと比べて、これを両方のソリューションのクリーナーとみなします。 – Lunar

関連する問題