compojure-api
Swagger & Schema FTW!
Guillaume Buisson & Yann Esposito
Vigiglobe
API?
- Documentation?
- Fast?
- Libraries?
Language Fonctionnel
Déclaratif vs Impératif
Fainéant
⇒ Structures infinies !!!
Système de Typage Moderne
⇒ Agréable & Utile !
Propriétés par défaut
- Fonctionnel par défaut
- Pur par défaut
- Fainéant par défaut
- Système de typage hors du commun
Encourage les bons choix par défaut
Utilisation
- Protège contre la distraction
- Protège contre sa bêtise
- Force les meilleurs usages
- Diminue le nombre de tests nécessaires
Production ?
- OUI (CUFP)
- Très peu de bugs (finance, web, ...)
- De nombreuses bibliothèques (hackage)
- Adaptabilité du code phénoménale
Vitesse
- C : ~ ½×
- Java : ~ 1×
- Dart : ~ 5×
- Python : ~ 12×
- Ruby : ~ 13×
- PHP : ~ 28×
source CLBG
Workflows (basic)
- Programmer
- tester en cliquant/scrollant, REPL, etc...
- 90% → détecter une erreur ⇒ goto 1
- envoyer en (recette/production)
- 50% (10% si recette) → Erreur en production ⇒ ARGH!!! goto 1
Workflows (TDD)
- Écrire des tests (voir workflow basic)
- Programmer
- lancer les tests (66% erreur ⇒ goto 2 ou 1)
- tester en cliquant/scrollant, REPL, etc...
- 30% détecter une erreur ⇒ goto 1
- envoyer en (recette/production)
- 5 à 10%: Erreur en production ⇒ ARGH !!! goto 1
Workflows Haskell (Type DD)
- Programmer
- Compiler (90% erreur, corriger avec l'aide goto 1)
- tester en cliquant/scrollant, REPL, etc...
- 3% → détecter une erreur ⇒ goto 1
- envoyer en (recette/production)
- 0.5% → Erreur en production ⇒ ARGH !!! goto 1
0,5% c'est encore trop!
QuickCheck
, SmallCheck
:
engendrent des tests unitaires aléatoirement
HUnit
:
Tests unitaires
Facile ?
- Pas vraiment
- Nécessite un réel investissement
- Aide à la conception
Exemples (1)
[1,2,3] == [1..3]
[1,2,3] == [1,2] ++ [3]
[1,2,3] == 1:2:[]
[1,3..10] == [1,3,5,7,9]
[1,3..10] !! 3 == 7
[1,'a',3] ✗
[(1,'a'),(3,'c')] ✓
Exemples (2)
fib = 0:1:zipWith (+) fib (tail fib)
take 15 fib ⇔
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]
fib !! 200 ⇔
280571172992510140037611932413038677189525
Exemples (3)
sort [] = []
sort (x:xs) = sort [y | y <- xs, y < x] ++
[x] ++
sort [y | y <- xs, y >= x]
Exemples (3bis)
sort [] = []
sort (x:xs) = sort (filter (< x) xs) ++
[x] ++
sort (filter (>= x) xs)
Le bon choix par défaut
data Metres a = Metres a
data Pieds a = Pieds a
launchTheMissiles :: Metres Integer -> IO ()
launchTheMissiles n = do ...
launchTheMissile 100 ✗
hauteur = Pieds 3000
launchTheMissile hauteur ✗
launchTheMissile (pieds2Metres hauteur) ✓
IO DSL
main = do
putStrLn "Quel est votre nom?"
nom <- readLine
putStrLn ("Bonjour " ++ nom)
Conclusion
- Language très haut niveau
- Rapide
- Sûr / moins de tests nécessaires
- Le bon choix par défaut
- Ouvre l'esprit