6.1 Decomposição

Apesar da variedade de critérios, a principal tarefa no desenvolvimento de grandes sistemas é reduzir a complexidade do sistema . Para reduzir a complexidade, nada além da divisão em partes foi inventado.

Às vezes, para simplificar, isso é chamado de princípio de "dividir e conquistar", mas, do ponto de vista do arquiteto de software, estamos falando de decomposição hierárquica .

Um sistema complexo deve ser construído a partir de um pequeno número de subsistemas mais simples, cada um dos quais, por sua vez, é construído a partir de partes menores, e assim por diante, até que as partes menores sejam simples o suficiente para serem compreendidas e criadas diretamente.

Decomposição

A grande notícia é que esta solução não é apenas a única conhecida, mas também universal. Além de reduzir a complexidade, fornece flexibilidade de sistema , boa escalabilidade e maior resiliência ao duplicar partes críticas.

Assim, quando se trata de construir a arquitetura do programa, criar sua estrutura, isso significa decompor o programa em subsistemas, serviços, camadas, sub-rotinas e módulos funcionais e organizar sua interação entre si e com o mundo externo.

E o mais valioso aqui é o seguinte: quanto mais independentes os subsistemas, mais seguro é focar no desenvolvimento de cada um deles separadamente em um determinado momento e não se preocupar com todas as outras partes.

6.2 Benefícios da arquitetura modular

Usar o princípio da decomposição hierárquica permite que você se livre do caos em milhares de classes do seu código. Lembra que seu código é dividido em pacotes (pacote) e subpacotes? Esta é uma das expressões para a decomposição hierárquica.

Seu programa passa de um monte de classes para um conjunto de bibliotecas e módulos que interagem entre si de acordo com regras bem definidas e simples. Isso, por sua vez, permite controlar sua complexidade e também oferece a oportunidade de obter todos os benefícios que geralmente estão associados ao conceito de uma boa arquitetura.

Aqui estão os mais básicos:

  • Escalabilidade - a capacidade de expandir o sistema e aumentar seu desempenho adicionando novos módulos.
  • Manutenibilidade - a alteração de um módulo não requer a alteração de outros módulos.
  • Possibilidade de troca de módulos (Swappability) - o módulo pode ser facilmente substituído por outro.
  • Teste de Unidade – Uma unidade pode ser separada de todas as outras e testada/consertada .
  • Reutilização - o módulo pode ser reutilizado em outros programas e outros ambientes.
  • Manutenção - um programa dividido em módulos é mais fácil de entender e manter.

Pode-se dizer que quebrar um problema complexo em fragmentos simples é o objetivo de todas as técnicas de projeto . E o termo “arquitetura” na maioria dos casos refere-se simplesmente ao resultado de tal divisão mais “algumas decisões de projeto que, uma vez adotadas, são difíceis de mudar” (Martin Fowler “Architecture of Enterprise Software Applications”).

Portanto, a maioria das definições de uma forma ou de outra se resume ao seguinte:

" A arquitetura identifica os principais componentes do sistema e como eles interagem. É também a escolha de tais decisões que são interpretadas como fundamentais e não sujeitas a mudanças no futuro ."

" Arquitetura é a organização de um sistema, incorporada em seus componentes, suas relações entre si e com o ambiente. Um sistema é um conjunto de componentes combinados para realizar uma função específica ."

Assim, uma boa arquitetura é, antes de tudo, uma arquitetura modular/bloco . Para obter uma boa arquitetura, você precisa saber como decompor o sistema corretamente. Isso significa que é necessário entender qual decomposição é considerada “correta” e como é melhor realizá-la.