结构性错误
團(tuán)隊成員在使用以下代碼時遇到了麻煩:
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); } }上面的代碼經(jīng)過精簡和簡化,使您對問題有所了解。 我們有一個數(shù)據(jù)庫,一個要寫入的臨時臨時文件和一個上載過程。
問題是上upload呼叫無法正常工作。 真令人沮喪!
老鷹眼的讀者可能會發(fā)現(xiàn),在進(jìn)行上upload調(diào)用時,由第二個函數(shù)內(nèi)的OutputStream寫入的臨時文件尚未關(guān)閉。 那是個錯誤,解決方法是將調(diào)用upload到try-with-resources塊之外,該塊的工作是關(guān)閉流,從而釋放文件(至少在Windows上,您不能讀取您也在寫的文件!)。
錯誤不是那樣!
這是一個很難發(fā)現(xiàn)的錯誤,是結(jié)構(gòu)決策的結(jié)果。 上載調(diào)用屬于導(dǎo)出操作之外的原因不僅是為了確保流關(guān)閉,還因為它是整個過程的另一個階段。 該過程應(yīng)該是:
- 創(chuàng)建臨時位置
- 導(dǎo)出到臨時位置
- 清理臨時位置
這里的縮進(jìn)反映了作用域。
上面的實現(xiàn)合并了兩個中間步驟,甚至似乎將導(dǎo)出操作置于導(dǎo)出中。 這是一個結(jié)構(gòu)性錯誤。
有一個論點是,上面的代碼應(yīng)該被編寫為三個函數(shù),而不是兩個:
- 一種功能,用于管理臨時文件,然后調(diào)用...
- 下一個調(diào)用導(dǎo)出,然后上傳的函數(shù)
- 導(dǎo)出功能
這是一個很好的例子,說明在正確使用結(jié)構(gòu)方面的一些額外精度將減少難于發(fā)現(xiàn)的錯誤將我們趕走的可能性。
翻譯自: https://www.javacodegeeks.com/2019/10/the-structural-bug.html
總結(jié)
- 上一篇: 苹果宣布 12 月 1 日开播《流人》电
- 下一篇: 微软 GitHub AI 代码助手 Co