Les value object font partie de la boite à outils que tout développeur devrait utiliser. En effet, les Value Object (VO pour les intimes) permettent de renforcer la qualité des données, améliorer la protection contre les attaques par injection et apportent une souplesse dans la maîtrise des données. Voyons en détails ce qu’ils apportent …

Peu importe que vous développiez en PHP, Python, Java / Kotlin ou tout autre langage, ce principe fonctionne partout. Cela consiste à faire en sorte d’enrober les types primitifs dans des types que vous définissez vous-même.

Exemple:

Votre application s’adresse aux personnes majeures, au lieu de déclarer l’âge de la personne en tant qu’entier simple, vous allez créer un objet Age qui, quand vous le construisez, validera que l’âge de la personne est bien supérieur à 18 ans. Cet objet sera ainsi mis en place partout dans votre application et vous aurez gagné une validation à toutes les étapes. Libre à vous de faire ce que vous voulez si la validation échoue (Renvoyer une erreur, faire comme si la personne n’avait pas défini son âge, mettre une valeur par défaut …)

Voici un autre exemple avec du code illustré

@Value
public class EmailAddress {

    private String value;

    public EmailAddress(String value) {
        if(!EmailValidator.getInstance().isValid(value)){
            throw new IllegalArgumentException(String.format("L'adresse e-mail {%s} est invalide", value));
        }
        this.value = StringUtils.lowerCase(value);
    }
}

On peut voir ici que l’on ne peut que construire l’objet qui se base sur un String. A la construction de l’objet, nous vérifions la donnée qui nous est communiquée, si celle-ci est valide, on en profite pour mettre la valeur automatiquement en minuscule. Ainsi, en utilisant cet objet dans toute notre application, on est sûr d’appliquer les mêmes règles de validation, d’avoir la donnée toujours formatée de la même façon et le validateur nous protège des éventuelles injections de code qui pourraient se présenter (sauf si le validateur a un problème …)

Ici, si on récupère une donnée invalide de la base de données (le petit malin qui a changé la donnée à la main …), on pourrait tout à fait faire en sorte de demander à l’utilisateur de saisir une donnée valide, comme si la donnée invalide n’avait jamais existé. De cette façon, on renforce la qualité des données que l’on gère et on évite les mauvaises données.

Ce principe s’applique sur des petits objets, au lieu d’utiliser des types primitifs, préférer utiliser des objets possédant un peu d’intelligence ainsi vous verrez que votre application est plus robuste, maintenable, et souple.