8

DIP を使用して仮想のモジュラー C++ プロジェクトを開発したい場合。モジュール性のため、1 つの特定の機能を 1 つのライブラリに完全に実装することにしましたA。別のライブラリB(または 2 つ、または 3 つ ...) がこの機能 (ロギング メカニズムなど) を使用しています。

class ILogger
{
    virtual void log(const std::string& s) = 0;
};

このインターフェイスを物理的にどこに配置すればよいですか? 一部のブロガーは、インターフェイスがユーザーに属しているため (DIP のため) 、ユーザー側(またはここ) にインターフェイスを配置する必要があることを示唆しているようです。これにより、実装をテストにリンクする必要がないため、テスト容易性も向上します。

これは、インターフェイスがないため、ライブラリ A 自体がコンパイルされないことを意味します。また、ライブラリ C がロギング機能も使用する場合、 interface も導入され、 ODRILoggerが中断されることも意味します。これは、インターフェイスのみを含む追加のパッケージ レイヤー ライブラリ D を導入することで解決できます。しかし、主な問題は残っています:

インターフェースはどこに置く?DIP に関する元の論文を読みましたが、インターフェイスをライブラリに入れるべきではないという解釈には同意できません。この論文は、開発をどのように考えるかのガイドラインとして意図されていると感じています(「ユーザーは実装者ではなくインターフェースを定義している」)。これは正しいです?依存関係逆転の原則をどのように使用しますか?

4

1 に答える 1