2017-11-01 19 views
0

このquestionは、私が達成しようとしていることと非常によく似ています。私はJavaを使用していて、C++ではないので、答えはまだ不明です。OOD - 各メンバ変数の重複機能の回避(Java)

SQL接続を持つクラス(SQLService)と、JDBCライブラリを使用して管理する3つのテーブルがあります。私はオプションを作成することです

class SQLService { 
    private Table table1; 
    private Table table2; 
    private Table table3; 
    private Connection connection; 

    private String buildInsertQuery() { 
     // Builds SQL insert query String like "INSERT INTO blah (col1, col2, col3) VALUES (?, ?, ?) 
    } 
} 
  • (以下、簡単なスニペットを参照してください)一つのデータと、各テーブルに取り、列の数に基づいて動的なINSERT文を構築するプライベート関数(buildInsertQuery)を構築していますメンバー変数ごとに別々の関数。しかし、buildInsertQuery()関数は、使用されているテーブルにかかわらず同じことを行うので、同じコードをコピーして貼り付け、各メンバ変数の関数に異なる名前を付けることは非常に冗長でしょう。

  • もう1つの方法は、テーブルをパラメータとしてbuildInsertQuery(つまりbuildInsertQuery(Table table))に渡すことです。しかし、thisを読んだ後も、これは非常に非効率的だと感じています。

上記の記事では、クラスメンバポインタを使用したソリューションがありました。しかし、Javaに相当するものがあるかどうかはわかりませんでした。

ありがとうございます!

+0

動的クエリの作成?なぜ、なぜですか? SQLはOOPではありません。静的クエリを使用してください! –

+1

なぜ3つのテーブルを管理する必要がありますか?なぜ、1つのテーブルを管理し、実際のテーブルの周りに実装を構築する抽象実装を考案しないのですか? – MadProgrammer

+0

'java'は' C++ 'ではありません。一般的な機能とテーブル名を引数として持つプライベートベース関数を作成し、対応するテーブル名で基本関数を呼び出す3つのテーブルに特化した3つのメソッドを追加します。 – karakfa

答えて

0

一般的な機能とテーブルを引数として持つプライベートベース関数を作成し、対応するテーブルを持つ基本関数を呼び出す3つのテーブルに特化した3つのメソッドを追加します。

class SQLService { 
    private Table table1; 
    private Table table2; 
    private Table table3; 
    private Connection connection; 

    private String buildInsertQuery(Table table) { 
     // Builds SQL insert query String l 
     ... 
    } 

    // perhaps memoize the result for reuse. 
    String buildInsertQueryForTable1() { 
     return buildInsertQuery(table1); 
    } 

    // similarly for other tables 
} 
+0

これは私が最初にやっていることです。しかし、関数が直接それらにアクセスできるとしても、メンバー変数がbuildInsertQuery()の引数として渡されているということはまだ冗長ではありませんか?間違いなくこのメモ帳に実装されます! – Zack

+0

私はなぜそれが私を悩ますべきかわからない。私はメンバーのバールがあれば、そのようなものを使う必要があると思っています。 – Zack

+1

インスタンス変数にアクセスすることなく、プライベートメソッドを静的に変換する方が気になる場合は、 – karakfa