terça-feira, 13 de julho de 2010

Interpreter - (GoF - Comportamental)

O que é?
Este padrão é útil quando o objetivo é proporcionar um programa para um cliente ou um usuário a capacidade de especificar as operações em uma simples linguagem.

Mais adequado quando a gramática é simples, para evitar a necessidade de ter muitas classes correspondentes ao complexo conjunto de regras envolvidas.


Estrutura:












Problema:

Algumas tarefas ocorrem com tanta freqüência de formas diferentes que é interessante criar uma linguagem só para definir este tipo de problema.


Contexto:

Temos um conjunto de expressões aritméticas diferentes, submetidos a um programa de uma calculadora.
Embora cada expressão seja diferente (ex.: adição (+), subtração (-), divisão (/) ou multiplicação(x)), todos eles são construídos usando as regras básicas que compõem a gramática para a linguagem de expressões aritméticas.
Em tais casos, ao invés de tratar cada combinação distinta de regras como um caso separado, pode ser benéfico para o aplicativo ter a capacidade de interpretar uma combinação de regras genéricas.

O padrão interpreter pode ser usado para a criação desta capacidade, quando queremos um aplicativo para que outras aplicações e os usuários possam especificar as operações utilizando uma linguagem simples, definida por um conjunto de regras gramaticais.


Solução:

Vamos construir uma aplicação para uma calculadora que avalia uma expressão aritmética dada.
Para simplificar nosso exemplo vamos considerar somente adição(+), e subtração (-).
Agora vamos criar um algoritmo genérico.

Onde teremos as seguintes classes:

Class Adicao implements Calculadora { }
Onde haverá todas as regras para efetuarmos um adição.

Class Subtracao implements Calculadora { }
Onde haverá todas as regras para efetuarmos uma subtração.

Class Interpreter { }
Onde haverá todas as condições de qual classe será chamada quando o usuário digitar (+) ou (-) por exemplo.

Interface Calculadora { }
Onde vamos ter o método operação (stack );


Prós:

  • Encapsulamento.
    Separação de vários comportamentos em classes.

  • Limpa o código do cliente.

Contra:

  • Complexidade:
    Caso haver muitas validações em uma operação, o programa pode se tornar complexo.

  • Manutenção:
    Poderá ser difícil prestar manutenção para um sistema com uma extensa quantidade de classes para gerenciar todo um conjunto de regras envolvidas em uma operação.

  • Adicionar comportamento:
    Pois deveremos adicionar uma classe com um novo comportamento, e sempre adicioná-la na classe Interpreter.

Nenhum comentário:

Postar um comentário

DÚVIDAS - CRITICAS - SUGESTÕES