2017-05-03 1 views
2

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?

+0

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

+1

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

+0

SonarQube fait, mais comme indiqué dans d'autres commentaires c'est probablement une sorte de configuration paranoïaque ... – GreenTurtle

Répondre

4

Il y a que je vois ici à peine une duplication de code dans le code, mais si vous voulez vraiment « presser l'eau d'une pierre », vous pouvez ajouter un constructeur à la classe de base, qui accepte l'entrée-nom de fichier et de sortie -filename, et fait passer chaque classe dérivée son nom de fichier d'entrée et son nom de fichier de sortie au constructeur de la classe de base.

+0

Je ne peux pas prendre le chemin du constructeur ici parce que ce sont des actions Struts et autant que je sache, ils doivent avoir un constructeur vide. – GreenTurtle

+1

Eh bien, vous êtes bloqué avec l'invocation des overridables. Je ne pense pas que ce soit un gros problème. Nous avons tendance à parler de duplication de code à partir de plusieurs lignes non triviales et plus. Si c'est en fait comme vous le dites avec des entretoises, alors pour moi, ce serait une raison suffisante pour ne jamais utiliser des entretoises et ne pas travailler pour quiconque a besoin de travailler avec des entretoises. –

+0

Vous m'avez battu d'une minute; mais vous obtenez mon upvote ;-) – GhostCat

2

Une non-réponse ici: il n'y a pas de "duplication de code" dans vos exemples.

Le point est: votre classe abstraite entraîne une certaine "disposition" pour votre classe enfant; mais c'est l'essence d'utiliser une classe abstraite. En d'autres termes, il n'y a rien à craindre ici.

Vous suivez des modèles «approuvés» bien connus; par exemple en utilisant joliment l'annotation @Override dans votre classe enfant.

Tout va bien, passez une bonne journée!

+0

Ok, c'est à peu près ça SonarQube qui me dit qu'il y a du code dupliqué partout. Je dois l'ignorer cette fois, je pense ... Thx! – GreenTurtle

+0

Quelqu'un a configuré votre SonarQube pour être paranoïaque à propos de la duplication de code. –

+0

C -: = pris en charge. –