Le pattern "Parameter Object"

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Après avoir publié mon billet concernant le pattern Commande hier, on m’a demandé s’il était possible d’utiliser une commande pour remplacer un groupe de paramètre d’une fonction ou d’une méthode avec pour objectif de simplifier le code et sa lisibilité sans pour autant mettre en place un bus de commande.

Pour répondre sans détour à cette question, oui il est tout à fait possible de remplacer des paramètres de fonction par un objet, cela correspond même à un autre patron de conception nommé le paramètre objet (ou Parameter Object en anglais).

Ce pattern permet de regrouper un ensemble de paramètres au sein d’un ou plusieurs objets qui seront transmis à votre fonction afin de rendre le code plus lisible en simplifiant les signatures de méthodes.

Il permet également de supprimer de la duplication de code dans le cas ou différentes méthodes définissent systématiquement un même groupe de paramètre parce que ces derniers sont fonctionnellement liés.

Par exemple, je travaille sur une application de calendrier dans laquelle j’ai énormément de méthodes qui travaillent avec des dates de début et des dates fins de période:

public function filterEventByDate(DateTime $start, DateTime $end);
public function getEvents(DateTime $start, DateTime $end);
public function getAvailableSlot(DateTime $start, DateTime $end);

On remarque ici que de nombreuses méthodes partagent les paramètres $start et $end qui partage une même sémantique fonctionnelle. On pourra alors regrouper ces deux paramètres au sein d’un object DateRange:

class DateRange
{
    public function __construct(
        public readonly DateTime $start,
        public readonly DateTime $end,
    ) {
    }
}
public function filterEventByDate(DateRange $dateRange);
public function getEvents(DateRange $dateRange);
public function getAvailableSlot(DateRange $dateRange);

Si l’exemple précédent est relativement simpliste, dans des cas d’utilisation réels, on peut facilement imaginer que notre objet paramètre pourra regrouper bien plus de données.