私は過去7年間のほとんどの間、オブジェクト指向プログラミングを行ってきました。最も有用なデザインパターンなど、私は優れた把握力を持っていると確信しています。実際には、次のコードは私が今実装している特定のインスタンスを処理し、将来通知された将来の要件を処理するのに十分な柔軟性を備えながら、1日のうちに小さなシステムを作り出すことを可能にしました:私の例外処理の戦略を批判します
public void importAndArchive(File detectedFile) throws FileNotFoundException, IOException {
File workingCopy = returnWorkingCopy(detectedFile);
List<String[]> csvData = csvData(workingCopy);
setHeaderFields(csvData.get(0));
importData(csvData); //subclass will implement this abstract method
archiveWorkingCopy(workingCopy);
}
私は、テンプレートメソッドの私の把握を自慢するために、上記を示さないのではなく、出発点としての私のOO設計能力の光の中で睨んされ、私は自分の能力を持っているギャップを議論します。そしてそのギャップは、例外処理に対する体系的なアプローチです。実際には、そのメソッドのシグネチャでは、いくつかの例外を再スローしているのが分かりますが、実際には、アプリケーションの別のコーナーで、まったく同じ種類のものを根絶するために行ってきました。
私がはるかに詳しく説明する前に、これは私の最初の試みで特に系統的であるため、これまでに行ったことの検証をしたいと思います。私たちのアプリケーションはたくさんのファイルをループし、それらを "処理"し、それらを "アーカイブ"します。かなり標準的な運賃。できるだけ早くプロトタイプを公開するために私が作った1つの決定は次のとおりです。アプリケーションは、(ResourceBundled)プロパティファイルのデータに基づいて初期化されます。 ResourceBundle APIのさまざまなメソッドはチェックされていない例外をスローしますが、アプリケーションの起動を妨げるため、当面は何も処理していないので、当面はスタックトレースで十分です。
私はCSV処理用のライブラリを選択しましたが、これはチェック例外をスローします。 NetBeansはその後、そもそもこれらの例外を増殖させることが非常に簡単に作ら;)次は私がするので、実際にこれらの例外を処理することを作り直してきた方法です。
private String detectImportHandler(File detectedFile) throws Exception {
String[] firstLine = null;
try {
/*
* CSVReader throws checked exceptions
*/
CSVReader csvReader = new CSVReader(new FileReader(detectedFile));
firstLine = csvReader.readNext();
csvReader.close();
}
catch(Exception x) {
throw new Exception("CSVReader unable to process file: " + x.getMessage());
}
try {
return firstLine[1];
}
catch(Exception x) {
/*
* since we're re-throwing CSVReader's checked exceptions it seems easiest
* to also re-throw null-pointer and/or array-out-of-bounds errors
*/
throw new Exception(
"First line null or did not have importHandlerType field: " + x.getMessage());
}
}
上記の方法は、ループ内で、thuslyと呼ばれています私は、このマップと、それはより高いレベルで物事を処理するために含まれているファイル固有のメッセージを使用することができ、地図がある
try {
importHandlerType = detectImportHandler(detectedFile);
}
catch(Exception x) {
unusableFileErrors.put(detectedFile.getName(), x.getMessage());
continue;
}
unusableFileErrors、と私は、ファイルを反復処理行われていたときに私が把握:それは、ファイルを処理しますログの記録、システム上の他の場所へのファイルの移動など)。
とにかく私は十分に長く続けました。私は本"Robust Java"を注文しました。私はそれとSOコミュニティとの間で、私の能力のこのような面を改善することができます。私はSOに関する他の同様の質問を見てきましたが、私は実際のコードの文脈で具体的なアドバイスを要求することも有益かもしれないと考えています。
あなたはリソースを 'finally'ブロックで閉じているべきです。 Javaの7年と最終的にブロックtut!ツタン! :) Shame JavaはC#の 'using'ブロックを持っていません – pjp
あなたの最初のメソッドに対するちょっとしたコメント - 実用的な方法のように見えるのは、ファイル読み込み、CSVへの変換、CSVの保存です。責任原則*は、メソッドだけでなくクラスにも適用できます。 –
Nick、それは実用的な方法ではなく、すべての適格なファイルがどのように処理されるかの本質です。あるレベルでは、そうでなければ一見無関係なステップをアルゴリズムでカプセル化するメソッドが必要です。 –