SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
État de l’art
Benjamin Lacroix
@benjlacroix
Sergio Dos Santos
@sergiodsr
Kotlin
1
▼ Historique
▼ Impact
▼ Apports
▼ Où l’utiliser ?
▼ Tests
▼ Qualité
▼ Oui, choisissez Kotlin
Agenda
2
Historique
Historique
Motivations du projet
▼ Besoin d’un nouveau langage
▽ Plus riche que Java mais JVM-compatible
▽ Plus riche et simple que d’autres langages JVM
▼ Statiquement typé, orienté objet et fonctionnel
▼ Pragmatisme
▽ Utilité des fonctionnalités
▽ Réutilisation du code et des outils
https://www.infoworld.com/article/2622405/java/jetbrains-readies-jvm-based-language.html
https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/
3
Historique
Historique
Dates clés
▼ 2011 Annonce
▽ Equipe JetBrains
▼ 2012 Open Source (Apache 2)
▼ 2016 Kotlin v1.0
▼ 2017 Kotlin v1.1
https://www.infoworld.com/article/2622405/java/jetbrains-readies-jvm-based-language.html
https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/
https://www.google.fr/maps/place/Kotline/@59.9953349,29.7136349,10.06z
4
Place 80 à 41 en 2017 TIOBE
https://www.tiobe.com/tiobe-index/
5
6
Apports clés du langage
Apports clés du langage
Un peu de Code !
7
Apports clés du langage
Un programme simple en Kotlin
Hello Kotlin
val bob = "Bob"
fun greet(name: String) = "Hello $name"
fun main(args: Array<String>) {
println(greet(bob))
}
8
Apports clés du langage
Références non nullables par défaut
Quelles NullPointerException ?
class Address(val city: String)
class User(val name: String, val address: Address?)
val user1 = User("Bob", Address("Paris"))
val user2 = User("Bob", null)
val city = user2.address?.city ?: "Unknown"
https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare
9
Apports clés du langage
Inférence de type par branche
Smart Cast
interface Price
class StandardPrice(val value: Int) : Price
class PromotionalPrice(val value: Int, val discount: Int) :
Price
fun computePrice(price: Price): Int = when (price) {
is StandardPrice -> price.value
is PromotionalPrice -> price.value - price.discount
else -> 0
} 10
Apports clés du langage
Fonctions en tant que variables
Lambda
val greet: (String) -> String = { name -> "Hello $name" }
fun addEventListener(listener: (Event) -> Unit) {
// ...
}
addEventListener {
it.key
// ...
} 11
Apports clés du langage
Augmenter du code existant facilement
Extension
fun Int.square(): Int = this * this
val result = 42.square()
fun String.greet(): String = "Hello $this"
val greet = "Bob".greet()
12
Apports clés du langage
Data class, Destructuration, Collections
Et tellement plus
data class MyTime(val hour: Int, val minute: Int)
val copy = MyTime(11, 11).copy(hour = 15)
val times = listOf(MyTime(11, 11), MyTime(12, 34))
times.map { (hour, minute) -> "$hour:$minute" }
13
Où est mon Kotlin ?
Kotlin est partout
Applications Back
▼ **/*.jar
▼ Build Gradle en Kotlin
▼ Spring / Spring Boot
▼ RxJava / RxKotlin
▼ Reactor (Natif)
▼ Jackson
https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin
https://spring.io/blog/2017/03/28/reactor-kotlin-extensions-1-0-0-m1-released
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way
https://github.com/ReactiveX/RxKotlin
14
Où est mon Kotlin ?
Kotlin est partout
Application classique Spring Boot
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
@RestController
@SpringBootApplication
class Application {
@GetMapping
fun hello() = "Hello World"
} 15
Où est mon Kotlin ?
Kotlin est partout
Langage augmenté par les bibliothèques
data class User(val name: String, val age: Int)
val mapper = ObjectMapper().registerModule(KotlinModule())
mapper.writeValueAsString(User("Bob", 30))
listOf(User("Bob", 30), User("Alice", 30))
.toFlux()
.sample(Duration.ofMillis(100))
.subscribe(::println)
16
Où est mon Kotlin ?
Kotlin est partout
Sur Android
vs
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game)
nameTextView.text = "Hey"
}
17
Où est mon Kotlin ?
Kotlin est partout
Sur Android
private val timeFormat: SimpleDateFormat by lazy {
SimpleDateFormat(getString(R.string.hour_pattern), Locale.getDefault())
}
override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
val view = holder?.itemView
when (view) {
is TextView -> view.text = "hey"
is ImageView -> view.setImageDrawable(ContextCompat.getDrawable(context,
R.mipmap.ic_launcher))
}
} 18
Qualité du code
Tests
Outillage de test en Kotlin
▼ JUnit
▼ Spek
▽ given, on, it / describe, on, it
▽ Pas d’assertions
▼ KotlinTest
▽ Port de ScalaTest
▽ Assertions
http://junit.org/junit5/
https://github.com/kotlintest/kotlintest
http://spekframework.org/docs/
19
Qualité du code
Tests
Exemple avec KotlinTest
mapOf(-1 to 1, 1 to 1, 2 to 2, 3 to 6, 4 to 24).forEach {
"factorial(${it.key}) should be ${it.value}" {
factorial(it.key).shouldBe(it.value)
}
}
20
Qualité du code
Analyse syntaxique et bugs
https://github.com/arturbosch/sonar-kotlin
21
KO
KO
OK
OK
OKOK
Qualité du code
Analyse syntaxique et bugs
https://github.com/arturbosch/detekt
https://ktlint.github.io/
22
Kotlin is Fun
Toujours pas convaincu ?
Ils utilisent déjà Kotlin
23
Merci
Essayer Kotlin c’est l’adopter !
▼ 100% interopérable avec Java
▼ Null-safety
▼ Smart casts
▼ Lambda & fonction inline
▼ Data classes
24
Q/A
Benjamin Lacroix
@benjlacroix
Sergio Dos Santos
@sergiodsr
Un slide
Pourquoi Kotlin
un autre titre
Permet à minima la même chose que Java, en plus concis et plus élégant ; sur Android
apporte les nouveautés Java 8, 9 et +
Plus sur et concis que JavaScript tout en gardant la même expressivité
Kotlin s’inspire de Groovy, apparaît 8 ans après et est statiquement typé rendant le
code plus fiable à la compilation
Scala a été créé en université, Kotlin chez un éditeur de logiciel ; le second a été pensé
pour compiler rapidement et bénéficier de bons outils de support. Kotlin est pensé
pour fonctionner avec Java, Scala peut fonctionner avec Java
Swift est comme Kotlin, Kotlin est comme Swift, 2 langages, 2 plateformes
25
Où est mon Kotlin ?
Kotlin est partout
Dans le navigateur ou dans Node
Depuis septembre 2016
Compiler Kotlin en Javascript via
● Gradle
● Intellij Idea
● Maven
● La ligne de commande
Interaction avec le DOM
Kotlinx.html pour générer des éléments HTML
fun main(args: Array<String>) {
println("Hello JavaScript!")
}
https://kotlinlang.org/docs/tutorials/javascript/kotlin-to-javascript/kotlin-to-javascript.html
26
Apports clés du langage
Hiérarchie de classe fermée
Sealed Class
sealed class Price
class StandardPrice(val value: Int) : Price()
class PromotionalPrice(val value: Int, val discount: Int) :
Price()
fun computePrice(price: Price): Int = when (price) {
is StandardPrice -> price.value
is PromotionalPrice -> price.value - price.discount
// else -> 0
} 27
Agenda
CFP : https://cfp.xebicon.fr/cfp/proposal/edit/ELM-6166
Talk : FR
Format : Fast Track ~15min + ~5min de QA
Why : Kotlin est-il production ready?
Plan :
● Historique rapide de Kotlin
● Fast forward Kotlin jusqu’à la Keynote IO B
● Apport(s) clé(s) du langage !
● Feedback Kotlin everywhere (Back, Mobile, Front, Native)
a. Back: SpringBoot / Vertx / Ktor
b. Mobile: Coroutines / Lambdas / … B
c. Native / Front: Native => alpha, Front => mappings ts (pas trop de détail là dessus) B
● Code quality
a. Tests: JUnit5 / Spek / Kotlin-test
b. Linters ? Sonar ? B
● Pourquoi Kotlin et pas Java / Scala / Groovy / Javascript (à discuter, cf. prez sdeleuze)
● Next step B
a. Faites du Kotlin, l’adopter c’est l’aimer
28
Apports clés du langage
Créer des builders simplement
Extension en paramètre
fun build(name: String, init: Build.() -> Unit): Build {
val build = Build(name)
build.init()
return build
}
fun myBuild() = build("myProject") {
dependency("libA")
dependency("libB")
} 29
30
31

Más contenido relacionado

La actualidad más candente

Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+ekino
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyFrançois Petitit
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureJonathan Bonzy
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
Symfony et Sonata Project chez Canal+
Symfony et Sonata Project chez Canal+ Symfony et Sonata Project chez Canal+
Symfony et Sonata Project chez Canal+ ekino
 
Performance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyPerformance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyXavier Leune
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
Migrer de framework : de la réflexion à l'action
Migrer de framework : de la réflexion à l'actionMigrer de framework : de la réflexion à l'action
Migrer de framework : de la réflexion à l'actionXavier Leune
 
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...Publicis Sapient Engineering
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...Publicis Sapient Engineering
 
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme Egron
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme EgronXebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme Egron
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme EgronPublicis Sapient Engineering
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureParis Container Day
 
L'integration continue pour tous
L'integration continue pour tousL'integration continue pour tous
L'integration continue pour tousAurelien Navarre
 
DevOps : mission [im]possible ?
DevOps : mission [im]possible ?DevOps : mission [im]possible ?
DevOps : mission [im]possible ?rfelden
 
Paris Container Day 2016 : Cloudunit v2 (Treeptik)
Paris Container Day 2016 : Cloudunit v2 (Treeptik)Paris Container Day 2016 : Cloudunit v2 (Treeptik)
Paris Container Day 2016 : Cloudunit v2 (Treeptik)Publicis Sapient Engineering
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryDamien Goldenberg
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 

La actualidad más candente (20)

Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacy
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
Symfony et Sonata Project chez Canal+
Symfony et Sonata Project chez Canal+ Symfony et Sonata Project chez Canal+
Symfony et Sonata Project chez Canal+
 
Performance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfonyPerformance au quotidien dans un environnement symfony
Performance au quotidien dans un environnement symfony
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Migrer de framework : de la réflexion à l'action
Migrer de framework : de la réflexion à l'actionMigrer de framework : de la réflexion à l'action
Migrer de framework : de la réflexion à l'action
 
DevOps with OpenShift
DevOps with OpenShiftDevOps with OpenShift
DevOps with OpenShift
 
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...
XebiCon'17 : Construire des applications résilientes en multi-cloud - Bastien...
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
 
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme Egron
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme EgronXebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme Egron
XebiCon'17 : Serverless is the new back - Jérémy Pinsolle et Gérôme Egron
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse Faure
 
L'integration continue pour tous
L'integration continue pour tousL'integration continue pour tous
L'integration continue pour tous
 
DevOps : mission [im]possible ?
DevOps : mission [im]possible ?DevOps : mission [im]possible ?
DevOps : mission [im]possible ?
 
Paris Container Day 2016 : Cloudunit v2 (Treeptik)
Paris Container Day 2016 : Cloudunit v2 (Treeptik)Paris Container Day 2016 : Cloudunit v2 (Treeptik)
Paris Container Day 2016 : Cloudunit v2 (Treeptik)
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous Delivery
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
REX Openshift à la Poste
REX Openshift à la PosteREX Openshift à la Poste
REX Openshift à la Poste
 

Similar a XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos

C++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in ParisC++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in Parischristophep21
 
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Microsoft
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)ISIG
 
Développement Android avec le langage Kotlin
Développement Android avec le langage KotlinDéveloppement Android avec le langage Kotlin
Développement Android avec le langage KotlinMacha DA COSTA
 
Retour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, KubernetesRetour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, KubernetesVincent Composieux
 
Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009guest60b8020b
 
Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Julien Garderon
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureMarc Nazarian
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 

Similar a XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos (20)

C++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in ParisC++ 11 - Tech Days 2014 in Paris
C++ 11 - Tech Days 2014 in Paris
 
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)Programmation événementielle avec VB (ISIG)
Programmation événementielle avec VB (ISIG)
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Kotlin pour Android
Kotlin pour AndroidKotlin pour Android
Kotlin pour Android
 
Développement Android avec le langage Kotlin
Développement Android avec le langage KotlinDéveloppement Android avec le langage Kotlin
Développement Android avec le langage Kotlin
 
Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015Compte rendu Blend Web Mix 2015
Compte rendu Blend Web Mix 2015
 
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
 
Retour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, KubernetesRetour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, Kubernetes
 
Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009
 
Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Organiser son CI/CD - présentation
Organiser son CI/CD - présentation
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Vs2008 Linq
Vs2008 LinqVs2008 Linq
Vs2008 Linq
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Introduction à MacRuby
Introduction à MacRubyIntroduction à MacRuby
Introduction à MacRuby
 

Más de Publicis Sapient Engineering

XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainXebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainPublicis Sapient Engineering
 
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurXebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurPublicis Sapient Engineering
 
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...Publicis Sapient Engineering
 
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin Publicis Sapient Engineering
 
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?Publicis Sapient Engineering
 
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?Publicis Sapient Engineering
 
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéXebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéPublicis Sapient Engineering
 
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...Publicis Sapient Engineering
 
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !Publicis Sapient Engineering
 
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizXebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizPublicis Sapient Engineering
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéPublicis Sapient Engineering
 
XebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectXebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectPublicis Sapient Engineering
 
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...Publicis Sapient Engineering
 
XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018Publicis Sapient Engineering
 
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...Publicis Sapient Engineering
 
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...Publicis Sapient Engineering
 

Más de Publicis Sapient Engineering (20)

XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainXebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
 
Xebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to CloudXebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to Cloud
 
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurXebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
 
XebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern InfrastructureXebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern Infrastructure
 
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
 
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
 
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
 
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
 
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéXebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
 
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
 
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
 
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizXebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
 
XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilité
 
XebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectXebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID Connect
 
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
 
XebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an aprèsXebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an après
 
XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018
 
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
 
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
 

XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos

  • 1. État de l’art Benjamin Lacroix @benjlacroix Sergio Dos Santos @sergiodsr Kotlin 1
  • 2. ▼ Historique ▼ Impact ▼ Apports ▼ Où l’utiliser ? ▼ Tests ▼ Qualité ▼ Oui, choisissez Kotlin Agenda 2
  • 3. Historique Historique Motivations du projet ▼ Besoin d’un nouveau langage ▽ Plus riche que Java mais JVM-compatible ▽ Plus riche et simple que d’autres langages JVM ▼ Statiquement typé, orienté objet et fonctionnel ▼ Pragmatisme ▽ Utilité des fonctionnalités ▽ Réutilisation du code et des outils https://www.infoworld.com/article/2622405/java/jetbrains-readies-jvm-based-language.html https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/ 3
  • 4. Historique Historique Dates clés ▼ 2011 Annonce ▽ Equipe JetBrains ▼ 2012 Open Source (Apache 2) ▼ 2016 Kotlin v1.0 ▼ 2017 Kotlin v1.1 https://www.infoworld.com/article/2622405/java/jetbrains-readies-jvm-based-language.html https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/ https://www.google.fr/maps/place/Kotline/@59.9953349,29.7136349,10.06z 4
  • 5. Place 80 à 41 en 2017 TIOBE https://www.tiobe.com/tiobe-index/ 5
  • 6. 6
  • 7. Apports clés du langage Apports clés du langage Un peu de Code ! 7
  • 8. Apports clés du langage Un programme simple en Kotlin Hello Kotlin val bob = "Bob" fun greet(name: String) = "Hello $name" fun main(args: Array<String>) { println(greet(bob)) } 8
  • 9. Apports clés du langage Références non nullables par défaut Quelles NullPointerException ? class Address(val city: String) class User(val name: String, val address: Address?) val user1 = User("Bob", Address("Paris")) val user2 = User("Bob", null) val city = user2.address?.city ?: "Unknown" https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare 9
  • 10. Apports clés du langage Inférence de type par branche Smart Cast interface Price class StandardPrice(val value: Int) : Price class PromotionalPrice(val value: Int, val discount: Int) : Price fun computePrice(price: Price): Int = when (price) { is StandardPrice -> price.value is PromotionalPrice -> price.value - price.discount else -> 0 } 10
  • 11. Apports clés du langage Fonctions en tant que variables Lambda val greet: (String) -> String = { name -> "Hello $name" } fun addEventListener(listener: (Event) -> Unit) { // ... } addEventListener { it.key // ... } 11
  • 12. Apports clés du langage Augmenter du code existant facilement Extension fun Int.square(): Int = this * this val result = 42.square() fun String.greet(): String = "Hello $this" val greet = "Bob".greet() 12
  • 13. Apports clés du langage Data class, Destructuration, Collections Et tellement plus data class MyTime(val hour: Int, val minute: Int) val copy = MyTime(11, 11).copy(hour = 15) val times = listOf(MyTime(11, 11), MyTime(12, 34)) times.map { (hour, minute) -> "$hour:$minute" } 13
  • 14. Où est mon Kotlin ? Kotlin est partout Applications Back ▼ **/*.jar ▼ Build Gradle en Kotlin ▼ Spring / Spring Boot ▼ RxJava / RxKotlin ▼ Reactor (Natif) ▼ Jackson https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin https://spring.io/blog/2017/03/28/reactor-kotlin-extensions-1-0-0-m1-released https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way https://github.com/ReactiveX/RxKotlin 14
  • 15. Où est mon Kotlin ? Kotlin est partout Application classique Spring Boot fun main(args: Array<String>) { runApplication<Application>(*args) } @RestController @SpringBootApplication class Application { @GetMapping fun hello() = "Hello World" } 15
  • 16. Où est mon Kotlin ? Kotlin est partout Langage augmenté par les bibliothèques data class User(val name: String, val age: Int) val mapper = ObjectMapper().registerModule(KotlinModule()) mapper.writeValueAsString(User("Bob", 30)) listOf(User("Bob", 30), User("Alice", 30)) .toFlux() .sample(Duration.ofMillis(100)) .subscribe(::println) 16
  • 17. Où est mon Kotlin ? Kotlin est partout Sur Android vs override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_game) nameTextView.text = "Hey" } 17
  • 18. Où est mon Kotlin ? Kotlin est partout Sur Android private val timeFormat: SimpleDateFormat by lazy { SimpleDateFormat(getString(R.string.hour_pattern), Locale.getDefault()) } override fun onBindViewHolder(holder: MyViewHolder?, position: Int) { val view = holder?.itemView when (view) { is TextView -> view.text = "hey" is ImageView -> view.setImageDrawable(ContextCompat.getDrawable(context, R.mipmap.ic_launcher)) } } 18
  • 19. Qualité du code Tests Outillage de test en Kotlin ▼ JUnit ▼ Spek ▽ given, on, it / describe, on, it ▽ Pas d’assertions ▼ KotlinTest ▽ Port de ScalaTest ▽ Assertions http://junit.org/junit5/ https://github.com/kotlintest/kotlintest http://spekframework.org/docs/ 19
  • 20. Qualité du code Tests Exemple avec KotlinTest mapOf(-1 to 1, 1 to 1, 2 to 2, 3 to 6, 4 to 24).forEach { "factorial(${it.key}) should be ${it.value}" { factorial(it.key).shouldBe(it.value) } } 20
  • 21. Qualité du code Analyse syntaxique et bugs https://github.com/arturbosch/sonar-kotlin 21 KO KO OK OK OKOK
  • 22. Qualité du code Analyse syntaxique et bugs https://github.com/arturbosch/detekt https://ktlint.github.io/ 22
  • 23. Kotlin is Fun Toujours pas convaincu ? Ils utilisent déjà Kotlin 23
  • 24. Merci Essayer Kotlin c’est l’adopter ! ▼ 100% interopérable avec Java ▼ Null-safety ▼ Smart casts ▼ Lambda & fonction inline ▼ Data classes 24 Q/A Benjamin Lacroix @benjlacroix Sergio Dos Santos @sergiodsr
  • 25. Un slide Pourquoi Kotlin un autre titre Permet à minima la même chose que Java, en plus concis et plus élégant ; sur Android apporte les nouveautés Java 8, 9 et + Plus sur et concis que JavaScript tout en gardant la même expressivité Kotlin s’inspire de Groovy, apparaît 8 ans après et est statiquement typé rendant le code plus fiable à la compilation Scala a été créé en université, Kotlin chez un éditeur de logiciel ; le second a été pensé pour compiler rapidement et bénéficier de bons outils de support. Kotlin est pensé pour fonctionner avec Java, Scala peut fonctionner avec Java Swift est comme Kotlin, Kotlin est comme Swift, 2 langages, 2 plateformes 25
  • 26. Où est mon Kotlin ? Kotlin est partout Dans le navigateur ou dans Node Depuis septembre 2016 Compiler Kotlin en Javascript via ● Gradle ● Intellij Idea ● Maven ● La ligne de commande Interaction avec le DOM Kotlinx.html pour générer des éléments HTML fun main(args: Array<String>) { println("Hello JavaScript!") } https://kotlinlang.org/docs/tutorials/javascript/kotlin-to-javascript/kotlin-to-javascript.html 26
  • 27. Apports clés du langage Hiérarchie de classe fermée Sealed Class sealed class Price class StandardPrice(val value: Int) : Price() class PromotionalPrice(val value: Int, val discount: Int) : Price() fun computePrice(price: Price): Int = when (price) { is StandardPrice -> price.value is PromotionalPrice -> price.value - price.discount // else -> 0 } 27
  • 28. Agenda CFP : https://cfp.xebicon.fr/cfp/proposal/edit/ELM-6166 Talk : FR Format : Fast Track ~15min + ~5min de QA Why : Kotlin est-il production ready? Plan : ● Historique rapide de Kotlin ● Fast forward Kotlin jusqu’à la Keynote IO B ● Apport(s) clé(s) du langage ! ● Feedback Kotlin everywhere (Back, Mobile, Front, Native) a. Back: SpringBoot / Vertx / Ktor b. Mobile: Coroutines / Lambdas / … B c. Native / Front: Native => alpha, Front => mappings ts (pas trop de détail là dessus) B ● Code quality a. Tests: JUnit5 / Spek / Kotlin-test b. Linters ? Sonar ? B ● Pourquoi Kotlin et pas Java / Scala / Groovy / Javascript (à discuter, cf. prez sdeleuze) ● Next step B a. Faites du Kotlin, l’adopter c’est l’aimer 28
  • 29. Apports clés du langage Créer des builders simplement Extension en paramètre fun build(name: String, init: Build.() -> Unit): Build { val build = Build(name) build.init() return build } fun myBuild() = build("myProject") { dependency("libA") dependency("libB") } 29
  • 30. 30
  • 31. 31