我正在处理一个旧的Struts应用程序,该应用程序具有通过填充Excel模板文件来创建Excel导出的抽象操作。避免抽象类的子类上的代码重复
每个Excel导出操作扩展了这个父类,并添加了自己的实现来填充Excel模板并定义自己的模板和输出文件名。
public abstract class ExcelExportAction extends BaseAction {
protected abstract String getInputFilename();
protected abstract String getOutputFilename();
protected abstract HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request);
@Override
protected final ActionForward run(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
Workbook workbook = new Workbook(getInputFilename());
workbook = modifyWorkbook(workbook, request);
addWorkBookToResponse(workbook, getOutputFilename());
return null;
}
...
}
实现正在寻找这样的,这是在重复代码的“警告”,由SonarQube:
public class BudgetReportExcelAction extends ExcelExportAction {
private static final String INPUT_FILENAME = "Report-Budget-Template.xls";
private static final String OUTPUT_FILENAME = "Report-Customerbudget.xls";
@Override
protected String getInputFilename() {
return INPUT_FILENAME;
}
@Override
protected String getOutputFilename() {
return OUTPUT_FILENAME;
}
@Override
protected HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request) {
/* modify the workbook */
return workbook;
}
}
任何想法如何避免重复?
您可以创建某种'DefaultExcelAction'来扩展'ExcelExport'并实现常用功能,然后让'BudgetReportExcelAction'(和其他子类)扩展'DefaultExcelAction'而不是'ExcelExport'。 – domsson
嗯,我在这里没有看到任何重复...是的,你必须重写over方法,但这是OOP的要点。 – AxelH
SonarQube可以,但正如其他评论所述,这可能是一种偏执的配置... – GreenTurtle