LOG210: Valider l’architecture en couches

Hacking Cowboy 🤠

Design grâce au DSS

Avantages de la séparation en couches

  • On peut remplacer la couche présentation (Express) avec une autre plus facilement
  • Les classes domaine sont plus cohésives
    • plus faciles à comprendre
    • plus réutilisables dans une autre application

Comment valider?

Couches dans le Squelette

Couches dans le Squelette (DSS)

DSS du squelette

DSS pour un scénario Jouer aux dés

Trois opérations système:

  1. démarrerJeu(nom:String)
  2. jouer(nom:String)
  3. terminerJeu()

Tous les arguments sont de type primitif!

Opération système

  • Il y a une méthode démarrerJeu(nom:String) dans JeuDeDés (un contrôleur GRASP).
  • JeuDeDés est l’objet racine du MDD.

Opération système codée

/* démarrer le jeu (express route handler) */
public demarrerJeu(req: Request, res: Response, next: NextFunction) {
  const nom = req.body.nom;
  try {
    // Invoquer l'opération système (du DSS) dans le contrôleur GRASP
    const joueur = this._controleurJeu.demarrerJeu(nom);
    const joueurObj = JSON.parse(joueur);
    req.flash('info', `Nouveau jeu pour ${nom}`);
    // ...
  }
}

JeuRouteur.ts a une méthode route handler qui invoque l’opération système

Elle décortique l’argument req d’un service web pour extraire les arguments de l’opération système

Appel de l’opération système démarrerJeu(nom), l’argument nom est de type primitif string

L’objet de retour est une copie de l’objet Joueur (du domaine), pour respecter la séparation des couches.

Voir tout le code de JeuRouteur.ts sur GitHub.

🧐Inspectez votre code

Pour chaque opération système du DSS, il doit y avoir:

  • une méthode ayant exactement le même nom,
  • des arguments de type primitif,
  • un Contrôleur GRASP qui reçoit la méthode:
    • soit un objet racine, un équipement, etc. du MDD. C’est un contrôleur de façade.
    • soit un contrôleur de cas d’utilisation, ex. GestionnaireY (Y == nom du cas d’utilisation)

Notez que le Contrôleur GRASP n’est pas dans la couche de présentation

Symptômes de mauvaise conception 1

⚠️ Vous instanciez un objet (new Devoir(...)) dans un routeur pour le passer dans une opération système.

Correctif:

Symptômes de mauvaise conception 2

⚠️ Vous avez une méthode route handler (avec arguments de requête et réponse HTTP) dans une classe Université.

  • 🤠Logique de routeur (couche présentation) se trouve dans une classe de domaine (Université).

Correctif:

⚠️

Vous utilisez un autre framework?

Certaines technologies 🤠 peuvent être incompatibles avec cette méthodologie de séparation. C’est la raison que nous ne permettons pas l’utilisation d’autres cadriciels pour le laboratoire.

Vous devez respecter la contrainte de la séparation des couches.