patrones
Patrón de comportamiento Visitor
Técnicas de Programación - Curso 2008/09
(Esther Guerra Sánchez)
Visitor
Propósito
Representa una operación a realizar sobre loselementos de una estructura de objetos
Permite definir una nueva operación sin cambiar
las clases de elementos sobre las que opera
Visitor
Motivación
Ej: Un compilador representa los programascomo árboles
de sintaxis abstracta, sobre los que ejecuta operaciones
Muchas operaciones necesitan diferenciar distintos tipos
de nodo en el árbol (expresiones, variables, etc.)
Node
typeCheck()generateCode()
prettyPrint()
Problemas:
difícil de comprender,
mantener y cambiar
nuevas operaciones
requerirán recompilar
todas las clases
VariableRefNode AssignmentNode
typeCheck()generateCode()
prettyPrint()
typeCheck()
generateCode()
prettyPrint()
Solución: independizar las
clases de las operaciones
que se ejecutan sobre ellas
Visitor
Motivación
Elementos sobrelos que se opera
Operaciones
Compiler
Node
visitVariableRefNode(VariableRefNode)
visitAssignmentNode(AssignmentNode)
accept(v:NodeVisitor)
VariableRefNode AssignmentNodeaccept(v:NodeVisitor)
accept(v:NodeVisitor)
v.visitVariableRefNode(this);
NodeVisitor
TypeCheckingVisitor
CodeGeneratorVisitor
visitVariableRefNode(VariableRefNode)visitVariableRefNode(VariableRefNode)
visitAssignmentNode(AssignmentNode) visitAssignmentNode(AssignmentNode)
v.visitAssignmentNode(this);
Visitor
Motivación
// creación de dos nodos del AST
Node n1 = newAssignmentNode(...);
Node n2 = new VariableRefNode(...);
// generar código para los dos nodos
NodeVisitor v = new CodeGeneratorVisitor();
n1.accept(v);
n2.accept(v);
Elementos sobre
los que seopera
Operaciones
Compiler
Node
visitVariableRefNode(VariableRefNode)
visitAssignmentNode(AssignmentNode)
accept(v:NodeVisitor)
VariableRefNode AssignmentNode
accept(v:NodeVisitor)...
Regístrate para leer el documento completo.