2017-05-03 120 views
2

我正在处理一个旧的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; 
    } 
} 

任何想法如何避免重复?

+0

您可以创建某种'DefaultExcelAction'来扩展'ExcelExport'并实现常用功能,然后让'BudgetReportExcelAction'(和其他子类)扩展'DefaultExcelAction'而不是'ExcelExport'。 – domsson

+1

嗯,我在这里没有看到任何重复...是的,你必须重写over方法,但这是OOP的要点。 – AxelH

+0

SonarQube可以,但正如其他评论所述,这可能是一种偏执的配置... – GreenTurtle

回答

4

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

+0

我不能采取构造函数的方式,因为这些是Struts的行为,据我所知他们需要有一个空的构造函数。 – GreenTurtle

+1

那么,你坚持调用覆盖。我不认为这是一个大问题。我们倾向于从几条不平凡的线以及以上开始讨论代码重复。如果实际上就像你用struts所说的那样,那么对我来说,这将是永远不会使用struts的理由,并且不适合需要使用struts的任何人工作。 –

+0

你打我一分钟;但你得到我的upvote ;-) – GhostCat

2

这里没有答案:您的示例中没有“代码重复”。

重点是:您的抽象类驱动器您的孩子班级有一定的“布局”;但这是使用抽象类的本质

换句话说:这里没什么好担心的。

您正在关注众所周知的“已批准”模式;例如在您的子类中使用@Override注释。

一切都好,祝你有美好的一天!

+0

好吧,这只是关于SonarQube它告诉我有重复的代码遍布。这次必须忽略它,我想...... Thx! – GreenTurtle

+0

有人将您的SonarQube配置为关于代码重复的偏执。 –

+0

C - :=照顾。 –