Pular para conteúdo

Modularização funcional

Manter a complexidade de um software sob controle é assunto recorrente no desenvolvimento de novos produtos e na sustentação de aplicações existentes. Arquiteturas referenciais como DDD, Clean Architecture propõe, cada um à sua maneira, soluções para a criação de softwares complexos e escalonáveis. Entretanto, a utilização direta dos conceitos e estruturas preconizadas por estas arquiteturas, entretanto, pode conduzir ao mesmo resultado de mistura indiscriminada de aspectos funcionais, não funcionais e estruturais, tornando difícil a manutenção e evolução de longo prazo do software como um todo.

A contribuição pretendida aqui é a de utilização destas arquiteturas na proposição de uma organização que atenda à complexidade, mas que permaneça inteligível para desenvolvedores e demais trabalhadores em software. Para esta contribuição algumas premissas estão consideradas:

  • Módulos devem ser inteligíveis.
  • Uma aplicação pode depender de vários módulos.
  • Um sistema depende de uma ou mais aplicações, mas não depende de um módulo diretamente.
  • Um ou mais operações e características de um módulo que dependam de Bancos de dados, Caches, Mensageria, Containers devem ser configuráveis e desligáveis.
  • Devops gerenciam configurações de aplicações e sistemas.
  • Configurações, código fonte, documentação técnica, documentação de requisitos, evidências de testes devem permanecer acessíveis e de preferência no mesmo SCM.
  • Cada módulo deve ter um manual técnico.

Heurística para a construção de um módulo funcional

  • Exposição de serviços, configurações e estruturas de dados suficientes para as operações do módulo
  • Exposição das telas de usuário, se houverem
  • Unificação interna das operações realizadas através de telas de usuário ou via serviços (API)
  • Exposição de Mensagens e códigos de erros úteis
  • Documentação operacional mínima
  • Documentação mínima para desenvolvedores
  • Guias de codificação padronizada entre módulos diferentes
  • Dependência direta apenas de componentes, serviços ou de outros módulos não funcionais
  • Interligação com outros módulos feitas a partir das API expostas seguindo as regras acima
  • Configurações de build e depuração

Runtime - Funcionalidade entregue ao sistema pelo módulo

  • É o módulo ou sub-módulo que deve desempenhar os papéis funcionais esperados para este módulo.
  • Entidades, serviços, configurações e validações devem ser desenhados e codificados levando em consideração apenas aspectos da execução das operações.
  • Deve oferecer versionamento das estruturas de dados e operações quando isso for aplicável.
  • Deve oferecer serviços e estruturas de dados que permitam extrações simples das informações derivadas dos dados processados pelos próprio módulo.
  • Deve evitar extrações analíticas se este não for o propósito do módulo

Administração - Gestão completa de configurações e Entidades do Domínio

  • Deve utilizar o runtime para operações coincidentes
  • Pode conter entidades, serviços, configurações e validações não disponíveis no módulo de runtime.
  • Deve ter um público alvo (operações e usuários) menor que o módulo ou submódulo de runtime.
  • Deve ser o lugar preferencial para extrações e análises mais complexas, preservando o runtime de sobrecarga nos serviços e estruturas de dados.

Hosts - Agrupamento dos módulos

  • Container, Servidores Http ou Host de serviços são os exemplos mais comuns.
  • Um host tem capacidade de iniciar uma aplicação quando a própria aplicação não é executável pelo Sistema Operacional.
  • Inicia e interrompe a execução dos aplicativos de um sistema através de interface e configurações bem conhecidas.
  • Suas características de funcionamento devem ser levadas em consideração no projeto da aplicação que será hospedada.