4. Qui suis-je ?
C’est quoi un DSL au juste
Pourquoi Ecrire un DSL ?
DSL Interne
Outils Kotlin pour écrire un DSL
Surcharge des opérateurs
Type Alias
Lambda en dehors des parenthèses
Fonction d’extension
Fonction Infix
Lambda avec receiver
Contrôler le scope avec DslMarker
Exemple de DSL
Demo/LiveCoding
Conclusion
PLAN
4
5. Riadh MNASRI
Tech lead / Dev senior passionné
Adepte des pratiques crafts
Je m’intéresse au clean code, programmation fonctionnelle, …
J’aime apprendre et partager mes connaissances
Me contacter sur Linkedin/Twitter (@riadhmnasri)
QUI SUIS-JE ?
5
6. DSL: Domain Specific Language
Langage qui cible un domaine particulier
Ce n’est pas un langage généraliste
CSS, SQL, GRADLE, …
Internal DSL: Il se base sur un langage hôte
External DSL: Il a une syntaxe propre et il faut coder un ‘parser’ pour pouvoir l’utiliser
C’EST QUOI UN DSL AU JUSTE ?
6
8. Avoir un code intuitif
Plus facile à lire
Centré sur le domaine
Sans bruit inutile
POURQUOI ECRIRE UN DSL ?
8
9. Avantage: Evite de créer un ‘parser’ de DSL
Inconvénient: limité par la syntaxe permise par le language
On se basera sur Kotlin comme langage hôte
Kotlin offre les outils nécessaires pour pourvoir écrire son propre DSL
DSL INTERNE
9
11. SURCHARGE D’OPÉRATEURS
11
Donner une signification spécifique à un opérateur (un sens métier)
La liste des opérateurs qu’on peut surcharger est prédéfinie
12. On peut renommer une classe afin d’expliciter un concept
TYPE ALIAS
12
13. LAMBDA EN DEHORS DES PARENTHÈSES
13
Un Lambda paramètre d’une fonction
Dernier paramètre de la fonction
On peut sortir la fonction en dehors des parenthèses
14. FONCTION D’EXTENSION
14
Donne la possibilité d’étendre une classe ou une interface
Pas besoin de faire de l’héritage et le Design Pattern Décorateur
15. FONCTION INFIX
15
Pour créer un DSL, on se basera beaucoup sur les fonctions Infix
Quand une fonction peut être infix ?
Fonction avec un receiver et un seul paramètre
16. LAMBDA AVEC RECEIVER
16
Kotlin donne la possibilité d’ajouter un receiver implicite
Le Lamdba est ajouté comme fonction d’extension au receiver implicite
17. Par défaut, une fonction appelée dans un inner lambda, va chercher à s’attacher au 1er
receiver disponible, sinon elle va tenter de chercher dans le receiver suivant
On peut limiter ceci, on ajoutant l’annotation @DslMarker afin de rétrécir le scope au
receiver déclaré
CONTRÔLER LE SCOPE AVEC @DSLMARKER
17
20. Code disponible sur mon GitHub
https://github.com/riadh-mnasri/write-your-first-dsl-kotlin
LIVE CODING / DEMO
20
21. Ce qu’apporte d’écrire un DSL ?
Rendre un code métier plus lisible (lecture plus intuitive, plus naturelle, …)
Cacher/Supprimer le code inutile
Faciliter l’échange entre différents interlocuteurs (Product Owner, Business Analyst,
Développeur, …)
CONCLUSION
21
22. https://kotlinlang.org/docs/home.html
Programming DSLs in Kotlin - Venkat Subramaniam
Building Domain Specific Language in Kotlin - Greg Milette
https://www.jmix.io/cuba-blog/kotlin-dsl-from-theory-to-practice/
https://blog.developer.adobe.com/building-elegant-dsls-with-kotlin-707726c5ed21
REFERENCES
22