Interpreter Pattern – interpretarea și execuția expresiilor

  • Doru Bulubasa
  • 17 December 2025

În aplicațiile software apar frecvent situații în care trebuie să interpretăm un limbaj simplu, o expresie sau un set de reguli: filtre, formule matematice, reguli de validare, expresii de căutare sau chiar DSL-uri (Domain Specific Languages). Interpreter Pattern este un design pattern comportamental care oferă o soluție elegantă pentru astfel de scenarii.

În acest articol vom vedea ce este Interpreter Pattern, când se folosește, avantaje și limitări, precum și un exemplu clar în C# (.NET).


Ce este Interpreter Pattern?

Interpreter Pattern definește o reprezentare pentru gramatica unui limbaj și un mecanism care permite interpretarea expresiilor din acel limbaj. Fiecare regulă din gramatică este reprezentată printr-o clasă, iar evaluarea expresiei se face prin compunerea acestor obiecte.

Cu alte cuvinte, în loc să scrii un parser complex într-o singură clasă, împarți regulile limbajului în obiecte mici și reutilizabile.

📌 Ideea de bază:

“O expresie este un obiect care știe să se interpreteze singur.”

Când este util Interpreter Pattern?

Interpreter Pattern este potrivit atunci când:

  • Ai un limbaj simplu, cu reguli bine definite

  • Expresiile sunt relativ stabile, dar pot fi combinate

  • Ai nevoie de evaluare dinamică (la runtime)

  • Vrei să eviți if / else sau switch foarte complexe

  • Construiești un DSL pentru un domeniu specific

Exemple reale:

  • Expresii matematice (1 + 2 - 3)

  • Reguli de business (age > 18 AND country == "RO")

  • Filtre de căutare

  • Motoare de reguli

  • Expresii logice pentru permisiuni


Structura pattern-ului

Interpreter Pattern conține câteva elemente cheie:

  1. Expression (Abstract Expression) – interfața comună

  2. TerminalExpression – expresii finale (valori concrete)

  3. NonTerminalExpression – expresii compuse (operații)

  4. Context – informațiile necesare interpretării


Exemplu practic în C# (.NET)

Să implementăm un interpreter simplu pentru expresii matematice.

1️⃣ Interfața Expression

public interface IExpression
{
    int Interpret();
}


2️⃣ TerminalExpression – valori concrete

public class NumberExpression : IExpression
{
    private readonly int _number;

    public NumberExpression(int number)
    {
        _number = number;
    }

    public int Interpret()
    {
        return _number;
    }
}


3️⃣ NonTerminalExpression – operații

Adunare

public class AddExpression : IExpression
{
    private readonly IExpression _left;
    private readonly IExpression _right;

    public AddExpression(IExpression left, IExpression right)
    {
        _left = left;
        _right = right;
    }

    public int Interpret()
    {
        return _left.Interpret() + _right.Interpret();
    }
}

Scădere

public class SubtractExpression : IExpression
{
    private readonly IExpression _left;
    private readonly IExpression _right;

    public SubtractExpression(IExpression left, IExpression right)
    {
        _left = left;
        _right = right;
    }

    public int Interpret()
    {
        return _left.Interpret() - _right.Interpret();
    }
}


4️⃣ Utilizarea interpreterului

class Program
{
    static void Main()
    {
        // (5 + 3) - 2
        IExpression expression = new SubtractExpression(
            new AddExpression(
                new NumberExpression(5),
                new NumberExpression(3)
            ),
            new NumberExpression(2)
        );

        Console.WriteLine(expression.Interpret()); // Output: 6
    }
}

✔️ Fiecare expresie știe să se interpreteze

✔️ Compoziția este flexibilă

✔️ Codul este extensibil


Avantaje

✅ Cod clar și structurat

✅ Ușor de extins cu noi reguli

✅ Elimină logica complexă dintr-o singură clasă

✅ Se pot construi expresii dinamice la runtime


Dezavantaje

⚠️ Număr mare de clase pentru gramatici complexe

⚠️ Performanță mai slabă pentru expresii foarte mari

⚠️ Nu este potrivit pentru limbaje complexe (SQL, JSON etc.)

👉 Pentru cazuri avansate, parser-ele dedicate sunt o soluție mai bună.


Interpreter Pattern în .NET real

În ecosistemul .NET, pattern-ul apare implicit în:

  • Motoare de reguli

  • Framework-uri de validare

  • Sisteme de filtrare

  • Expresii LINQ (conceptual)

De multe ori îl folosești fără să-ți dai seama, sub forma unor expresii compuse.


Concluzie

Interpreter Pattern este o soluție elegantă pentru interpretarea expresiilor și regulilor într-un mod extensibil și clar. Nu este un pattern universal, dar atunci când este folosit corect, reduce complexitatea și crește lizibilitatea codului.

Scrie un comentariu

Adresa de mail nu va fi publicata. Campurile obligatorii sunt marcate cu *