El patrón Interpreter evalúa un mini-lenguaje propio mediante un árbol de expresiones.
1. El Problema de Partida
El buscador avanzado de knowledge debe soportar consultas como category:design-patterns AND type:example para filtrar posts sin cargar una librería de búsqueda completa. Parsear esto con expresiones regulares anidadas y if/else se vuelve ilegible en cuanto se añade OR o NOT.
2. La Solución Interpreter
// src/lib/search/QueryInterpreter.js
class FieldExpression {
constructor(field, value) { this.field = field; this.value = value; }
interpret(post) { return post.meta[this.field] === this.value; }
}
class AndExpression {
constructor(left, right) { this.left = left; this.right = right; }
interpret(post) { return this.left.interpret(post) && this.right.interpret(post); }
}
// Parser mínimo: "category:X AND type:Y"
export function parseQuery(query) {
const parts = query.split(' AND ').map((part) => {
const [field, value] = part.split(':');
return new FieldExpression(field.trim(), value.trim());
});
return parts.reduce((acc, expr) => (acc ? new AndExpression(acc, expr) : expr), null);
}3. Uso en el sidebar
// src/components/knowledge/KnowledgeSidebar.jsx
import { parseQuery } from '@/lib/search/QueryInterpreter';
const expr = parseQuery('category:design-patterns AND type:example');
const results = posts.filter((post) => expr.interpret(post));4. Ventajas
- Cada regla (
category:X,AND) es una clase pequeña y testeable, sin regex complejas. - Extensible: añadir
ORoNOTes una clase de expresión más, sin tocar el parser existente en profundidad. - Legible: el árbol de expresiones refleja exactamente la estructura lógica de la consulta.