Forumphppattern-header

[Forum PHP 2022] Conférence :
un moteur bien huilé !

Par Sylvain P. le 19 octobre 2022

 Lecture 3 minutes

Lors de la conférence "Un moteur bien huilé" sur le Forum PHP,  le développeur Thibault Richard nous a parlé du design pattern Rule Engine. Aussi, il nous a montré un exemple de mise en application de ce pattern dans un de ses développements.

Rule Engine : présentation !

Ce pattern utilise deux types de composants :

  • le BusinessRule
  • le RuleEngine

 

La BusinessRule comporte deux fonctions principales :

  • une fonction qui permet de vérifier les conditions d’application de la règle
  • une fonction qui applique la règle quand la première fonction retourne true

 

Le RuleEngine comporte deux éléments :

  • un tableau ou collection contenant toutes les règles en vigueur
  • une fonction qui va servir à boucler sur l’ensemble des règles à vérifier, et les appliquer si c’est nécessaire

 

Ce modèle va donc permettre de bien différencier chaque règle et de les isoler entre elles, notamment sur les conditions d’application. Il permet aussi de s’assurer qu’elles n'interfèrent pas entre elles.

Ceci a l’avantage de faciliter l’évolution des règles métier. Pour l’ajout d’une nouvelle règle, il suffit de créer sa classe BusinessRule puis de l’ajouter aux règles à appliquer dans le RuleEngine. Pour la suppression d’une règle, il suffit de la supprimer du tableau des règles dans le RuleEngine... Le tour est joué !

Cas pratique avec Thibault

Dans le cas de Thibault, son cas pratique concerne la constitution d’un dossier administratif et la problématique de demander les bons documents/justificatifs selon les informations fournies par le demandeur.

On imagine très bien les différents cas selon l’âge, la situation matrimoniale, le nombre d’enfants, le pays de naissance, la nationalité... et l’énorme bloc de code imbriquant des "if" et "if...else" que cela génère en un seul et même endroit.

La mise en place du design pattern lui a permis de déporter les conditions dans chaque document (représenté ici par une BusinessRule). Ainsi, au moment de construire la liste des documents à demander, le code se résume à instancier le RuleEngine des documents et à exécuter la fonction qui va évaluer chaque document pour nous retourner seulement ceux qui correspondent aux critères du demandeur.

 

L’exemple que Thibault nous a présenté ici est assez simple, tous les documents étaient indépendants les uns des autres. Mais on imagine très bien tout le potentiel de ce pattern pour mettre en place des règles plus complexes qui nécessitent par exemple le chaînage de plusieurs règles.

Sylvain P.

L'aventurier du code.

GIF