Tenemos una aplicación web donde tenemos muchos (> 50) pequeños componentes web que interactúan entre sí.
Para mantener todo desacoplado, tenemos como regla que ningún componente puede hacer referencia directa a otro. En cambio, los componentes activan eventos que luego se conectan (en la aplicación "principal") para llamar a los métodos de otro componente.
A medida que pasó el tiempo, más y más componentes se agregaron y el archivo de la aplicación "principal" se llenó de fragmentos de código que se ven así:
buttonsToolbar.addEventListener('request-toggle-contact-form-modal', () => {
contactForm.toggle()
})
buttonsToolbar.addEventListener('request-toggle-bug-reporter-modal', () => {
bugReporter.toggle()
})
// ... etc
Para mejorar esto, agrupamos una funcionalidad similar, en una Class, asígnele un nombre relevante, pase los elementos participantes al crear instancias y maneje el "cableado" dentro de Class, de la siguiente manera:
class Contact {
constructor(contactForm, bugReporter, buttonsToolbar) {
this.contactForm = contactForm
this.bugReporterForm = bugReporterForm
this.buttonsToolbar = buttonsToolbar
this.buttonsToolbar
.addEventListener('request-toggle-contact-form-modal', () => {
this.toggleContactForm()
})
this.buttonsToolbar
.addEventListener('request-toggle-bug-reporter-modal', () => {
this.toggleBugReporterForm()
})
}
toggleContactForm() {
this.contactForm.toggle()
}
toggleBugReporterForm() {
this.bugReporterForm.toggle()
}
}
e instanciamos así:
<html>
<contact-form></contact-form>
<bug-reporter></bug-reporter>
<script>
const contact = new Contact(
document.querySelector('contact-form'),
document.querySelector('bug-form')
)
</script>
</html>
Estoy realmente cansado de introducir patrones propios, especialmente los que no son realmente OOP-y ya que los estoy usando Classescomo simples contenedores de inicialización, por falta de una palabra mejor.
¿Existe un patrón definido mejor / más conocido para manejar este tipo de tareas que me falta?