Modélisation de domaine de type sécurisé à Kotlin | par Luca Piccinelli | Meilleure programmation | Janv.2021

Online Coding Courses for Kids

Tout d’abord, rappelez-vous les bases.

Si certaines données sont liées, il est judicieux de les regrouper.

Ce modèle exprime quelles informations sont liées. Le maintien d’une cohésion élevée favorise également la réutilisabilité.

Les attributs de chaîne de PersonalName ne doit pas être vide. Ce n’est pas clair dans le code, alors clarifions-le.

Remarquerez que middleInitial est nullable. Cela exprime au moment de la compilation que l’initiale du milieu est facultative.

J’ai enveloppé les cordes dans NotEmptyStrings qui garantit le respect des contraintes.

Ici, j’ai utilisé un en ligne class, et j’ai déclaré une erreur de compilation pour empêcher l’utilisation du constructeur. Cette classe ne peut être instanciée qu’à l’aide de la méthode de fabrique of, il n’y a donc aucune chance de sauter la validation. j’ai utilisé Valiktor pour le mettre en œuvre.

Les classes en ligne existent dans Kotlin dans le but d’améliorer l’expressivité des types primitifs. L’utilisation de types primitifs dans le modèle de domaine est une odeur de code, appelée obsession primitive.

La signature de NotEmptyString.of indique que si vous entrez un string, vous obtiendrez toujours un NotEmptyString.

fun of(value: String): NotEmptyString

Ceci est un mensonge. Si la validation échoue, Valiktor lancera un ConstraintViolationException. La possibilité qu’il jette n’est pas déclarée dans la signature alors, vous pouvez obtenir une erreur d’exécution inattendue. Résolvons ce problème avec Konad:

Ici, j’ai utilisé la fonction d’assistance valikate qui intercepte l’exception, formate ses messages avec l’API Valiktor et encapsule tout dans Result.

Les constructeurs ok() et error() sont des méthodes d’extension de Konad, qui construisent un Result.Ok et un Result.Errors, respectivement.

Regardez la nouvelle signature:

fun of(value: String): Result

La possibilité d’échouer est désormais claire. À Konad, Result est un scellé classe qui peut être Result.Ok ou Result.Errors. En l’utilisant, la fonction est exempte d’effets secondaires.

Maintenant, nous pouvons en créerResult cela peut entraîner une erreur ou la valeur souhaitée. À partir de ceux-ci, nous devons obtenir un PersonalName. Si vous êtes habitué à des structures de type «monade» comme Java Optional ou Kotlin nullables, alors vous pouvez vous attendre à ce que je vais écrire une liste infinie de .flatMap.flatMap.map… ou let.let.let….

Eh bien, je ne le suis pas. C’est ici que Konad brille. Nous allons créer un PersonalName avec l’API de composition de Konad:

Konad accumule toutes les erreurs. le println dans l’exemple, va imprimer la liste de toutes les erreurs, séparées par une nouvelle ligne avec name.description("n").

Image de Giphy

Un email peut être vérifié ou non. Dans le modèle initial, il y a le drapeau booléen isVerified qui garde cette information.

L’indicateur n’est pas de type sécurisé. Il doit être vérifié à chaque fois que nous avons besoin d’un e-mail vérifié. Par exemple:

Cela ne peut pas être vérifié au moment de la compilation. Mon approche préférée est d’avoir un type pour le Unverified statut et un pour le Verified.

le sendPasswordRecovery la fonction peut changer comme suit:

le if est parti, et il n’y a aucune chance que quiconque oublie de vérifier verified statut. De plus, vous n’avez pas besoin de lire la mise en œuvre pour comprendre que seuls les e-mails validés peuvent récupérer le mot de passe.

Nous devons contraindre la construction d’un e-mail, comme nous l’avons déjà fait pour NotEmptyString.

Pour construire un Verified Email, vous avez besoin d’un Unverified une. Il s’ensuit qu’il suffit de mettre en œuvre la validation uniquement pour Unverified e-mails.

Remarquerez que Unverified est devenu une classe normale, au lieu d’être une classe de données. C’est parce qu’il n’y a aucun moyen de rendre privé lecopy méthode d’une classe de données.

Close Menu