過去7年來我一直在做面向對象編程,在此期間使用Java打開和關閉。我確信一些事情我有很好的把握,比如最有用的設計模式。事實上,下面的代碼使我能夠在一天之內完成一個小系統,這將處理我們現在準備實施的一個特定實例,同時具有足夠的靈活性來處理我所瞭解的未來需求:批判我的異常處理策略
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設計能力的光刺目的空隙我有。而這種差距是一種系統的異常處理方法。事實上,你可以在方法簽名中看到我暫時重新拋出一些異常,但實際上我已經在應用程序的另一個角落中根除了同樣的東西。
在我進一步探討之前,由於這是我第一次特別系統化的嘗試,所以我想要驗證一下迄今爲止我所做的一切。我們的應用程序在一堆文件上循環,「處理」它們,並「歸檔」它們。相當標準的票價。我爲了儘快推出原型而做出的一個決定如下。應用程序根據(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());
}
}
上述方法被調用正是如此,處理該文件:
try {
importHandlerType = detectImportHandler(detectedFile);
}
catch(Exception x) {
unusableFileErrors.put(detectedFile.getName(), x.getMessage());
continue;
}
unusableFileErrors是一張地圖,我想,當我做遍歷文件,然後我可以用這個地圖,它包含在更高層次來處理事物的特定文件的消息,如日誌記錄,將文件移動到系統上的其他位置等。
無論如何,我已經走了很久。我已經訂購了這本書"Robust Java",我希望在它和SO社區之間,我可以改進這個被忽視的方面。我已經看到了其他類似的問題,但我認爲,在實際代碼的背景下請求具體建議可能會有好處。
嗯,你應該在'finally'塊中關閉你的資源。 7年的Java,並沒有最終阻止嘖嘖!嘖嘖! :)恥辱Java沒有C#的'使用'塊 – pjp 2009-08-26 16:32:56
只是對您的第一個方法的評論 - 它做了很多(文件加載,轉換爲CSV,保存CSV)看起來像一種實用方法 - 我認爲*單責任原則*可以應用於方法和類。 – 2009-08-26 16:33:57
Nick,這不是一種實用方法,而是處理每個符合條件的文件的本質。在某種程度上,你必須有一種方法來封裝算法中看似不相關的步驟。 – 2009-08-26 16:54:13