结构性错误
團隊成員在使用以下代碼時遇到了麻煩:
void extractData(String targetUri) { Path tempFile = createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUri) { try (FileOutputStream stream = createOutput(tempFile)) { // extract from db to file stream database.readTable(TABLE_1, stream); // upload the temp file to the destination uploader.upload(tempFile, targetUri); } }上面的代碼經過精簡和簡化,使您對問題有所了解。 我們有一個數據庫,一個要寫入的臨時臨時文件和一個上載過程。
問題是上upload呼叫無法正常工作。 真令人沮喪!
老鷹眼的讀者可能會發現,在進行上upload調用時,由第二個函數內的OutputStream寫入的臨時文件尚未關閉。 那是個錯誤,解決方法是將調用upload到try-with-resources塊之外,該塊的工作是關閉流,從而釋放文件(至少在Windows上,您不能讀取您也在寫的文件!)。
錯誤不是那樣!
這是一個很難發現的錯誤,是結構決策的結果。 上載調用屬于導出操作之外的原因不僅是為了確保流關閉,還因為它是整個過程的另一個階段。 該過程應該是:
- 創建臨時位置
- 導出到臨時位置
- 清理臨時位置
這里的縮進反映了作用域。
上面的實現合并了兩個中間步驟,甚至似乎將導出操作置于導出中。 這是一個結構性錯誤。
有一個論點是,上面的代碼應該被編寫為三個函數,而不是兩個:
- 一種功能,用于管理臨時文件,然后調用...
- 下一個調用導出,然后上傳的函數
- 導出功能
這是一個很好的例子,說明在正確使用結構方面的一些額外精度將減少難于發現的錯誤將我們趕走的可能性。
翻譯自: https://www.javacodegeeks.com/2019/10/the-structural-bug.html
總結
- 上一篇: 苹果宣布 12 月 1 日开播《流人》电
- 下一篇: mule和activemq_Mule E