Introducció
El patró de disseny Interpreter és un patró de comportament que proporciona una manera d'avaluar sentències en un llenguatge. Aquest patró és útil quan es necessita interpretar expressions en un llenguatge específic, com ara expressions matemàtiques, expressions lògiques o fins i tot llenguatges de programació petits.
Objectius del Mòdul
- Entendre el concepte i la motivació darrere del patró Interpreter.
- Aprendre a implementar el patró Interpreter.
- Veure exemples pràctics d'ús del patró Interpreter.
- Realitzar exercicis pràctics per reforçar els conceptes apresos.
Conceptes Clau
- Context: Manté la informació global que és compartida per les expressions.
- Expressió Abstracta: Declara una interfície per interpretar el context.
- Expressió Terminal: Implementa una operació d'interpretació associada a símbols terminals en la gramàtica.
- Expressió No Terminal: Implementa una operació d'interpretació associada a símbols no terminals en la gramàtica.
Implementació del Patró Interpreter
Diagrama UML
Components
- Context: Manté informació que és global per a totes les expressions.
- AbstractExpression: Declara una interfície per interpretar el context.
- TerminalExpression: Implementa una operació d'interpretació associada a símbols terminals en la gramàtica.
- NonTerminalExpression: Implementa una operació d'interpretació associada a símbols no terminals en la gramàtica.
Exemple Pràctic
Suposem que volem interpretar expressions matemàtiques simples com "3 + 5 - 2".
Pas 1: Definir la Interfície d'Expressió
Pas 2: Implementar Expressions Terminals
class Number implements Expression { private int number; public Number(int number) { this.number = number; } @Override public int interpret() { return this.number; } }
Pas 3: Implementar Expressions No Terminals
class Add implements Expression { private Expression leftExpression; private Expression rightExpression; public Add(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret() { return leftExpression.interpret() + rightExpression.interpret(); } } class Subtract implements Expression { private Expression leftExpression; private Expression rightExpression; public Subtract(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret() { return leftExpression.interpret() - rightExpression.interpret(); } }
Pas 4: Utilitzar el Patró Interpreter
public class InterpreterDemo { public static void main(String[] args) { Expression expression = new Subtract( new Add(new Number(3), new Number(5)), new Number(2) ); int result = expression.interpret(); System.out.println("Resultat: " + result); // Resultat: 6 } }
Exercicis Pràctics
Exercici 1: Implementar Multiplicació i Divisió
Implementa les classes Multiply
i Divide
per afegir funcionalitat de multiplicació i divisió a l'exemple anterior.
Solució
class Multiply implements Expression { private Expression leftExpression; private Expression rightExpression; public Multiply(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret() { return leftExpression.interpret() * rightExpression.interpret(); } } class Divide implements Expression { private Expression leftExpression; private Expression rightExpression; public Divide(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret() { return leftExpression.interpret() / rightExpression.interpret(); } }
Exercici 2: Crear una Expressió Complexa
Utilitza les classes Add
, Subtract
, Multiply
, i Divide
per crear i interpretar l'expressió (3 + 5) * (10 / 2)
.
Solució
public class InterpreterComplexDemo { public static void main(String[] args) { Expression expression = new Multiply( new Add(new Number(3), new Number(5)), new Divide(new Number(10), new Number(2)) ); int result = expression.interpret(); System.out.println("Resultat: " + result); // Resultat: 40 } }
Errors Comuns i Consells
-
Error Comú: No gestionar correctament les divisions per zero.
- Consell: Assegura't de validar les entrades abans de realitzar operacions de divisió.
-
Error Comú: No seguir una estructura clara per a les expressions terminals i no terminals.
- Consell: Mantén una clara separació entre les classes que representen expressions terminals i no terminals.
Resum
En aquest mòdul, hem après sobre el patró de disseny Interpreter, la seva motivació i com implementar-lo. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. Aquest patró és especialment útil per interpretar llenguatges específics i expressions complexes de manera estructurada i reutilitzable.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Disseny en Desenvolupament Àgil