Teoria | Documentando arquitetura de software com C4 Model + Plant UML
Tags: diagram, c4model, plantuml, braziliandevs
Published: 2023-12-28 21:45:07

| Prefácio      |
| ------------- |
| Nesse artigo, teremos contextos e explicações dos temas: Modelagem de arquitetura, C4 Model e Plant UML. |

> Premissa: A modelagem de arquitetura de software é um processo de concepção de sistemas em geral, envolve a criação de representações abstratas de um sistema ou aplicativo para compreender, comunicar e projetar sua estrutura e funcionamento. Facilitando assim, a comunicação entre partes interessadas como desenvolvedores, gestão e partes não técnicas. Além de contribuir para a qualidade e manutenibilidade dos sistemas de software.

## C4 Model

O C4 Model é uma alternativa na construção de modelagem de arquitetura (advinda da UML), desenvolvido por [Simon Brown](https://simonbrown.je/).
Onde descreve em um conjunto de abstrações a arquitetura de software de um sistema de forma clara e eficaz, visando simplificar a comunicação e documentação.

> Nota: UML (do inglês Unified Modeling Language) é a linguagem visual de modelagem que inclui diversos tipos de diagramas, como os de classe e de sequência, além de conter três tipos de pastas lógicas: diagramas, modelos e perfis. [Mais detalhes](https://www.ibm.com/docs/pt-br/rational-soft-arch/9.5?topic=diagrams-uml-models)

O C4 Model oferece uma estrutura hierárquica para representar a arquitetura de software em quatro níveis de abstração, cada nível fornece uma visão diferente do sistema, desde uma visão de alto nível até uma visão detalhada do código-fonte, da camada externa para interna, são eles: Context, Containers, Components e Code.

![Representação gráfica de cada camada do modelo C4 Model](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hmckpzkt0earomc83qjw.png)
> Nota: Observe na imagem onde se é contornado o objeto, para assim, seguir o "zoom" do próximo nível. 

### Nível 1: Context (Contexto)
A camada macro da modelagem se caracteriza pela visão do projeto de um nível mais alto e descreve o sistema como um todo. Mostra o sistemas e seus principais componentes externos e como se interagem.
<!-- Ex.: O sistema em si identificado, cliente, serviços externos dependentes, onde será processado todas as requisições.  -->

### Nível 2: Containers (Contêineres)
No nível de Containers, o foco está na estrutura interna, detalhando os principais subsistemas do sistema e como eles se comunicam entre si. Isso ajuda a identificar as partes fundamentais e suas interações.
<!-- Ex.: Banco de dados, Sistema XPTO e ABCD, Aplicação Web, Serviço de Fila.  -->

### Nível 3: Components (Componentes)
Entrando mais no detalhe do Container, temos a estrutura interna que identificamos como Components, são as partes funcionais do sistema que executam tarefas específicas e podem ser implementadas usando tecnologias específicas. Essa etapa fornece insights sobre a estrutura interna do sistema e como os componentes estão organizados e se relacionam uns com os outros. 
<!-- Ex.: Especificação de um container, Front-end, Back-end, Auth, Gestão de XPTO. -->

### Nível 4: Code (Código)
Por fim, chegamos no nível mais baixo de abstração. Neste nível é exposto o esqueleto do código-fonte real do sistema. Tendo como parte diagramas de classe, sequência e outros artefatos que mostram a estrutura e o comportamento do código-fonte.
Embora seja o nível que mais forneça informação técnica aos desenvolvedores, permitindo assim uma compreensão profunda da implementação real do sistema. Em minha opnião pessoal, se trata da camada que com o tempo se torna um peso aos mantenedores da documentação, dado sua constante mudança.
<!-- Ex.: Classe, Controller, Dependências. -->


## PlantUML
O PlantUML é uma ferramenta que permite criar diagramas UML (Unified Modeling Language) de forma textual, utilizando uma linguagem de marcação simples para definir elementos de diagramas, como classes, objetos, relacionamentos, etc. 

Suporta a criação de diagramas em diferentes níveis de abstração, incluindo diagramas de classe, diagramas de sequência, diagramas de estado entre outros. Escrevendo código em uma sintaxe simples e legível, a ferramenta então gera automaticamente os diagramas a partir do código fornecido, além de ser altamente personalizável, permitindo ajustes na aparência e o estilo dos diagramas de acordo com suas necessidades.

O exemplo abaixo representa a camada nível 1 do C4 Model, sendo elaborada de maneira textual pelo PlantUML.

![Exemplo de código-fonte com a representação gráfica do PlantUML](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z27l83y3plkza8sl0t8o.png)


## Benefícios?

O C4 Model e o PlantUML são duas ferramentas distintas que podem ser usadas em conjunto para criar diagramas arquitetônicos e representações visuais de sistemas de software. Aqui estão alguns dos prós e contras de usar essas duas ferramentas *em conjunto*:

**Prós:**

1. **Clareza e Compreensão:** O C4 Model é projetado para criar diagramas de arquitetura que são simples, claros e fáceis de entender. PlantUML, por sua vez, é uma ferramenta que pode ser usada para criar diagramas de forma textual, o que pode ajudar a manter a simplicidade e clareza dos diagramas C4.

2. **Flexibilidade:** PlantUML é altamente flexível e suporta a criação de vários tipos de diagramas, incluindo diagramas de classes, diagramas de sequência, diagramas de componentes e muito mais. Isso permite que você represente diferentes aspectos da arquitetura do sistema de forma consistente.

3. **Controle de Versão:** Como os diagramas criados com PlantUML são baseados em texto, eles podem ser facilmente armazenados em sistemas de controle de versão, como o Git, o que facilita o rastreamento de alterações e a colaboração em equipe.

4. **Integração:** PlantUML pode ser integrado em várias ferramentas de desenvolvimento, IDEs e sistemas de documentação, facilitando a inclusão de diagramas C4 em sua documentação de arquitetura.

**Contras:**

1. **Curva de Aprendizado:** Tanto o C4 Model quanto o PlantUML têm uma curva de aprendizado. Aprender a criar diagramas de arquitetura eficazes usando o C4 Model requer algum tempo e prática. Além disso, aprender a escrever código PlantUML também pode ser desafiador para alguns.

2. **Limitações de Expressividade:** Embora PlantUML seja flexível, ele ainda pode ter algumas limitações em termos de expressividade em comparação com ferramentas de diagramação gráfica mais avançadas. Alguns diagramas complexos podem ser difíceis de representar com precisão.

3. **Manutenção:** Como os diagramas PlantUML são baseados em texto, a manutenção de diagramas grandes e complexos pode se tornar trabalhosa, especialmente se muitas alterações forem necessárias.

4. **Dependência de Ferramentas:** Você precisa depender de ferramentas específicas para gerar os diagramas PlantUML a partir do código textual, o que pode ser uma desvantagem se sua equipe ou organização não estiver familiarizada com essas ferramentas.

Em resumo, a combinação do C4 Model e do PlantUML pode ser uma abordagem eficaz para representar a arquitetura de sistemas de software, especialmente se você valoriza a simplicidade e a clareza em seus diagramas e está disposto a investir tempo na aprendizagem e na manutenção das ferramentas. No entanto, é importante estar ciente das limitações e desafios associados a essa abordagem.

### Referências
- [Documentação oficial - C4 Model](https://c4model.com/)
- [Documentação oficial - Plant UML](https://github.com/plantuml-stdlib/C4-PlantUML)
- [Modelling: C4 modeling](https://www.youtube.com/watch?v=4XWShUGa0iU&ab_channel=SoftAwareProject)
- [Visualize a arquitetura do seu sistema com C4 Model](https://dev.to/alexandreliberato/visualize-a-arquitetura-do-seu-sistema-com-c4-model-3pcl)