2011-01-18 10 views
5

1つのモジュール(A)に列挙型の定義があります。 SUCCESS = 0、INVALID_REQ = 1などです。次に、別のdll(モジュールB)があります。これには、独自のステータス列挙セットがあります。 Aに新しいenum値を追加したら、Aを.NETに、BをCコードに手動で追加する必要があります。さらに、Aの列挙型はBの状態列挙の一部に過ぎません(BはAの状態のほかに独自の内部状態を持っています)。 これは、これら2つのモジュール間の非常に緊密な結合のようです。カップリングを減らすための提案はありますか? Thx!モジュール間で列挙型を変換する

+0

ここでの最大の問題は、2つを同期させることではありませんが(問題ですが)、Bの列挙型がAの列挙型とは異なることを意味しています。新しい要素をAに追加しますが、突然Bで使用される内部値と競合します。相互運用性のために値を複製する必要がある場合は、相互運用性のために_only_を使用し、内部状態を別々に管理してください。 –

+1

ここには暗黙の契約*があります。 HTTP2が新しい動詞、[JABBERWOCKY](http://www.jabberwocky.com/carroll/jabber/jabberwocky.html)を追加したと想像してください。すべてのHTTP2クライアント/サーバーは、この契約の知識を持ってエンコードする必要があります。明白な[プロトコル]バージョンを使用すると、おそらくガードと[下位互換性](http://en.wikipedia.org/wiki/Backward_compatibility)は、不一致を捕捉し、緩和するのに役立ちます。契約情報を共有するのに役立つツールがあります。[COM IDL](http://en.wikipedia.org/wiki/Component_Object_Model)や他の足場生成ツールを想像してみてください。 –

+0

@ダン:私は、Aのようにenum値を使用し、100から始まるBのconst(Aから0-99)を定義することを考えています。次に、Bのインタフェースとしてenumの代わりにintegerを使用します。 AとBの両方のステータスは、Bのインターフェイスから公開され、AとBが互いに干渉する心配はありません。 – Icerman

答えて

2

なぜビルド時のファイルに基づいてこれらの列挙型を生成する単純なスクリプトを記述していませんか?あなたが本当にそれを切り離すしたい場合は、誰かのマスターを作成し、他の側にその内容を公開する必要があります。..そうな楽しいだろうと何..

+0

*咳* COM IDL? *咳* –

+0

:)それは書くことの世界の終わりではありません.. :) – gbvb

1

をRCWを使用すると、ここにリフレクションを使用することです。モジュールAからの反射によって列挙型を読み取る小さなプログラムを作成し、cモジュールで使用する.hファイルを生成します。