2009-07-19 7 views
1

私は、数学的方程式を解く一般的なアルゴリズムを実装するDLL、例えばAを持っています。 私は数学的方程式を実装する別のDLL、例えばBを持っています DLL Bは方程式を解くためにDLL Aを使いますが、DLL BはDLL Aから与えられた方程式を実行できなければなりません(DLL Aは、今、DLL AはDLL Bを "知って"いなければならず、逆もまた同じです。DLL間の相互作用

これは「悪い」デザインですか? アマチュアのようなコードについて考えることはできますか? あなたは何をしますか(DLL Aは、数学的方程式を実装する他のさまざまなDLLによって使用される一般的なアルゴリズムを実装しています)。

おかげ デビッド

答えて

1

DLL AがDLL Bについて明示的に知っている必要があり、それはちょうど解決するために与えられた方程式を評価することができるようにするインターフェイスを必要としていることを理由はありません。

インタフェースは関数シグネチャによって指定することができ、適切な関数へのポインタがBからAに渡されるか、抽象クラスとして、実際に派生したインスタンスが何であるかを示すポインタまたは参照BからAに渡されました。

相互に依存するdllを持つことは可能ですが、通常はお勧めできません。この場合、必要とは思わない。

0

これは良い質問です。はい、それは悪いデザインになります。二つの解決策:

  • 2つのDLL(1つのBで使用されている部分、およびBを使用して別の部分)

に同じDLL

  • スプリットAですべてを置くあなたはもっと上を見つけるかもしれませんこのトピックは、 'サイクリック'および/または '非サイクリック'依存関係のためのグーグルである。

  • 1

    これは多くの人が使っているので、Aは古いdllだと思われます。悪いと思われるのは、Bを明示的に呼び出すようにAを変更する必要があるということです。これは、Aで何度も何度もやり直すつもりであることを示すかもしれません。これは、Aを変更するとdllをすべて再構築する必要があるためです。

    B(仮想、コールバック、テンプレート)に与える任意の形式のコールバックを導入することで、Bが方程式を実行する方法や方程式を解く方法を抽象化する必要があります。 Aは古く、おそらくもっと使われるので、私はBのために行くつもりです。ここでソルバーはAのクラスであるいくつかの擬似コードである、式Bのクラスがある:

    solver=new Solver; 
    equation=new Equation(&solver); 
    

    ソルバーは、抽象インターフェースのいくつかの並べ替えを実装する必要があります。最適なソリューションは、言語とフレームワークによって異なります。 "依存性の逆転の原理"または "依存性注入"のためのGoogle。

    1

    Dependency Inversion Principle (DIP)がこの問題(パッケージ間の実装の循環依存)が原因です。 Charles Baileyは、DIPを使用して依存関係を解消するソリューションを提供しました。 2つの具体的なクラスを直接(クラスや関数を連結するのではなく、DIPを適用することで大きな違いはありません)、それらを抽象化に結びつけます。

    この場合、「数学関数」を定義し、ソルバーDLLによって消費されるインターフェイスがあります。また、「ソルバアルゴリズム」を定義し、関数DLLによって消費されるインタフェースもあります。具体的なクラス/関数は抽象に依存しています。 C++の用語では、これらはインタフェースであり、関数DLLでメソッドを呼び出すとき、ソルバは「ソルバインタフェース」へのポインタとして関数に渡されます。この関数は、ソルバーインターフェース上のメソッドを呼び出して、ソルバーに適切なポイントでコールバックします。同様に、ソルバには、数学関数インタフェースへのポインタを取り、適切な時間に関数にコールバックするクラスがあります。

    ボブ・マーティンの書籍Agile Principles, Patterns and Practices in C#は、DIPを含むこれらのオブジェクト指向設計原則をカバーしています。彼は実際にこれらの原則を示す具体例を持っています。この本はC#(初版Javaを使用)を使用していますが、C++にも同じ原則と実践が適用されます。

    0

    あなたはDLL Aがコールバックインターフェースを公開し、DLL Bは、インタフェースに応じてコールバックメソッドを実装し、A.

    • を呼び出すときに、それへのポインタを提供するコールバックパターンを実装している場合、これは悪いデザインではありません長時間実行される関数の進捗状況コールバックは、このパターンの一般的な使用法です。
    • ソルバーのような協調コルーチン、コールバック注入候補アルゴリズム(可能であれば別のインターフェースにマッチする)は別の一般的な例です。
    +0

    DLLに共通のヘッダファイル(例えばインタフェース)があるのは問題ありませんが、リンク時の相互依存関係がある場合はひどいことです:AがBによってエクスポートされた関数をインポートし、BがAによってエクスポートされた関数。 – ChrisW

    関連する問題