みなさんおはようございます、
データベースにコンテンツを追加するために、CSV、XLSX、XLS、ODS などのいくつかの「Excel」ファイルを解析する必要があります。数日前にすでにソリューションを実装しており、これまでのところうまく機能しています。実際、「テーブルへの挿入」、「テーブルの作成」、「クエリの準備」などの抽象メソッドを備えた抽象クラスがあり、これらのメソッドはドータークラス(XLS、CSV ...)で実装されています。ファイルとその読み取り方法に固有です。
次に、コードの最適化と因数分解を (ほとんど) 試みませんでした。実際、コードのほぼすべての行 (各娘クラス内) は同じで、ファイルを読み取る行だけが異なります (セルの値を取得する方法またはセルの種類を取得する方法...)。これらの値を使用して、準備済みステートメント インスタンスで "set Object" メソッドを呼び出すだけです。
そしてここに問題があります:特定のファイルを読み取り、ステートメント(パラメーター内)でsetObjectを呼び出すために、子クラスに実装される抽象メソッド(setObjectStatement():以下を参照)を作成しました。それはまだ機能しますが、以前よりも恐ろしく長くなります (コードの冗長性により)。コードはまったく同じです。一般的な方法でコピー/貼り付けするだけです。
どこが間違っていますか?大きなループでメソッドを呼び出すと、それほどコストがかかりますか? 修正できますか、それともコードの冗長性に対処する必要がありますか?
//Inserting in table (mother class) :
for (int col=colonneDepart-1;col<colonneFin;col++,ligneJtable++) {
//some conditions here which are independent from the file I read
//...
setStatementObject(statement,donnees,col,nRowIndex,nbrCol,ligneJtable);
System.out.println(statement);
}
//Also some methods call which are the same for every files
これが私の娘の方法の1つです(XLSの場合)
//setStatementObject for XLS files (daugther class)
Cell cellDonnee = sheet.getCell(nColIndex,nRowIndex);
CellType type = cellDonnee.getType();
if (type == CellType.LABEL) {
try {
int x = Integer.parseInt(cellDonnee.getContents());
statement.setObject(nObjectIndex,x);
}
catch(NumberFormatException e){
String s = cellDonnee.getContents();
if(s.equals("")){
statement.setObject(nObjectIndex,0.0);
}
else {
s = s.trim();
statement.setObject(nObjectIndex,s);
}
}
} else if ( ) {
//...
}
回答ありがとうございます。英語の間違いや、理解に問題がある場合はお詫び申し上げます。