Passer au contenu principal

Modèle C4

4 niveaux de zoom :

  • Context
  • Container
  • Component
  • Code.

Représente le même système à plusieurs niveaux de détail.

Editeur: https://playground.structurizr.com

vue très large : où se place ton système ?

Les 4 C

Context

Vue très large : Ton système vu de l’extérieur, “Ce système sert à quoi, pour qui, et avec quoi il parle ?”. On y voit :

  • les utilisateurs,
  • les systèmes externes,
  • ton application au milieu,
  • les grandes interactions.

Exemple :

  • Client
  • Admin
  • Shop Platform
  • Stripe
  • Service de mails

Container

Vue intermédiaire : quels gros blocs le composent (blocs exécutable ou stockant des données), “Techniquement, mon système est découpé en quels gros morceaux?".

Exemple:

  • Frontend Web App (Nuxt/Vue)
  • Backend API (Node.js ou PHP)
  • MariaDB
  • Worker d’envoi d’e-mails

Component

Vue fine : comment un bloc est organisé, “À l’intérieur de ce bloc, quels sont les modules importants et leurs responsabilités ?”?

Exemple poru une API :

  • Auth Controller
  • Order Service
  • Payment Service
  • Product Repository
  • Email Gateway

Code

Vue très fine : à quoi ressemble le code / design interne ?

Niveau “Code” prévu, mais en pratique il est souvent optionnel, “Comment ce composant est structuré en classes, interfaces, modules, etc. ?”.

Exemple

workspace "Adext2" "C4 model workspace" {
 
    model {

        user = person "User"

        adext = softwareSystem "Adext2" {

            webapp = container "Web App" "Angular" {

                loginView = component "Login View"

                authService = component "auth.service"

                externalsListView = component "Externals List View"

                externalsService = component "externals.service"

                newExternalView = component " New external view"

                formService = component "form.service"

            }

            api = container "API" {

                externalsController = component "Externals Controller"

                loginController = component "Login Controller"

                pagesController = component "Page Controller"

                externalModel = component "External Model"

                ldapModel = component "Ldap Model"

                config = component "Config"

            }

            db = container "DataBase"

        }
 
        // Niveau 2  Containers

            user -> webapp "Utilise"

            webapp -> api "Appelle" 

            api -> db "Lit/Ecrit"
 
        // Niveau 3 

            // API

            externalsController -> externalModel "Utilise"

            pagesController -> externalModel "Utilise"

            loginController -> ldapModel "Utilise"

            externalModel -> config "Utilise"

            ldapModel -> config "Utilise"

            externalModel -> db "Se connecte / MYSQL"

            ldapModel -> db "Se connecte / MYSQL"
 
            // Front - LoginView

            loginView -> authService "Utilise"

            authService -> loginController "HTTP"
 
            // Front - Externals list

            externalsListView -> externalsService "Utilise"

            externalsService -> externalsController "HTTP"
 
            // Front - New external

            newExternalView -> formService "Utilise"

            formService -> externalsController "HTTP"
 
 
    }
 
    views {

        systemContext adext {

            include user

            include adext

            autolayout lr

        }
 
        container adext {

            include *

            autolayout lr

        }
 
        component api {

            include *

            autolayout lr

        }
 
        component webapp {

            include *

            autolayout lr

        }

    }

}