Skip to content
Snippets Groups Projects
Verified Commit 01692c42 authored by Julien Wittouck's avatar Julien Wittouck
Browse files

:sparkles: : add hexagonal architecture course

parent a556fc92
No related branches found
No related tags found
No related merge requests found
Pipeline #53833 passed
Showing
with 1328 additions and 1 deletion
...@@ -64,6 +64,7 @@ tasks: ...@@ -64,6 +64,7 @@ tasks:
- w08-asynchronism/08-asynchronism.html - w08-asynchronism/08-asynchronism.html
- w08-high-availability/08-high-availability.html - w08-high-availability/08-high-availability.html
- w09-cloud/09-cloud.html - w09-cloud/09-cloud.html
- w10-hexa/10-hexa.html
- w12-rendu/12-criteres-notation.html - w12-rendu/12-criteres-notation.html
cmds: cmds:
- for: sources - for: sources
......
images/hexa.png

65.8 KiB

...@@ -311,7 +311,7 @@ ...@@ -311,7 +311,7 @@
<div class="card h-100"> <div class="card h-100">
<img <img
class="card-img-top" class="card-img-top"
src="images/placeholder.png" src="images/hexa.png"
alt="Clean Archi, et Archi Hexagonale" alt="Clean Archi, et Archi Hexagonale"
/> />
<div class="card-body"> <div class="card-body">
...@@ -321,6 +321,12 @@ ...@@ -321,6 +321,12 @@
</h5> </h5>
<p class="card-text">Salade, Tomates, Oignons 🥙</p> <p class="card-text">Salade, Tomates, Oignons 🥙</p>
</div> </div>
<div class="card-footer">
<div class="btn-group" role="group">
<a href="w10-hexa/10-hexa.html" class="btn btn-primary">Cours</a>
<a href="w10-hexa/10-hexa.pdf" class="btn btn-secondary"><i class="bi bi-file-earmark-pdf-fill"></i></a>
</div>
</div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
......
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>ALOM - Clean Archi et Archi Hexagonale</title>
<meta name="description" content="ALOM - Clean Archi et Archi Hexagonale">
<meta name="author" content="Julien WITTOUCK <julien@codeka.io>">
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/>
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
<link rel="stylesheet" href="../reveal/dist/reveal.css">
<link rel="stylesheet" href="../reveal/dist/theme/white.css" id="theme">
<link rel="stylesheet" href="../css/miage-lille.css"/>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css"
integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<h1>ALOM</h1>
<h2>🥙 Clean Archi et Archi Hexagonale</h2>
<em>Salade, Tomates, Architecture Oignons</em>
</section>
<section>
<h3><i class="fab fa-uber"></i> UBER</h3>
<img src="images/Microservice-Architecture-Of-UBER.png" style="width: 50%"/>
</section>
<section>
<h2>Problématiques : </h2>
<p>Comment organiser le code ?</p>
<p>Comment être capable de changer de type de BDD ?</p>
<p>Minimiser le <i>Blast-Radius 💣💥</i> d'un changement</p>
<p>Séparer les responsabilités</p>
</section>
<section>
<h2>L'architecture logicielle</h2>
<ul>
<li>
Donner forme à la construction d'un système
<ul>
<li>Division en composants</li>
<li>Arrangement des composants</li>
<li>Communication des composants</li>
</ul>
</li>
<li>
Le but :
<ul>
<li>Faciliter le développement</li>
<li>Faciliter le déploiement</li>
<li>Faciliter les opérations</li>
<li>Faciliter la maintenance</li>
</ul>
</li>
</ul>
</section>
<section>
<h2>Les concepts des architectures logicielles</h2>
<ul>
<li>
Separation of concerns
<ul>
<li>La BDD ne doit pas dépendre des IHM</li>
<li>Les règles métier ne doivent pas dépendre de la BDD</li>
<li>Les règles métier ne doivent pas dépendre des IHM</li>
</ul>
</li>
</ul>
</section>
<section>
<h3>👮 S.O.L.I.D principles</h3>
<ul>
<li>S : Single Responsability</li>
<span class="fragment">Une classe doit avoir une seule responsabilité</span>
<li>O : Open/Closed</li>
<span class="fragment">Ouvert à l'extension, mais fermé à la modification</span>
<li>L : Liskov Substitution</li>
<span class="fragment">Pouvoir utiliser un sous-type</span>
<li>I : Interface Segregation</li>
<span class="fragment">Présenter plusieurs interfaces spécifiques</span>
<li>D : Dependency Inversion</li>
<span class="fragment">Dépendre d'abstractions, et non d'implémentations</span>
</ul>
</section>
<section>
<h3>Domain-Driven Design (DDD)</h3>
<img src="./images/DDD.jpg" class="img-right visible" width="15%">
<p>Les archis modernes prennent souvent racine dans les concepts de DDD.</p>
<ul>
<li>Domaine Métier : Le cœur de l'application est la logique métier.</li>
<li>Ubiquitous Language : Un langage commun entre les développeurs et les experts métier.</li>
<li>Entities et Value Objects : Des objets qui représentent les concepts fondamentaux du métier.</li>
</ul>
</section>
<section>
<h3>L'architecture n-tier (années 90)</h3>
<p>Séparatation physique entre les programmes et les BDD, entre les clients et les serveurs</p>
<img src="images/n-tier.png"/>
</section>
<section>
<h3>L'architecture n-tier avec Spring</h3>
<p>La vision "classique"</p>
<img src="images/n-tier-spring.png"/>
</section>
<section>
<h3>L'architecture Hexagonale (ports et adapters)</h3>
<p>Conceptualisé par Alistair Cockburn en 2005</p>
<img src="./images/hexagon.png"/>
</section>
<section>
<h3>La Onion Architecture</h3>
<p>Conceptualisé par Jeffrey Palermo en 2008</p>
<img src="./images/onion.png"/>
</section>
<section>
<h3>La Clean Architecture</h3>
<p>Conceptualisé par Robert C. Martin en 2012</p>
<img src="./images/CleanArchitecture.jpg"/>
</section>
<section>
<h3>Les éléments communs (et importants)</h3>
<ul>
<li>Séparer la logique métier des détails techniques</li>
<li>Indépendance d'un framework</li>
<li>Testabilité</li>
<li>Indépendance de la partie UI</li>
<li>Indépendance de la partie BDD</li>
</ul>
</section>
<section data-markdown>
<textarea data-template>
## Les moyens de mise en place
### Packages Java
![](images/diagrams-packages.png)
---
## Les moyens de mise en place
### Packages Java
![](images/diagrams-packages-highlights.png)
---
### En vision hexagonale
![](images/diagrams-hexa-packages.png)
---
### Séparation des classes
![](images/diagrams-hexa-packages-dtos.png)
---
### Séparation en modules
![](images/diagrams-hexa-modules.png)
---
### Séparation en modules - parent
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hexagonal-architecture-sample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>domain</module>
<module>web</module>
<module>data-jpa</module>
</modules>
</project>
```
---
### Séparation en modules - domain
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>hexagonal-architecture-sample</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>domain</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
```
---
### Séparation en modules - web
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>hexagonal-architecture-sample</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>web</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
```
---
### Séparation en modules - data-jpa
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>hexagonal-architecture-sample</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>data-jpa</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
```
---
## Ce qu'il faut retenir
* Organisation du code et séparation des responsabilités
* SOLID !
* Le domaine métier est "pur", sans framework
* annotations customs
* tolérance pour certaines librairies (commons-lang, lombok, etc.)
* Pas de "meilleure" façon, toujours adapter au contexte
---
## Vocabulaires
![](images/diagrams-vocabulary.png)
---
## Vocabulaires
* Controlleurs - DTO (Data Transfer Object) - VO (Value Object)
* Use Cases - Services - Domain Objects
* Repositories - Entities
* Ports = interfaces
* Adapters = implémentations
### Hexa / Clean
* Ports / Adapters
* API / SPI : Application Programming Interface, Service Provider Interface
* In / Out
</textarea>
</section>
<section>
<h2>TP</h2>
<img src="../images/leonidas.png"/>
<p>
<a href="../w12-rendu/12-criteres-notation.html">Critères de notation <i class="em em-cloud"></i></a>
</p>
</section>
</div>
</div>
<script src="../reveal/dist/reveal.js"></script>
<script src="../reveal/plugin/markdown/markdown.js"></script>
<link rel="stylesheet" href="../reveal/plugin/highlight/zenburn.css">
<script src="../reveal/plugin/highlight/highlight.js"></script>
<script>
// More info about initialization & config:
// - https://revealjs.com/initialization/
// - https://revealjs.com/config/
Reveal.initialize({
hash: true,
// Learn about plugins: https://revealjs.com/plugins/
plugins: [RevealMarkdown, RevealHighlight],
markdown: {
smartypants: true
}
});
</script>
<aside class="miage_aside_logo"></aside>
</body>
</html>
This diff is collapsed.
w10-hexa/images/CleanArchitecture.jpg

105 KiB

w10-hexa/images/DDD.jpg

59.5 KiB

w10-hexa/images/Microservice-Architecture-Of-UBER.png

55.5 KiB

w10-hexa/images/diagrams-hexa-modules.png

8.29 KiB

w10-hexa/images/diagrams-hexa-packages-dtos.png

38.3 KiB

w10-hexa/images/diagrams-hexa-packages.png

29.7 KiB

w10-hexa/images/diagrams-packages-highlights.png

44.9 KiB

w10-hexa/images/diagrams-packages.png

37.7 KiB

w10-hexa/images/diagrams-vocabulary.png

27.1 KiB

This diff is collapsed.
w10-hexa/images/hexagon.png

79.4 KiB

w10-hexa/images/n-tier-spring.png

20.3 KiB

w10-hexa/images/n-tier.png

12 KiB

w10-hexa/images/onion.png

28.6 KiB

This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment