O Método de Documentação C4Model e sua aplicação com PUML
Tags: documentation, uml, braziliandevs
Published: 2023-05-10 23:59:59

**TL;DR**: O C4Model é uma técnica de documentação de arquitetura de software que permite representar sistemas complexos de maneira hierárquica e fácil de entender. Neste artigo, exploraremos como usar o PlantUML para criar diagramas do C4Model e apresentaremos exemplos práticos.

## Introdução

O C4Model é uma abordagem para documentação de arquitetura de software que se concentra na comunicação entre as partes interessadas, fornecendo uma visão hierárquica e simplificada do sistema. Composto por quatro níveis de abstração - Contexto, Contêiner, Componente e Código - o C4Model facilita a compreensão da arquitetura e promove a colaboração entre os membros da equipe. Neste artigo, discutiremos como utilizar o PlantUML (PUML) para criar diagramas do C4Model e forneceremos exemplos práticos.

## 1. O C4Model e o PlantUML

O C4Model é baseado em quatro níveis de abstração que representam diferentes perspectivas do sistema:

1. Contexto: Mostra a relação do sistema com os usuários e outros sistemas.
2. Contêiner: Descreve os serviços, aplicativos e bancos de dados que compõem o sistema.
3. Componente: Detalha os componentes individuais e suas interações dentro de um contêiner.
4. Código: Representa a implementação real do componente em termos de classes, interfaces e outras construções de programação.

O PlantUML é uma ferramenta de código aberto que permite criar diagramas UML a partir de texto simples. Com sua sintaxe intuitiva, o PlantUML é ideal para criar diagramas do C4Model.

## 2. Exemplos de diagramas do C4Model com PlantUML

A seguir, apresentamos exemplos de diagramas do C4Model utilizando a sintaxe do PlantUML.

### 2.1 Diagrama de Contexto

```plantuml
@startuml
!define C4_Context https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Context.puml
!includeurl C4_Context.puml

System(systemAlias, "Sistema Exemplo", "Sistema para ilustrar o C4Model")

Person(userAlias, "Usuário", "Usuário do sistema")

System_Ext(system2Alias, "Sistema Externo", "Outro sistema relacionado")

Rel(userAlias, systemAlias, "Interage com")
Rel(systemAlias, system2Alias, "Se comunica com")

@enduml
```

### 2.2 Diagrama de Contêiner

```plantuml
@startuml
!define C4_Container https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml
!includeurl C4_Container.puml

System_Boundary(systemAlias, "Sistema Exemplo") {
  Container(container1Alias, "Aplicativo Web", "JavaScript, Angular", "Aplicativo web para usuários")
  Container(container2Alias, "API", "Java, Spring Boot", "API RESTful")
  ContainerDb(container3Alias, "Banco de Dados", "MySQL", "Armazena dados do sistema")
}

Person(userAlias, "Usuário", "Usuário do sistema")

Rel(userAlias, container1Alias, "Acessa")
Rel(container1Alias, container2Alias, "Consome")
Rel(container2Alias, container3Alias, "Lê e grava dados")

@enduml
```

## 2.3 Diagrama de Componente
```plantuml
@startuml
!define C4_Component https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Component.puml
!includeurl C4_Component.puml

Container_Boundary(container2Alias, "API - Java, Spring Boot") {
Component(component1Alias, "Controller", "Spring MVC Rest Controller", "Gerencia solicitações de API")
Component(component2Alias, "Service", "Spring Service", "Gerencia a lógica de negócio")
Component(component3Alias, "Repository", "Spring Data JPA Repository", "Gerencia o acesso aos dados")
}

Rel(component1Alias, component2Alias, "Chama")
Rel(component2Alias, component3Alias, "Utiliza")

@enduml
```

## 3. Conclusão
O C4Model é uma abordagem de documentação de arquitetura de software que permite representar sistemas complexos de maneira hierárquica e fácil de entender. Ao utilizar o PlantUML, é possível criar diagramas do C4Model de forma eficiente, simplificando a comunicação entre os membros da equipe e facilitando a colaboração.

## Referências:

1. Simon Brown. "C4 model - Context, Containers, Components, and Code". Disponível em: [https://c4model.com/](https://c4model.com/).
2. PlantUML. "PlantUML - Open-source tool that uses simple textual descriptions to draw UML diagrams". Disponível em: [https://plantuml.com/](https://plantuml.com/).
3. Ricardo Niepel. "C4-PlantUML - PlantUML sprites, macros, and other includes for C4 diagrams". Disponível em: [https://github.com/RicardoNiepel/C4-PlantUML](https://github.com/RicardoNiepel/C4-PlantUML).

_Nota: Os exemplos de código deste artigo são baseados no repositório C4-PlantUML de Ricardo Niepel._