SlideShare une entreprise Scribd logo
1  sur  31
Franglais ?
Franglish ?
Frenglish ?
Les Langages Dédiés (DSL) au secours du Français ?
1
Usage de l’Anglais
• Par nécessité
• Prédominance américaine en Informatique
• Concepts, API, documentation, etc.
• « Common tongue » / langue universelle
• Sens précis, vocabulaire nouveau
• commit (en) == ??? (fr)
• Par goût
• Ca fait « IN »
• Envie d’harmonie
• Métier non décrit en Anglais ?
2
Usage du Français : contraintes
• Conversion : langue humaine -> langage de programmation
• Accents, liaisons, ordre des mots
• Synonymes / traduction
• Vocabulaire multi-source
• Mots des librairies bibliothèques (libraries)
• Mots du métier de l’application
• artisanat, droit, marine, etc.
• Cohabitation : Franglais ?
void emprunterLivre(
Utilisateur utilisateurNouveau,
Livre livreEmprunte);
void emprunterUnLivre(
Utilisateur nouvelUtilisateur,
Livre emprunteLivre);
3
public class BookDao { // traduction ? (Livre vs Réserver)
public class LivreOad { // hors convention
private EntityManager gestionnaireEntite; // nommage ?
// gain sens ? abstraction ?
public Livre persister(Livre livre) { // faux ami
/*
Larousse.fr (persister):
- Demeurer ferme dans sa façon de penser ou d'agir malgré les difficultés
- Durer, subsister
*/
public Livre sauverDurablement(Livre livre) { // précision du vocabulaire ?
return gestionnaireEntite.persist(livre); // Franglais (fr-en-fr)
// API en langue anglaise
Usage du Franglais : horreurs
4
Usage du Franglais =>
bien écrire ni le Français, ni l’Anglais
• Ni le Code ?
• Réponses de l’Ingénieur:
• Documentation
• Restreindre les parties en Français
• Règles de nommage
• Abstraction, faible couplage, isolation des responsabilités
• Langage Dédié / Domain Specific Language (DSL) ?
5
DSL exemples #1
• Apache Camel
• http://camel.apache.org/java-dsl.html
• assertJ public void configure() {
from("file:src/data?noop=true")
.choice()
.when(xpath("/person/city = 'London'"))
.to("file:target/messages/uk")
.otherwise()
.to("file:target/messages/others");
}public void test() {
List<TolkienCharacter> fellowshipOfTheRing =
method.toTest();
assertThat(fellowshipOfTheRing)
.hasSize(9)
.contains(frodo, sam)
.doesNotContain(sauron);
}
6
DSL exemples #2
• Spring DSL
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlows.from(this.integerMessageSource(), c ->
c.poller(Pollers.fixedRate(100)))
.channel(this.inputChannel())
.filter((Integer p) -> p > 0)
.transform(Object::toString)
.channel(MessageChannels.queue())
.get();
}
7
DSL exemples #3
• Builders
• https://www.infoq.com/articles/internal-dsls-java
public void buildCar() {
DreamCar car = car()
.brand("Tesla")
.color(RED)
.fuelEfficient()
.build();
}
public void takeVacation() {
Period vacation = Period.from("10/09/2007").to("10/17/2007");
Booking booking = vacation.book(Location.city("Paris").hotel("Hilton"));
booking.add(Flight.airline("united").flight("UA-6886"));
}
8
DSL : généralités
• Usages courants: configuration / data building
• Interne ou Externe
• DSL externes : HTML, CSS, …
• DSL externes graphiques (https://docs.microsoft.com/fr-
fr/visualstudio/modeling/getting-started-with-domain-specific-languages)
• Vieux débats:
• DSL vs library
• Choix du langages de programmation (LISP, Java…)
• Mise en garde:
• abstraction leaks
• perte de contrôle
9
DSL : littérature
• Martin Fowler
• https://martinfowler.com/books/dsl.html
• https://dzone.com/articles/creating-internal-dsls-java
• Venkat Subramaniam
• http://www.javaworld.com/article/2077865/core-java/core-java-creating-
dsls-in-java-part-1-what-is-a-domain-specific-language.html
10
DSL : les styles
• Implémentation
• Method chaining
• Nested functions
• Closures / lambdas
void methodChaining() {
Graph()
.edge()
.from("a")
.to("b")
.weight(12.3)
.edge()
.from("b")
.to("c")
.weight(10.5);
}
void nestedFunctions() {
Graph(
edge(from("a"), to("b"), weight(12.3),
edge(from("b"), to("c"), weight(10.5)
);
}
11
DSL et Français ?
• Idée : profiter d’une couche d’abstraction pour introduire du code en
Français
12
Tentative : but
@Data
public class Livre {
private String titre;
private String auteur;
private String ISBN;
}
Règle Métier:
Le ISBN ne pas être modifié
13
Tentative : but
@Data
public class Livre {
private String titre;
private String auteur;
private String ISBN;
}
public class LivreCopieur {
public void copier(Livre livreIHM, Livre livreBDD) {
if (livreBDD.getISBN().equals("")) {
livreBDD.setISBN(source.getISBN());
}
livreBDD.setAuteur(livreIHM.getAuteur());
livreBDD.setTitre(livreIHM.getTitre());
}
}
static void exec(Livre livreIHM, Livre livreBDD) {
new LivreCopieur().copier(livreIHM, livreBDD);
}
Règle Métier:
Le ISBN ne pas être modifié
public void copier(Livre livreIHM,
Livre livreBDD) {
if (aucunISBN(livreBDD) {
copierISBN(livreIHM, livreBDD);
}
copierAuteur(livreIHM, livreBDD);
copierTitre(livreIHM, livreBDD);
}
static void exec(Livre livreIHM, Livre livreBDD) {
copieur()
.copier(lesChamps().auteur().titre())
.copier(lesChamps().ISBN(), siNouveau())
.appliquer(depuis(livreIHM), vers(livreBDD));
}
1
2
3
14
Tentative #1
@AllArgsConstructor
public class LivreCopieur {
private Livre source;
private Livre destination;
public LivreCopieur auteur() {
destination.setAuteur(source.getAuteur());
return this;
}
public LivreCopieur ISBN() {
destination.setISBN(source.getISBN());
return this;
}
public LivreCopieur titre() {
destination.setTitre(source.getTitre());
return this;
}
}
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieur(livreIHM, livreBDD)
.auteur()
.ISBN()
.titre();
}
Ordre des paramètres
Exécution immédiate
15
Tentative #2
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieur(
source(livreIHM),
destination(livreBDD)
)
.auteur()
.ISBN()
.titre();
}
Deux classes pour
qualifier la donnée
Exécution immédiate
@AllArgsConstructor
public class Source {
private Livre donnee;
public static Source source(Livre livre) {
return new Source(livre);
}
}
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieur(livreIHM, livreBDD)
.auteur()
.ISBN()
.titre();
} 1 2
16
Tentative #3
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieur()
.source(livreIHM)
.destination(livreBDD)
.auteur()
.ISBN()
.titre();
}
Ajout au builder
Ordre appels important
Exécution immédiate
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieur(livreIHM, livreBDD)
.auteur()
.ISBN()
.titre();
} 1 2
17
Tentative #4
static void exec(Livre livreIHM,
Livre livreBDD) {
new LivreCopieurBuilder()
.depuis(livreIHM)
.vers(livreBDD)
.lesChamps()
.auteur()
.ISBN()
.titre();
}
Une classe pour les
paramètres
Une classe pour la liste
des champs
Exécution immédiate
public class LivreCopieurBuilder {
private Livre source;
private Livre destination;
public LivreCopieurBuilder vers(
Livre destination) {
this.destination = destination;
return this;
}
public LivreCopieurBuilder depuis(
Livre source) {
this.source = source;
return this;
}
public LivreCopieur lesChamps() {
return new LivreCopieur(
destination, source);
}
}
18
Tentative #5
static void exec(Livre livreIHM, Livre livreBDD) {
LivreCopieurBuilder copieur = copier()
.depuis(livreIHM)
.vers(livreBDD)
.lesChamps(champs().auteur().titre().ISBN());
copieur.appliquer();
}
Distinction création vs exécution de la règle
static void exec(Livre livreIHM, Livre livreBDD) {
LivreCopieurBuilder copieur = copier(lesChamps().auteur().titre().ISBN());
copieur.appliquerA(source(livreIHM), destination(livreBDD));
}
L’exécution (copie) est différée
19
Tentative #5
public class LivreCopieur {
private Livre destination;
private Livre source;
private List<Fonction> fonctions = new
ArrayList<Fonction>() ;
public static LivreCopieur champs () {
return new LivreCopieur();
}
public LivreCopieur auteur() {
fonctions.add(new Fonction() {
public void appliquer() {
destination.setAuteur(source.getAuteur());
}
};
return this;
}
public void copier() {
for (Fonction fonction : consommateurs) {
fonction.appliquer();
}
}
public interface Fonction {
void appliquer();
}
Nouvelle classe pour différer le traitement
public LivreCopieur auteur()
{
destination.setAuteur(
source.getAuteur());
return this;
}
1 2
20
Tentative #6
@AllArgsConstructor
public class LivreCopieurConditionnel {
private LivreCopieur copieur;
private Condition condition;
public void appliquerSousCondition(Livre source, Livre destination) {
if (condition.evaluer(source, destination)) {
copieur.copier(source, destination);
}
}
}
public interface Condition {
boolean evaluer(Livre source, Livre destination);
}
private static Condition<Livre> siNouveau() {
return new Condition<Livre>(){
boolean evaluer(Livre source,
Livre destination) {
return destination.getISBN().equals("");
}
};
}
Structure conditionnelle =>
- récupération différée de la condition
- encapsulation de la copie
21
RESULTAT ::= LISTE_COPIEURS.appliquer(SOURCE, DESTINATION)
LISTE_COPIEURS ::= copieur() | LISTE_COPIEURS .copier(COPIEUR_CONDITIONNEL)
COPIEUR_CONDITIONNEL ::= COPIEUR, CONDITION | COPIEUR, VRAI
CONDITION ::= siNouveau()
COPIEUR ::= lesChamps() | COPIEUR.CHAMP
CHAMP ::= auteur() | titre() | isbn()
SOURCE ::= depuis(DONNEE)
DESTINATION ::= vers(DONNEE)
DONNEE ::= <un livre>
VRAI ::= <booléen vrai>
Tentative : création d’un langage
static void exec(Livre livreIHM, Livre livreBDD) {
copieur()
.copier(lesChamps().auteur().titre())
.copier(lesChamps().ISBN(), siNouveau())
.appliquer(depuis(livreIHM), vers(livreBDD));
}
22
DSL : bilan
• Abstraction:
• Code plus lisible et expressif
• Augmentation du volume code (x20)
• Elaboration +/- facile
• Usage du Français
• Report de l’Anglais « ailleurs »
• Maintien de contraintes sur les langues naturelles
• Conclusions
• Francisation du code
• Maintien du vocabulaire et de la logique métier
8 classes
200 lignes (+ Lombok)
23
Développer == Créer un nouveau langage
• Code source == Briques d’un langage propre à une application
• Eléments:
• variables, classes, méthodes, etc.
• Contraintes:
• Les langages de programmation
• Les langues humaines
• Le métier de l’application
• Motivations:
• Problèmes mieux posés
• Bonne abstraction
24
Français ? Franglais ? Anglais ?
• Décider selon :
• L’interêt du logiciel
• Le contexte Projet
• Le respect d’une langue naturelle
25
Développer en DSL ?
• Façon de développer
• Augmente l’expressivité
• Coût
• Applicable à des petites parties du métier
26
Illustration : décrire un itinéraire avec une
boîte de feutre
• Venir à Norsys
• Une fois au 12 rue
Ampère, traverser la cour
intérieure de CEMOI
• Utiliser l’interphone pour
ouvrir la porte
• Franchir la porte de
l’immeuble et longer le
couloir de droite
• Monter avec l’ascenseur
ou les escaliers
• Au 2e étage, dépasser la
cuisine (sur la gauche)
• Quand le couloir vire à
gauche, tourner à droite
27
Illustration : décrire un itinéraire avec une
boîte de feutre
• Venir à Norsys
• Une fois au 12 rue
Ampère, traverser la cour
intérieure de CEMOI
• Utiliser l’interphone pour
ouvrir la porte
• Franchir la porte de
l’immeuble et longer le
couloir de droite
• Monter avec l’ascenseur
ou les escaliers
• Au 2e étage, dépasser la
cuisine (sur la gauche)
• Quand le couloir vire à
gauche, tourner à droite
Norsys
Cour CEMOI
cuisine
Ascenseur
Escaliers
12 rue Ampère
Porte
Interphone
Légende
28
Illustration : décrire un itinéraire avec une
boîte de feutre
• Venir à Norsys
• Une fois au 12 rue
Ampère, traverser la cour
intérieure de CEMOI
• Utiliser l’interphone pour
ouvrir la porte
• Franchir la porte de
l’immeuble et longer le
couloir de droite
• Monter avec l’ascenseur
ou les escaliers
• Au 2e étage, dépasser la
cuisine (sur la gauche)
• Quand le couloir vire à
gauche, tourner à droite
Norsys
Cour CEMOI
cuisine
Ascenseur
Escaliers
12 rue Ampère
Porte
Interphone
Légende
29
Les Langages Dédiés au secours du Français ?
fin
30
Les Langages Dédiés au secours du Français ?
Quand les règles métier d'une application sont décrites en Français,
comment les intégrer dans un univers très anglophone ?
En effet l'usage de langues naturelles dans un code source donne
parfois d'étrange résultats.
Dès lors, regardons si les Langages Dédiés (DSL) peuvent être une
solution pour conserver un peu d'harmonie.
31

Contenu connexe

Tendances

Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
JDK 8, lambdas, streams, collectors - Bretagne Tour
JDK 8, lambdas, streams, collectors - Bretagne TourJDK 8, lambdas, streams, collectors - Bretagne Tour
JDK 8, lambdas, streams, collectors - Bretagne TourJosé Paumard
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaCh'ti JUG
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promessesEric Toguem
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6Julien CROUZET
 
Programmation Shell Script
Programmation Shell ScriptProgrammation Shell Script
Programmation Shell ScriptBoubakr NOUR
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API RESTAbdoulaye Dieng
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojurelolopetit
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?Microsoft
 

Tendances (18)

Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Cours php
Cours phpCours php
Cours php
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
JDK 8, lambdas, streams, collectors - Bretagne Tour
JDK 8, lambdas, streams, collectors - Bretagne TourJDK 8, lambdas, streams, collectors - Bretagne Tour
JDK 8, lambdas, streams, collectors - Bretagne Tour
 
Bash bonnes pratiques
Bash bonnes pratiquesBash bonnes pratiques
Bash bonnes pratiques
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promesses
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
 
Programmation Shell Script
Programmation Shell ScriptProgrammation Shell Script
Programmation Shell Script
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojure
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?
Construire des applications parallèles avec Visual Studio 11 quoi de neuf ?
 

Similaire à Les Langages Dédiés (DSL) au secours du Français ?

Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations GreendroidGDG Nantes
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
Chapitre 4 persistance des donnees
Chapitre 4  persistance des donneesChapitre 4  persistance des donnees
Chapitre 4 persistance des donneesAmir Souissi
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDidier Plaindoux
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireAlexandru Radovici
 

Similaire à Les Langages Dédiés (DSL) au secours du Français ? (17)

Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations Greendroid
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Chapitre 4 persistance des donnees
Chapitre 4  persistance des donneesChapitre 4  persistance des donnees
Chapitre 4 persistance des donnees
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Php4 Mysql
Php4 MysqlPhp4 Mysql
Php4 Mysql
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Part1
Part1Part1
Part1
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 

Dernier

firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirstjob4
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...Institut de l'Elevage - Idele
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesInstitut de l'Elevage - Idele
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...Institut de l'Elevage - Idele
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...Institut de l'Elevage - Idele
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Ville de Châteauguay
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusInstitut de l'Elevage - Idele
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de planchermansouriahlam
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéInstitut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfSophie569778
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageInstitut de l'Elevage - Idele
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfInstitut de l'Elevage - Idele
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...Institut de l'Elevage - Idele
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...Institut de l'Elevage - Idele
 

Dernier (20)

firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdf
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentes
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de plancher
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversité
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
 
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdfJTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdf
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
 

Les Langages Dédiés (DSL) au secours du Français ?

  • 1. Franglais ? Franglish ? Frenglish ? Les Langages Dédiés (DSL) au secours du Français ? 1
  • 2. Usage de l’Anglais • Par nécessité • Prédominance américaine en Informatique • Concepts, API, documentation, etc. • « Common tongue » / langue universelle • Sens précis, vocabulaire nouveau • commit (en) == ??? (fr) • Par goût • Ca fait « IN » • Envie d’harmonie • Métier non décrit en Anglais ? 2
  • 3. Usage du Français : contraintes • Conversion : langue humaine -> langage de programmation • Accents, liaisons, ordre des mots • Synonymes / traduction • Vocabulaire multi-source • Mots des librairies bibliothèques (libraries) • Mots du métier de l’application • artisanat, droit, marine, etc. • Cohabitation : Franglais ? void emprunterLivre( Utilisateur utilisateurNouveau, Livre livreEmprunte); void emprunterUnLivre( Utilisateur nouvelUtilisateur, Livre emprunteLivre); 3
  • 4. public class BookDao { // traduction ? (Livre vs Réserver) public class LivreOad { // hors convention private EntityManager gestionnaireEntite; // nommage ? // gain sens ? abstraction ? public Livre persister(Livre livre) { // faux ami /* Larousse.fr (persister): - Demeurer ferme dans sa façon de penser ou d'agir malgré les difficultés - Durer, subsister */ public Livre sauverDurablement(Livre livre) { // précision du vocabulaire ? return gestionnaireEntite.persist(livre); // Franglais (fr-en-fr) // API en langue anglaise Usage du Franglais : horreurs 4
  • 5. Usage du Franglais => bien écrire ni le Français, ni l’Anglais • Ni le Code ? • Réponses de l’Ingénieur: • Documentation • Restreindre les parties en Français • Règles de nommage • Abstraction, faible couplage, isolation des responsabilités • Langage Dédié / Domain Specific Language (DSL) ? 5
  • 6. DSL exemples #1 • Apache Camel • http://camel.apache.org/java-dsl.html • assertJ public void configure() { from("file:src/data?noop=true") .choice() .when(xpath("/person/city = &#39;London&#39;")) .to("file:target/messages/uk") .otherwise() .to("file:target/messages/others"); }public void test() { List<TolkienCharacter> fellowshipOfTheRing = method.toTest(); assertThat(fellowshipOfTheRing) .hasSize(9) .contains(frodo, sam) .doesNotContain(sauron); } 6
  • 7. DSL exemples #2 • Spring DSL @Bean public IntegrationFlow myFlow() { return IntegrationFlows.from(this.integerMessageSource(), c -> c.poller(Pollers.fixedRate(100))) .channel(this.inputChannel()) .filter((Integer p) -> p > 0) .transform(Object::toString) .channel(MessageChannels.queue()) .get(); } 7
  • 8. DSL exemples #3 • Builders • https://www.infoq.com/articles/internal-dsls-java public void buildCar() { DreamCar car = car() .brand("Tesla") .color(RED) .fuelEfficient() .build(); } public void takeVacation() { Period vacation = Period.from("10/09/2007").to("10/17/2007"); Booking booking = vacation.book(Location.city("Paris").hotel("Hilton")); booking.add(Flight.airline("united").flight("UA-6886")); } 8
  • 9. DSL : généralités • Usages courants: configuration / data building • Interne ou Externe • DSL externes : HTML, CSS, … • DSL externes graphiques (https://docs.microsoft.com/fr- fr/visualstudio/modeling/getting-started-with-domain-specific-languages) • Vieux débats: • DSL vs library • Choix du langages de programmation (LISP, Java…) • Mise en garde: • abstraction leaks • perte de contrôle 9
  • 10. DSL : littérature • Martin Fowler • https://martinfowler.com/books/dsl.html • https://dzone.com/articles/creating-internal-dsls-java • Venkat Subramaniam • http://www.javaworld.com/article/2077865/core-java/core-java-creating- dsls-in-java-part-1-what-is-a-domain-specific-language.html 10
  • 11. DSL : les styles • Implémentation • Method chaining • Nested functions • Closures / lambdas void methodChaining() { Graph() .edge() .from("a") .to("b") .weight(12.3) .edge() .from("b") .to("c") .weight(10.5); } void nestedFunctions() { Graph( edge(from("a"), to("b"), weight(12.3), edge(from("b"), to("c"), weight(10.5) ); } 11
  • 12. DSL et Français ? • Idée : profiter d’une couche d’abstraction pour introduire du code en Français 12
  • 13. Tentative : but @Data public class Livre { private String titre; private String auteur; private String ISBN; } Règle Métier: Le ISBN ne pas être modifié 13
  • 14. Tentative : but @Data public class Livre { private String titre; private String auteur; private String ISBN; } public class LivreCopieur { public void copier(Livre livreIHM, Livre livreBDD) { if (livreBDD.getISBN().equals("")) { livreBDD.setISBN(source.getISBN()); } livreBDD.setAuteur(livreIHM.getAuteur()); livreBDD.setTitre(livreIHM.getTitre()); } } static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur().copier(livreIHM, livreBDD); } Règle Métier: Le ISBN ne pas être modifié public void copier(Livre livreIHM, Livre livreBDD) { if (aucunISBN(livreBDD) { copierISBN(livreIHM, livreBDD); } copierAuteur(livreIHM, livreBDD); copierTitre(livreIHM, livreBDD); } static void exec(Livre livreIHM, Livre livreBDD) { copieur() .copier(lesChamps().auteur().titre()) .copier(lesChamps().ISBN(), siNouveau()) .appliquer(depuis(livreIHM), vers(livreBDD)); } 1 2 3 14
  • 15. Tentative #1 @AllArgsConstructor public class LivreCopieur { private Livre source; private Livre destination; public LivreCopieur auteur() { destination.setAuteur(source.getAuteur()); return this; } public LivreCopieur ISBN() { destination.setISBN(source.getISBN()); return this; } public LivreCopieur titre() { destination.setTitre(source.getTitre()); return this; } } static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur(livreIHM, livreBDD) .auteur() .ISBN() .titre(); } Ordre des paramètres Exécution immédiate 15
  • 16. Tentative #2 static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur( source(livreIHM), destination(livreBDD) ) .auteur() .ISBN() .titre(); } Deux classes pour qualifier la donnée Exécution immédiate @AllArgsConstructor public class Source { private Livre donnee; public static Source source(Livre livre) { return new Source(livre); } } static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur(livreIHM, livreBDD) .auteur() .ISBN() .titre(); } 1 2 16
  • 17. Tentative #3 static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur() .source(livreIHM) .destination(livreBDD) .auteur() .ISBN() .titre(); } Ajout au builder Ordre appels important Exécution immédiate static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieur(livreIHM, livreBDD) .auteur() .ISBN() .titre(); } 1 2 17
  • 18. Tentative #4 static void exec(Livre livreIHM, Livre livreBDD) { new LivreCopieurBuilder() .depuis(livreIHM) .vers(livreBDD) .lesChamps() .auteur() .ISBN() .titre(); } Une classe pour les paramètres Une classe pour la liste des champs Exécution immédiate public class LivreCopieurBuilder { private Livre source; private Livre destination; public LivreCopieurBuilder vers( Livre destination) { this.destination = destination; return this; } public LivreCopieurBuilder depuis( Livre source) { this.source = source; return this; } public LivreCopieur lesChamps() { return new LivreCopieur( destination, source); } } 18
  • 19. Tentative #5 static void exec(Livre livreIHM, Livre livreBDD) { LivreCopieurBuilder copieur = copier() .depuis(livreIHM) .vers(livreBDD) .lesChamps(champs().auteur().titre().ISBN()); copieur.appliquer(); } Distinction création vs exécution de la règle static void exec(Livre livreIHM, Livre livreBDD) { LivreCopieurBuilder copieur = copier(lesChamps().auteur().titre().ISBN()); copieur.appliquerA(source(livreIHM), destination(livreBDD)); } L’exécution (copie) est différée 19
  • 20. Tentative #5 public class LivreCopieur { private Livre destination; private Livre source; private List<Fonction> fonctions = new ArrayList<Fonction>() ; public static LivreCopieur champs () { return new LivreCopieur(); } public LivreCopieur auteur() { fonctions.add(new Fonction() { public void appliquer() { destination.setAuteur(source.getAuteur()); } }; return this; } public void copier() { for (Fonction fonction : consommateurs) { fonction.appliquer(); } } public interface Fonction { void appliquer(); } Nouvelle classe pour différer le traitement public LivreCopieur auteur() { destination.setAuteur( source.getAuteur()); return this; } 1 2 20
  • 21. Tentative #6 @AllArgsConstructor public class LivreCopieurConditionnel { private LivreCopieur copieur; private Condition condition; public void appliquerSousCondition(Livre source, Livre destination) { if (condition.evaluer(source, destination)) { copieur.copier(source, destination); } } } public interface Condition { boolean evaluer(Livre source, Livre destination); } private static Condition<Livre> siNouveau() { return new Condition<Livre>(){ boolean evaluer(Livre source, Livre destination) { return destination.getISBN().equals(""); } }; } Structure conditionnelle => - récupération différée de la condition - encapsulation de la copie 21
  • 22. RESULTAT ::= LISTE_COPIEURS.appliquer(SOURCE, DESTINATION) LISTE_COPIEURS ::= copieur() | LISTE_COPIEURS .copier(COPIEUR_CONDITIONNEL) COPIEUR_CONDITIONNEL ::= COPIEUR, CONDITION | COPIEUR, VRAI CONDITION ::= siNouveau() COPIEUR ::= lesChamps() | COPIEUR.CHAMP CHAMP ::= auteur() | titre() | isbn() SOURCE ::= depuis(DONNEE) DESTINATION ::= vers(DONNEE) DONNEE ::= <un livre> VRAI ::= <booléen vrai> Tentative : création d’un langage static void exec(Livre livreIHM, Livre livreBDD) { copieur() .copier(lesChamps().auteur().titre()) .copier(lesChamps().ISBN(), siNouveau()) .appliquer(depuis(livreIHM), vers(livreBDD)); } 22
  • 23. DSL : bilan • Abstraction: • Code plus lisible et expressif • Augmentation du volume code (x20) • Elaboration +/- facile • Usage du Français • Report de l’Anglais « ailleurs » • Maintien de contraintes sur les langues naturelles • Conclusions • Francisation du code • Maintien du vocabulaire et de la logique métier 8 classes 200 lignes (+ Lombok) 23
  • 24. Développer == Créer un nouveau langage • Code source == Briques d’un langage propre à une application • Eléments: • variables, classes, méthodes, etc. • Contraintes: • Les langages de programmation • Les langues humaines • Le métier de l’application • Motivations: • Problèmes mieux posés • Bonne abstraction 24
  • 25. Français ? Franglais ? Anglais ? • Décider selon : • L’interêt du logiciel • Le contexte Projet • Le respect d’une langue naturelle 25
  • 26. Développer en DSL ? • Façon de développer • Augmente l’expressivité • Coût • Applicable à des petites parties du métier 26
  • 27. Illustration : décrire un itinéraire avec une boîte de feutre • Venir à Norsys • Une fois au 12 rue Ampère, traverser la cour intérieure de CEMOI • Utiliser l’interphone pour ouvrir la porte • Franchir la porte de l’immeuble et longer le couloir de droite • Monter avec l’ascenseur ou les escaliers • Au 2e étage, dépasser la cuisine (sur la gauche) • Quand le couloir vire à gauche, tourner à droite 27
  • 28. Illustration : décrire un itinéraire avec une boîte de feutre • Venir à Norsys • Une fois au 12 rue Ampère, traverser la cour intérieure de CEMOI • Utiliser l’interphone pour ouvrir la porte • Franchir la porte de l’immeuble et longer le couloir de droite • Monter avec l’ascenseur ou les escaliers • Au 2e étage, dépasser la cuisine (sur la gauche) • Quand le couloir vire à gauche, tourner à droite Norsys Cour CEMOI cuisine Ascenseur Escaliers 12 rue Ampère Porte Interphone Légende 28
  • 29. Illustration : décrire un itinéraire avec une boîte de feutre • Venir à Norsys • Une fois au 12 rue Ampère, traverser la cour intérieure de CEMOI • Utiliser l’interphone pour ouvrir la porte • Franchir la porte de l’immeuble et longer le couloir de droite • Monter avec l’ascenseur ou les escaliers • Au 2e étage, dépasser la cuisine (sur la gauche) • Quand le couloir vire à gauche, tourner à droite Norsys Cour CEMOI cuisine Ascenseur Escaliers 12 rue Ampère Porte Interphone Légende 29
  • 30. Les Langages Dédiés au secours du Français ? fin 30
  • 31. Les Langages Dédiés au secours du Français ? Quand les règles métier d'une application sont décrites en Français, comment les intégrer dans un univers très anglophone ? En effet l'usage de langues naturelles dans un code source donne parfois d'étrange résultats. Dès lors, regardons si les Langages Dédiés (DSL) peuvent être une solution pour conserver un peu d'harmonie. 31