• 12 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 01/08/2024

Implémentez différentes fonctions

Maintenant que vous êtes devenu incollable pour déclarer vos variables en Kotlin, nous allons aborder une notion tout aussi utile : les fonctions (appelées également "méthodes" dans certains autres langages, dont Java).

Bonjour tout le monde !

Commençons doucement, et décortiquons ensemble une fonction toute simple :

fun main(args: Array<String>) {
    println("Hello, world!")
}

Expliquons un peu plus en détail ces lignes :

  • Le mot-clé  fun  suivi de son nom nous permet de définir une fonction, puis de la nommer.

  • Le type du paramètre (  Array<String>  ) est indiqué après son nom (  args  ). Les deux points  :  indiquent toujours la déclaration d’un type en Kotlin.

  • Une fonction peut se déclarer dans un fichier Kotlin (possédant l’extension .kt) sans être à l’intérieur d’une classe. Nous en parlerons en détail un peu plus tard.

  • Nous affichons dans la console du texte grâce à la commande  println() . C’est l’équivalent du fameux  System.out.println  en Java.

  • Là encore, vous n’avez pas besoin d’ajouter un point-virgule pour terminer votre instruction… ;)

Ajoutons un peu de complexité…

Essayons maintenant de créer une fonction qui retourne la valeur la plus petite entre deux variables passées en paramètres.

private fun minOf(a: Int, b: Int): Int {
    return if (a < b) a else b
}

Comme vous pouvez le voir, les paramètres de la fonction sont séparés par une virgule, comme en Java. En revanche, afin de retourner une valeur de type  Int , nous allons utiliser encore une fois les deux points  :  à la fin de notre fonction. Plutôt simple, non ?

Effectivement ! En revanche, je trouve la condition un peu bizarre... Es-tu sûr que le code s’exécute correctement ?

Parfaitement sûr ! N’hésitez pas à faire le test vous-même… ;) En fait, vous avez mis le doigt sur quelque chose d’assez important en Kotlin, à savoir la différence entre une expression et une instruction.

Instruction ou expression ?

En Kotlin,  if  est une expression et non pas une instruction comme en Java. D’ailleurs, en Java, toutes les structures de contrôles sont des instructions !

Euh d’accord, mais quelle est la différence entre ces deux notions ?

Ah oui, pardon ! Une expression ("expression", en anglais) est une combinaison d'un ou plusieurs valeurs, constantes, variables, opérateurs et fonctions qu’un langage de programmation va interpréter, puis calculer, pour finalement en produire une valeur différente.

Pour faire plus simple, une expression est toute partie de votre code qui peut retourner une valeur. Ainsi,  1+1  est une expression,  maxOf(5, 7)  est une expression, etc.

À l’inverse, une instruction ("statement", en anglais) est la plus petite partie d’un élément indépendant de votre code qui attend qu’une action soit effectuée.

Pour faire plus simple, une instruction est un bloc de code qui ne retourne aucune valeur. Par exemple,  var username = "Phil"  est une instruction.

Si je vous parle de tout cela, c’est qu’en Kotlin, la plupart des structures de contrôle sont considérées comme des expressions et retourneront donc une valeur, même si vous ne l’avez pas spécifié. Par exemple, notre premier exemple "Hello World !" retourne en réalité une valeur de type Unit, le type par défaut créé par Kotlin. Il correspond au  void  de Java.

Nous serons donc en mesure de faire ceci sans problème : 

fun main(args: Array<String>) {
    println("Hello, world!")
}

var hello: Unit = main(arrayOf(""))

Ce qui donnera le résultat ci-dessous :

Le résultat de votre Type Unit en Kotlin s'affiche : Hello, world ! Hello, world !
Observez le résultat de votre Type Unit en Kotlin

Bon, ça, c’est le côté théorique. En pratique, vous n’allez quasiment jamais utiliser le type  Unit  , ce dernier étant déduit automatiquement, même si vous ne le renseignez pas (vous vous souvenez, grâce à l’inférence de type… ;) ).

Mais à quoi vont bien pouvoir nous servir les "expressions" en Kotlin ?

J’allais y venir ! Reprenons notre précédente méthode  minOf() . Nous venons de voir que la structure de contrôle  if  était considérée comme une expression, et cela va donc nous permettre de réaliser ce genre de chose :

private fun minOf(a: Int, b: Int): Int = if (a < b) a else b

On peut encore optimiser la lisibilité de cette fonction grâce à l'inférence de type :

private fun minOf(a: Int, b: Int) = if (a < b) a else b

Whoa ! Plutôt sympa et très lisible, non ? En fait, nous venons de créer une fonction qui n’a pas de corps (c’est-à-dire qu’elle n’a pas de  { } ), mais plutôt une expression à la place.

Cette syntaxe doit vous changer, non ? :) D’ailleurs, celle-ci ne se limite pas aux fonctions retournant explicitement des valeurs ! Par exemple, le code suivant est tout à fait fonctionnel :

fun sayHello() = println("Hello!")

... équivaut à :

fun sayHello(): Unit = println("Hello!")

... équivaut à :

fun sayHello(): Unit { println("Hello!") }

Intéressant, n’est-ce pas ? L’objectif de Kotlin est vraiment de rendre votre code le plus lisible possible, afin d’améliorer encore plus votre productivité.

Une dernière chose importante à savoir : si votre fonction possède un corps et que vous souhaitez retourner une valeur, l’inférence de type ne fonctionnera pas dans ce cas-là. Kotlin a fait ce choix afin d’optimiser les performances de son compilateur (la déduction du type à retourner dans un corps de fonction de plusieurs dizaines de lignes peut s'avérer vite complexe et gourmande en ressources).

// 😱
fun getUrlApi() { return "https://www.my.api.com" }

// 🙂
fun getUrlApi(): String { return "https://www.my.api.com" }

// 😎
fun getUrlApi() = "https://www.my.api.com"

Practice Makes Perfect!

La théorie, c'est bien, mais la pratique, c'est encore mieux ! Justement, nous vous avons concocté un petit exercice interactif de fin de chapitre pour appliquer toutes ces nouvelles connaissances.

En résumé

  • Une fonction se déclare grâce au mot-clé  fun  en Kotlin.

  • Le type d’un paramètre de fonction est indiqué après son nom. Les deux points  :  indiquent toujours la déclaration d’un type en Kotlin.

  • Une expression est une partie de votre code qui peut retourner une valeur. Une instruction est un bloc de code qui ne retourne aucune valeur.

  • En Kotlin, toutes les fonctions retournent une valeur, même si aucun type de retour n’est mentionné (le type retourné par défaut sera alors Unit).

  • Une fonction n’est pas obligée de posséder un corps et peut contenir uniquement une expression.

Pour aller plus loin :

Vous savez désormais implémenter des fonctions en Kotlin. La prochaine étape ? Générez vos premières classes !

Exemple de certificat de réussite
Exemple de certificat de réussite