我的 Java (Spring) 應用程式中有以下 2 個方法(為簡潔起見省略了一些代碼),我想減少這些方法中的重復塊。此時,經過一番研究,有人提出了Builder Pattern,也有人提出了類似的Template Method。我也認為,我可以簡單地創建 2 個單獨的方法并將每個重復的代碼塊移動到這些方法中。
但是,我沒有這方面的經驗,我想請您首先遵循最正確的方法。那么,我應該如何減少以下兩種方法中的代碼重復?我也想使用繼承,但我真的對找到合適的方法感到困惑。
不是:為了簡潔起見,我省略了我的代碼并使用了一個簡單的代碼:
@Override
public MultipartFile exportAaaaa() throws IOException {
// repeated code block I
workbook = new XSSFWorkbook();
sheet = workbook.createSheet(TextBundleUtil.read(TITLE));
rowCount = new AtomicInteger(0);
//
// private block to this method
final Page<Aaaaa> page = aaaaaService.findAll());
// ...
// repeated code block II
outputFile = File.createTempFile(TextBundleUtil.read(TITLE), EXTENSION);
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
workbook.write(outputStream);
} catch (IOException e) {
LoggingUtils.error("Writing is failed ", e);
}
final FileInputStream input = new FileInputStream(outputFile);
final String fileName = TextBundleUtil.read(TITLE).concat(EXTENSION);
return new MockMultipartFile(fileName,
fileName, CONTENT_TYPE, IOUtils.toByteArray(input));
//
}
@Override
public MultipartFile exportBbbbb() throws IOException {
// repeated code block I
workbook = new XSSFWorkbook();
sheet = workbook.createSheet(TextBundleUtil.read(TITLE));
rowCount = new AtomicInteger(0);
//
// private block to this method
final Page<Bbbbb> page = bbbbbService.findBy Uuid(uuid));
// ...
// repeated code block II
outputFile = File.createTempFile(TextBundleUtil.read(TITLE), EXTENSION);
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
workbook.write(outputStream);
} catch (IOException e) {
LoggingUtils.error("Writing is failed ", e);
}
final FileInputStream input = new FileInputStream(outputFile);
final String fileName = TextBundleUtil.read(TITLE).concat(EXTENSION);
return new MockMultipartFile(fileName,
fileName, CONTENT_TYPE, IOUtils.toByteArray(input));
//
}
uj5u.com熱心網友回復:
我在這里看到,重復的代碼是日志記錄(或控制臺列印)。但是在這個例子中不清楚aService和bService 是做什么的?可能他們內部有不同的邏輯?正如我所見,他們回傳了不同的結果。但是如果A.class和B.class是一個介面的實作,而aService和bService也是一個介面的實作。這可能是一種方法。也許)
uj5u.com熱心網友回復:
如果aaaaaService和bbbbbService共享一個公共介面,例如
interface PageService<T> {
Page<T> findAll();
}
然后我們可以使用帶有型別引數的單個方法。
private <T> MultipartFile export(Service<T> service) throws IOException {
// repeated code block I
final Page<T> page = service.findAll());
// repeated code block II
}
我們可以將此方法宣告為public或保留之前的方法為覆寫方法,這取決于您是否希望客戶端處理/訪問底層服務以及您是否可以更改由 指示的介面或超類@Override。
public MultipartFile exportAaaaa() throws IOException {
// assuming that 'aaaaaService' is a class member
return export(aaaaaService);
}
如果沒有通用介面,我就簡單地提取通用代碼塊來分離方法。
private MultipartFile exportAaaaa() throws IOException {
prepareWorkbook(/* parameters */);
final Page<T> page = aaaaaService.findAll());
constructOutput(/* parameters */);
}
private /* return type */ prepareWorkbook(/* parameters */) {
// repeated code block I
}
private /* return type */ constructOutput(/* parameters */) {
// repeated code block II
}
uj5u.com熱心網友回復:
看起來您的代碼中的重復可以很容易地提取到單獨的方法中:
private void doCodeBlockI() {
// repeated code block I
workbook = new XSSFWorkbook();
sheet = workbook.createSheet(TextBundleUtil.read(TITLE));
rowCount = new AtomicInteger(0);
}
private MultipartFile doCodeBlockII() {
// repeated code block II
outputFile = File.createTempFile(TextBundleUtil.read(TITLE),
EXTENSION);
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
workbook.write(outputStream);
} catch (IOException e) {
LoggingUtils.error("Writing is failed ", e);
}
final FileInputStream input = new FileInputStream(outputFile);
final String fileName = TextBundleUtil.read(TITLE).concat(EXTENSION);
return new MockMultipartFile(fileName,
fileName, CONTENT_TYPE, IOUtils.toByteArray(input));
}
@Override
public MultipartFile exportAaaaa() throws IOException {
doCodeBlockI();
// private block to this method
final Page<Aaaaa> page = aaaaaService.findAll());
// ...
return doCodeBlockII();
}
@Override
public MultipartFile exportBbbbb() throws IOException {
doCodeBlockI();
// private block to this method
final Page<Bbbbb> page = bbbbbService.findAll());
// ...
return doCodeBlockII();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/325635.html
上一篇:C#如何正確編碼可重用類?
下一篇:自定義類不能強制轉換
