Modularidad, encapsulación y ocultamiento de información
Explica cómo diseñar módulos con responsabilidades, invariantes, datos y APIs públicas controladas mediante encapsulación y ocultamiento de información.
Última actualización
Actualizada
Nivel
Fundamentos
Un módulo no es solo una carpeta. Es una frontera que concentra una responsabilidad, protege decisiones internas y ofrece una superficie pública controlada.
La modularidad divide un sistema en unidades que pueden comprenderse y cambiarse con relativa independencia. Para que esa división sea real, cada módulo necesita:
Una responsabilidad clara.
Un modelo interno.
Reglas e invariantes propias.
Una API pública.
Dependencias permitidas.
Ownership de datos o acceso controlado.
La encapsulación controla cómo se accede a una unidad. El ocultamiento de información decide qué detalles deben permanecer internos porque son probables fuentes de cambio.
módulo
├── lenguaje y reglas internas
├── datos bajo ownership
├── API pública pequeña
└── detalles ocultos
otros módulos
→ colaboran mediante capacidades
→ no dependen de internals
La frontera correcta no busca esconder por esconder. Busca evitar que decisiones volátiles se conviertan en dependencias globales.
Orders recibe ConfirmOrder
→ verifica que el pedido sea confirmable
→ solicita Inventory.reserve
→ Inventory protege la invariante
→ devuelve reserva o rechazo de dominio
→ Orders cambia estado
→ se publica OrderConfirmed
Cada módulo mantiene su modelo. La colaboración ocurre mediante contratos explícitos.
En sistemas medianos o grandes suele ser útil organizar primero por dominio y aplicar capas dentro de cada módulo. Una estructura global por capas hace que un cambio de negocio atraviese carpetas lejanas y favorece servicios genéricos.
Una base compartida puede coexistir con módulos si:
Cada tabla tiene propietario.
Otros módulos no escriben directamente.
Permisos o convenciones se verifican.
Las consultas cruzadas usan proyecciones o contratos.
La separación física de bases es una táctica más fuerte, pero añade migraciones, consistencia eventual y operación. No es requisito para modularidad lógica.
Un dashboard puede necesitar datos de varios módulos. Usa una proyección de lectura o composición; no conviertas reporting en permiso para compartir escritura.
Tipos como Money pueden ser compartidos si su semántica es estable. Customer suele cambiar de significado entre contextos y no debería universalizarse.
Dirección de dependencias e inversión de control explica cómo conservar estos límites cuando los casos de uso necesitan bases de datos, proveedores y frameworks.