Ce este
Șablonul Interpreter evaluează propoziții dintr-un limbaj mic construind un arbore de obiecte-expresii — fiecare nod știe cum să se interpreteze pe sine. Numerele se interpretează ca ele însele; un nod de adunare își interpretează cele două părți și le adună.
Se potrivește limbajelor mici: filtre, formule, reguli simple. Limbajele reale merită unelte reale de analiză sintactică.
Exemplu: un calculator minuscul
Intrarea 3 + 4 - 2 devine un arbore de noduri Number, Add și Subtract. Un singur apel al interpret() pe rădăcină evaluează toată expresia.
Fiecare nod se interpretează pe sine
parse construiește arborele de la stânga la dreapta; interpret() îl parcurge. Suportul pentru * ar fi o singură clasă de nod nouă — cele existente rămân neatinse.
Ieșire: script PHP
<?php
// Fiecare nod știe cum să se interpreteze pe sine.
interface Expression {
public function interpret(): int;
}
class Number implements Expression {
public function __construct(private int $value) {}
public function interpret(): int {
return $this->value;
}
}
class Add implements Expression {
public function __construct(
private Expression $left,
private Expression $right,
) {}
public function interpret(): int {
return $this->left->interpret() + $this->right->interpret();
}
}
class Subtract implements Expression {
public function __construct(
private Expression $left,
private Expression $right,
) {}
public function interpret(): int {
return $this->left->interpret() - $this->right->interpret();
}
}
function parse(string $input): Expression {
$parts = explode(" ", $input);
$expr = new Number((int) $parts[0]);
for ($i = 1; $i < count($parts); $i += 2) {
$number = new Number((int) $parts[$i + 1]);
$expr = $parts[$i] === "+" ? new Add($expr, $number) : new Subtract($expr, $number);
}
return $expr;
}
$input = "3 + 4 - 2";
echo $input, " = ", parse($input)->interpret(), "\n";
Când să îl folosești
Folosește-l atunci când utilizatorii sau fișierele de configurare exprimă logică într-un limbaj mic proiectat de tine: filtre de căutare, formule de preț, reguli de validare.
Renunță la el când „limbajul” are trei opțiuni fixe (folosește un match) — sau când este un limbaj real (folosește un generator de parsere ori un motor existent).
Avantaje și dezavantaje
Avantaje: gramatica se transpune unu-la-unu în clase mici; operațiile noi sunt clase de nod noi; arborii de expresii pot fi construiți, verificați și reutilizați.
Dezavantaje: devine chinuitor odată ce gramatica crește; analiza sintactică tot trebuie scrisă; performanța este modestă în comparație cu logica compilată.