Je travaille sur une ancienne application Struts qui a une action abstraite pour créer des exports Excel en remplissant des fichiers de modèle Excel.Éviter la duplication de code sur les classes enfant d'une classe abstraite
Chaque action d'exportation Excel étend cette classe parente et ajoute sa propre implémentation pour remplir le modèle Excel et définit son propre modèle et son propre nom de fichier de sortie.
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;
}
...
}
Implémentations sont à la recherche comme celui-ci et c'est là la duplication de code est "mis en garde" par 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;
}
}
Toutes les idées comment éviter la duplication?
Vous pouvez créer une sorte de 'DefaultExcelAction' qui étend' ExcelExport' et implémente la fonctionnalité commune, alors que 'BudgetReportExcelAction' (et les autres classes enfants) étendent' DefaultExcelAction' au lieu de 'ExcelExport'. – domsson
Eh bien, je ne vois pas de duplication ici ... oui, vous devez passer outre un sur les méthodes, mais c'est le point de POO. – AxelH
SonarQube fait, mais comme indiqué dans d'autres commentaires c'est probablement une sorte de configuration paranoïaque ... – GreenTurtle