Design Patterns — Parte 17 — Interpreter

Jones Roberto
Dec 24, 2019 · 4 min read

Intenção

O padrão de design do Interpreter avalia/interpreta as instruções escritas em uma gramática ou notações de idiomas. Esse padrão envolve a implementação de uma interface de expressão que informa para interpretar um contexto específico. Esse padrão é usado nos compiladores ou analisadores ou expansões de macro.

O padrão de comando é comumente usado nos sistemas de menus de muitos aplicativos, como Editor, IDE etc. Neste artigo, eu gostaria de compartilhar o que é padrão de intérprete e como ele funciona.

Problema

Uma classe de problemas ocorre repetidamente em um domínio bem definido e bem entendido. Se o domínio fosse caracterizado com uma “linguagem”, os problemas poderiam ser facilmente resolvidos com um “mecanismo” de interpretação.

Solução

O padrão Interpreter discute: definir uma linguagem de domínio (ou seja, caracterização do problema) como uma gramática simples, representando regras de domínio como sentenças de linguagem e interpretar essas sentenças para resolver o problema. O padrão usa uma classe para representar cada regra gramatical. E como as gramáticas geralmente têm uma estrutura hierárquica, uma hierarquia de herança de classes de regra é bem mapeada.

Uma classe base abstrata especifica o método interpret(). Cada subclasse concreta implementa interpret()aceitando (como argumento) o estado atual do fluxo do idioma e adicionando sua contribuição ao processo de solução de problemas.

Implementação

O diagrama de classes UML para a implementação do padrão de design Interpreta é apresentado abaixo:

Prós

  • Considerado em sua forma mais geral (isto é, uma operação distribuída por uma hierarquia de classes com base no padrão Composto), quase todo uso do padrão Composto também conterá o padrão Interpreter. Mas o padrão Interpreter deve ser reservado para os casos em que você deseja pensar nessa hierarquia de classes como definindo um idioma.

Contras

O padrão não aborda a análise. Quando a gramática é muito complexa, outras técnicas (como um state) são mais apropriadas.

Exemplo

Uso do padrão

O que é oque?

Client

Essa é a classe que cria a árvore de sintaxe abstrata para um conjunto de instruções na gramática especificada. Essa árvore é criada com a ajuda de instâncias das classes NonTerminalExpression e TerminalExpression.

Context

Esta é uma classe que contém informações (entrada e saída), que são usadas pelo intérprete.

Expression

Essa é uma interface que define a operação Interpretar, que deve ser implementada por cada subclasse.

NonTerminal

Esta é uma classe que implementa a expressão. Isso pode ter outras instâncias do Expression.

Terminal

Esta é uma classe que implementa a expressão.

Exemplo prático

Primeiramente iremos criar a classe Client, e ela irá conter o seguinte código:

public class Client
{
public void BuildAndInterpretCommands()
{
Context context = new Context("Dot Net context");
NonterminalExpression root = new NonterminalExpression
{
Expression1 = new TerminalExpression(),
Expression2 = new TerminalExpression()
};

Em seguida irei criar a Context, que irá conter o seguinte código:

public class Context
{
public string Name { get; set; }

em seguida irei criar a interface IExpression que será implementada pelos nossos interpretes, que irá conter o seguinte código:

public interface IExpression

Em seguida irei criar uma classe NonTerminal que irá implementar a nossa interface IExpression, quer irá conter o seguinte código:

public class NonterminalExpression : IExpression
{
public IExpression Expression1 { get; set; }

Agora iremos criar a classe TerminalExpression que irá conter o seguinte código:

public class TerminalExpression : IExpression
{
public void Interpret(Context context)
{
Console.WriteLine($"Terminal for {context.Name}.");
}
}

E por fim iremos mudar nossa classe Program.cs para chamar o Client, ela deverá ficar da seguinte maneira:

class Program
{
static void Main(string[] args)
{
Client client = new Client();
client.BuildAndInterpretCommands();

Esse padrão não é tão utilizando quanto os pois sua aplicabilidade não é tão vasta, espero que gostem do exemplo. Vou ficando por aqui até a próxima.


XP Inc.

Aqui você vai encontrar os principais conteúdos de tecnologia da XP Inc.

Jones Roberto

Written by

Gerente de Desenvolvimento na XP Inc. , jogador de vídeo game, viciado em séries e .Net.

XP Inc.

XP Inc.

Aqui você vai encontrar os principais conteúdos de tecnologia da XP Inc.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade