6.1 Descomposición

A pesar de la variedad de criterios, la principal tarea en el desarrollo de grandes sistemas es la tarea de reducir la complejidad del sistema . Para reducir la complejidad, todavía no se ha inventado nada más que la división en partes.

A veces, por simplicidad, esto se llama el principio de "divide y vencerás", pero, desde el punto de vista del arquitecto de software, estamos hablando de descomposición jerárquica .

Un sistema complejo debe construirse a partir de un pequeño número de subsistemas más simples, cada uno de los cuales, a su vez, se construye a partir de partes más pequeñas, y así sucesivamente hasta que las partes más pequeñas sean lo suficientemente simples como para ser entendidas y creadas directamente.

Descomposición

La buena noticia es que esta solución no solo es la única conocida, sino también universal. Además de reducir la complejidad, proporciona simultáneamente flexibilidad del sistema , buena escalabilidad y mayor resiliencia mediante la duplicación de partes críticas.

En consecuencia, cuando se trata de construir la arquitectura del programa, crear su estructura, esto significa descomponer el programa en subsistemas, servicios, capas, subrutinas y módulos funcionales y organizar su interacción entre ellos y con el mundo exterior.

Y lo más valioso aquí es esto: cuanto más independientes sean los subsistemas, más seguro es centrarse en el desarrollo de cada uno de ellos por separado en un momento determinado y no preocuparse por todas las demás partes.

6.2 Beneficios de la arquitectura modular

El uso del principio de descomposición jerárquica le permite deshacerse del caos en miles de clases de su código. ¿Recuerda que su código se divide en paquetes (paquete) y subpaquetes? Esta es una de las expresiones para la descomposición jerárquica.

Su programa pasa de ser un conjunto de clases a un conjunto de bibliotecas y módulos que interactúan entre sí de acuerdo con reglas simples y bien definidas. Esto, a su vez, le permite controlar su complejidad y también le brinda la oportunidad de obtener todos los beneficios que generalmente se asocian con el concepto de una buena arquitectura.

Aquí están los más básicos:

  • Escalabilidad : la capacidad de expandir el sistema y aumentar su rendimiento agregando nuevos módulos.
  • Mantenibilidad : cambiar un módulo no requiere cambiar otros módulos.
  • Capacidad de intercambio de módulos (Swappability): el módulo se puede reemplazar fácilmente por otro.
  • Prueba de unidad: una unidad puede separarse de todas las demás y probarse/repararse .
  • Reutilización : el módulo se puede reutilizar en otros programas y otros entornos.
  • Mantenimiento - un programa que se divide en módulos es más fácil de entender y mantener.

Se puede decir que romper un problema complejo en fragmentos simples es el objetivo de todas las técnicas de diseño . Y el término “arquitectura” en la mayoría de los casos simplemente se refiere al resultado de tal división más “algunas decisiones de diseño que, una vez adoptadas, son difíciles de cambiar” (Martin Fowler “Arquitectura de aplicaciones de software empresarial”).

Por lo tanto, la mayoría de las definiciones de una forma u otra se reducen a lo siguiente:

" La arquitectura identifica los componentes principales del sistema y cómo interactúan. También es la elección de tales decisiones que se interpretan como fundamentales y no sujetas a cambios en el futuro ".

La arquitectura es la organización de un sistema, plasmada en sus componentes, su relación entre sí y con el entorno. Un sistema es un conjunto de componentes combinados para realizar una función específica ”.

Así, una buena arquitectura es, ante todo, una arquitectura modular/de bloques . Para obtener una buena arquitectura, es necesario saber cómo descomponer correctamente el sistema. Esto significa que es necesario entender qué descomposición se considera “correcta” y cómo es mejor llevarla a cabo.