0

みなさんおはようございます、

データベースにコンテンツを追加するために、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 ( ) {
        //...
  }

回答ありがとうございます。英語の間違いや、理解に問題がある場合はお詫び申し上げます。

4

0 に答える 0