現在、特定の API (libpq) を介してデータベースに接続するために使用する実行中のコードがあります。
基本的に 2 つのクラスがあります。メイン アプリケーション クラス CMain と、CDbConnectorPq と呼ばれるデータベース関連クラス (データベースへの接続、クエリの発行、結果の保存を担当) です。
私の CMain コンストラクターでは、現在、CDbConnectorPq 型のクラス メンバーをインスタンス化し、そのオブジェクトを使用して、CMain オブジェクトから直接、接続とクエリをトリガーします。
main->dbConnectorPq->connect();
問題は、libpq に加えて、データベース (ODBC) に接続するための別の API を実装する必要があることです。私は、libpq コードを odbc コードから分離し続けるための適切なモデリングとは何かを理解しようとしていますが、それでもメイン オブジェクトとまったく同じインターフェイスを使用しています。
私は継承について考えましたが、CDbConnectorPq と CDbConnectorODBC の 2 つのクラスを持つことになり、メインでは libpqxx 用と odbc 用の 2 つのメンバーを持つことになり、強制的に:
if ( gl_use_config_odbc )
dbConnectorOdbc = new CDbConnectorODBC();
else if ( gl_use_config_libpq )
dbConnectorPq = new CDbConnectorPq();
その後 :
if ( gl_use_config_odbc ) {
dbConnectorOdbc->connect();
dbConnectorOdbc->query();
}
else if ( gl_use_config_pq ) {
dbConnectorPq->connect();
dbConnectorPq->query();
}
ここで継承を利用して、メイン オブジェクトから API 固有のロジックをマスクする方法がわかりません。
理想的には、インターフェースは(私が思うに)次のようにする必要があります:
( gl_use_config = PQ の場合) dbConnector->setType(gl_use_config); dbConnector->connect(....); dbConnector>接続(...);
または ( gl_use_config = ODBC の場合) dbConnector->setType(gl_use_config); dbConnector->connect(param1,param2); dbConnector>接続 (クエリ 1、クエリ 2);
はい、引数番号は、PQ と ODBC の間で数と型が異なる可能性があるためです...
では、この場合のスマート モデリングとはどのようなものでしょうか?