简体   繁体   English

避免在抽象类的子类上重复代码

[英]Avoid code duplication on child classes of an abstract class

I'm working on an old Struts application which has an abstract action to create Excel exports by filling Excel template files. 我正在使用一个旧的Struts应用程序,该应用程序具有通过填充Excel模板文件来创建Excel导出的抽象操作。

Each Excel export action extends this parent class and adds its own implementation for filling the Excel template and defines its own template and output filename. 每个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;
    }
...
}

Implementations are looking like this and this is where the code duplication is "warned" by SonarQube: 实现看起来像这样,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;
    }
}

Any ideas how to avoid the duplication? 任何想法如何避免重复?

我在这里看到的代码几乎没有任何代码重复,但是如果您真的想“从石头上榨水”,则可以向基类添加一个构造函数,该构造函数接受输入文件名和输出文件名,并且使每个派生类将其输入文件名和输出文件名传递给基类的构造函数。

A non-answer here: there is no "code duplication" in your examples. 这里没有答案:您的示例中没有“代码重复”。

The point is: your abstract class drives a certain "layout" for your child class; 问题的关键是:你的抽象类驱动器为您的孩子班级一定的“布局”; but that is the essence of using an abstract class. 但这是使用抽象类的本质

In other words: nothing to worry about here. 换句话说:这里没有什么可担心的。

You are following well known, "approved" patterns; 您正在遵循众所周知的“批准”模式; for example by nicely using the @Override annotation in your child class. 例如,在子类中很好地使用@Override批注。

All fine, have a nice day! 很好,祝您有美好的一天!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM