2

長時間実行されるマルチスレッドサーバーをC++でコーディングしています。ソケットでリクエストを受信し、データベースルックアップを実行して、ソケットで応答を返します。

サーバーは、データベース接続パラメーターなど、構成ファイルからさまざまな実行情報を読み取ります。会社のコードライブラリのデータベース抽象化クラスを使用する必要があります。DB接続を遅延インスタンス化するためにDB検索を実行しようとするまで待ちたくありません(複雑さが示されていないことと、DB接続を確立できない場合は起動時にエラーが終了する必要があるため)。

私の問題は、技術的に機能する「醜い」または悪いOOPを何も行わずに、データベース接続情報を検索クラスに取り込む方法です。私はこれを正しい方法で行う方法を学びたいです。

これを行うための良いデザインパターンはありますか?「上からパラメータ化」パターンを使用する必要がありますか?より単純な構成パターンが欠落していますか?

    // Read config file.
    // Open DB connection using config values.

    Server::process_request(string request, string response) {
        try {
            Process process(request);
            if (process.do_parse(response)) {
                return REQ_OK;
            } else {
                // handle error
            }
        } catch (..,) {
            // handle exceptions
        }
    }

    class Process : public GenericRequest {
    public:
        Process(string *input) : generic_process(input) {};
        bool    do_parse(string &output);
    }

    bool Process::do_parse(string &output) {
        // Parse the input request.
        Search search;      // database search object
        search.init( search parameters from parsing above );

        output = format_response(search.get_results());
    }

    class Search {
        // must use the Database library connection handle.
    }

上部のサーバークラスから上記の擬似コードの下部にある検索クラスインスタンスにDB接続を取得するにはどうすればよいですか?

4

1 に答える 1

1

あなたが解決しようとしている問題は、オブジェクトの依存関係の 1 つであり、依存性注入を使用してうまく解決されているようです。

あなたのクラスProcessには のインスタンスが必要Searchです。これは何らかの方法で構成する必要があります。Process独自のインスタンスを割り当てるインスタンスを持つ代わりにSearch、構築時に既製のインスタンスを受け取る方が簡単です。クラスは構成の詳細Processを知る必要がないSearchため、不要な依存関係が回避されます。

しかし、問題は を作成する必要があるオブジェクトにまで連鎖しますProcess。これは、構成の詳細を知る必要があるためです。あなたの状況では、クラスはインスタンスをServer作成するクラスであり、たまたまの構成の詳細を知っているため、実際には問題にはなりません。ProcessSearch

ただし、より良い解決策は、特別なクラスを実装することです。たとえばDBService、構成ステップから取得した DB の詳細をカプセル化し、既製のSearchインスタンスを取得する方法を提供します。このセットアップでは、他のオブジェクトはSearch、その構築と構成についてクラスに依存しません。DBService追加の利点として、テスト ケースの作成に役立つモックアップ オブジェクトを簡単に実装および挿入できます。

class DBSearch {
    /* implement/extends the Search interface/class wrt DB */
};

class DBService {
    /* constructor reads up configuration details somehow: command line, file */

     Search *newSearch(){
         return new DBSearch(config); // search object specialized on db
     }

};

上記のコードは、ソリューションをある程度示しています。このnewSearchメソッドは、インスタンスのみを構築するように制約されていませんSearchが、そのクラスを特殊化した任意のオブジェクトを構築できることに注意してください (上記のクラスなどDBSearch)。依存関係は からほとんど取り除かれ、実際に操作Processするインターフェースについて知る必要があるだけです。Search

ここで強調されている優れた OOP 設計の中心的な要素は、オブジェクト間の結合を減らして、アプリケーションの一部を変更または拡張するときに必要な作業量を減らすことです。

その OOP 設計パターンの詳細については、SO の依存性注入を参照してください。

于 2013-01-31T01:58:56.713 に答える