El patrón Strategy encapsula algoritmos intercambiables en clases separadas.
1. El Problema de Partida
generateMetadata en KnowledgePostPage construye JSON-LD distinto según el type del post: TechArticle para posts handbook, HowTo para posts example con pasos, y WebPage genérico para categorías. Un único if/else con 3 ramas creciendo por cada nuevo tipo de contenido acabaría siendo inmanejable.
2. La Solución Strategy
// src/lib/seo/JsonLdStrategy.js
class TechArticleStrategy {
build(post) {
return { '@type': 'TechArticle', headline: post.meta.title, datePublished: post.meta.date };
}
}
class HowToStrategy {
build(post) {
return { '@type': 'HowTo', name: post.meta.title, step: post.meta.steps ?? [] };
}
}
class WebPageStrategy {
build(post) {
return { '@type': 'WebPage', name: post.meta.title };
}
}
export const jsonLdStrategies = {
handbook: new TechArticleStrategy(),
example: new HowToStrategy(),
category: new WebPageStrategy(),
};3. Uso en el contexto (la página)
// app/knowledge/[...slug]/page.jsx
import { jsonLdStrategies } from '@/lib/seo/JsonLdStrategy';
function buildJsonLd(post) {
const strategy = jsonLdStrategies[post.meta.type] ?? jsonLdStrategies.category;
return { '@context': 'https://schema.org', ...strategy.build(post) };
}4. Ventajas
- Añadir un tipo nuevo (ej.
video) = crear una clase más y registrarla, sin tocarbuildJsonLd. - Cada estrategia se testea aislada, sin necesidad de montar la página completa.
- Sin
if/elsecreciente: el objetojsonLdStrategiesreemplaza cualquier cadena de condicionales.