Bonjour à tous,
Je me tourne vers vous parce que j'ai un problème d'architecture auquel je ne parviens pas à trouver une solution. D'ailleurs, le problème est un peu complexe à décrire, je vais tenter d'être le plus clair possible.
Dans une bibliothèque, j'ai une classe abstraite que je dois étendre. Cette classe est nommée ASTVisitor
, dispose pas moins de 1025 lignes de code et tout son contenu ne fait que déclarer des méthodes. Ces méthodes sont non abstraites mais je dois en étendre la quasi totalité. Comme vous l'avez peut-être deviné avec son nom, cette classe déclare toutes les méthodes pour visiter un noeud et pour sortir de ce noeud. La classe se représente donc sous la forme suivante :
1 2 3 4 5 6 7 8 9 10 | public abstract class ASTVisitor { public void endVisit(AllocationExpression allocationExpression, BlockScope scope) { } public boolean visit(AllocationExpression allocationExpression, BlockScope scope) { return true; } // Beaucoup d'autres méthodes du même genre pour chaque noeud. } |
Pour chaque noeud de la bibliothèque, il existe une méthode traverse
qui va, comme son nom l'indique, traverser tous les attributs traversable du noeud courant. Un exemple typique de méthode traverse
est le suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class TryStatement { public void traverse(ASTVisitor visitor, BlockScope blockScope) { if(visitor.visit(this, blockScope)) { LocalDeclaration[] localDeclarations = this.resources; int i = 0; int max; for(max = localDeclarations.length; i < max; ++i) { localDeclarations[i].traverse(visitor, this.scope); } this.tryBlock.traverse(visitor, this.scope); if(this.catchArguments != null) { i = 0; for(max = this.catchBlocks.length; i < max; ++i) { this.catchArguments[i].traverse(visitor, this.scope); this.catchBlocks[i].traverse(visitor, this.scope); } } if(this.finallyBlock != null) { this.finallyBlock.traverse(visitor, this.scope); } } visitor.endVisit(this, blockScope); } } |
Comme vous pouvez le remarquer, une méthode traverse
prend en paramètre un ASTVisitor
et un scope. Dans la mesure où le contexte à de l'importance et que je n'ai pas la main sur ces méthodes, cela semble m'obliger à conserver une seule et unique classe qui regroupe l'implémentation voulue pour toutes les méthodes de la classe ASTVisitor
. Le problème se situe sur ce point précis.
Aujourd'hui, ma classe qui étend ASTVisitor
fait pas moins de 2666 lignes. J'aimerais donc pouvoir découper ma classe pour regrouper les méthodes "similaires" dans des classes distinctes. Par exemple, regrouper toutes les méthodes d'éléments structurants (comme les classes, les méthodes, les champs, etc.). J'ai beau réfléchir au problème, je n'ai pas la moindre idée de comment je pourrais m'y prendre.
Je me tourne donc vers vous pour savoir si vous avez des idées à me proposer. N'hésitez pas, tout est bon à prendre pour m'aider à faire avancer mes réflexions.
Merci d'avance pour votre aide.