Cours de Programmation Kotlin PDF
Document Details
Uploaded by Deleted User
Institut Spécialisé en Nouvelles Technologies de l'Information et de la Communication
2024
OFPPT
Yassine AFOUDI
Tags
Summary
These are lecture notes on Kotlin programming, with examples and exercises. More specifically, this document covers topics such as lambda expressions, expressions and operators, lazy loading, anonymous functions, high order functions and inline. Also, extension functions, extension properties and more in-depth examples are given.
Full Transcript
Institut Spécialisé en Nouvelles Technologies de l'Information et de la Communication Béni Mellal M202 Programmation KOTLIN Yassine AFOUDI yassine.afoudi@ofppt...
Institut Spécialisé en Nouvelles Technologies de l'Information et de la Communication Béni Mellal M202 Programmation KOTLIN Yassine AFOUDI [email protected] 2024-2025 Rappel: Les expressions lambdas Les expressions et opérateurs Le Lazy loading Les fonctions anonymes Les high-order Functions et inline 2 PARTIE 3: MAÎTRISER LES FONCTIONS ET LAMBDAS PLAN 6. Les fonctions d'extension 3 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Les fonctions d'extension en Kotlin permettent d'ajouter des fonctionnalités à une classe existante sans la modifier ni en hériter. Cela est utile pour étendre des classes tierces ou des classes que vous ne pouvez pas modifier, comme les classes de la bibliothèque standard de Kotlin 4 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Une fonction d'extension est définie en dehors de la classe, en utilisant la syntaxe suivante : 5 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Exemple: Ajouter une méthode estPair à la classe Int : 6 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Propriétés d'extension: Vous pouvez également définir des propriétés d'extension. Ces propriétés sont calculées à chaque accès et ne peuvent pas avoir de champ sous-jacent. 7 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Exercice: Écrivez une fonction d'extension inverserMots pour la classe String qui permet d'inverser l'ordre des mots dans une phrase. 8 Partie 3 - MAÎTRISER LES FONCTIONS ET LAMBDAS Les fonctions d'extension Correction: 9 PARTIE 4: MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Dans ce module, vous allez : Utiliser les types checks et Casts Type Aliases en Kotlin Type safe builders Introduire les coroutines 10 PARTIE 4: MAITRISER LES ASPECTS AVANCÉS DE KOTLIN PLAN 1. Utiliser les types checks et casts 2. Type Aliases en Kotlin 3. Type safe builders 4. Introduire les coroutines 11 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS En Kotlin, les type checks (vérification des types) et casts (conversions de types) permettent de vérifier ou convertir des objets d'un type à un autre. Kotlin offre des fonctionnalités puissantes et sécurisées pour gérer ces opérations. 12 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type Checks : is et !is Vérifier si un objet est d'un certain type is : Vérifie si un objet est d'un type donné. !is : Vérifie si un objet n'est pas d'un type donné. 13 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type Checks : is et !is - Exemple 14 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type Checks : is et !is - Exemple 15 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice Crée une fonction appelée analyzeObject qui : Prend un paramètre obj de type Any. Vérifie le type de obj en utilisant des type checks (is, !is). Si : obj est une chaîne de caractères (String), affiche sa longueur. obj est un entier (Int), affiche s'il est pair ou impair. obj est un double (Double), affiche sa valeur arrondie. Si l'objet est une liste ou un tableau, affiche "Liste ou tableau de taille X". obj n'est pas l'un de ces types, affiche "Type inconnu". Ensuite, teste ta fonction avec différents types d'objets. 16 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Correction 17 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Correction 18 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Casts : as et as? Les casts permettent de convertir un objet vers un type spécifique. Kotlin propose deux types principaux de casts : 19 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS as (Cast non sécurisé) Si l'objet ne peut pas être converti, une exception ClassCastException sera levée. Exemple Si le cast échoue : 20 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS as? (Cast sécurisé) Le cast retourne null si la conversion échoue. C'est plus sûr et évite les exceptions. Exemple 21 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Combiner is avec des casts automatiques En Kotlin, si un type est vérifié avec is, il est automatiquement casté vers ce type dans le bloc correspondant. Exemple 22 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Résumé Utilisez is pour vérifier les types et profitez des smart casts pour simplifier le code. Préférez as? pour des casts sécurisés qui retournent null en cas d'échec. Évitez les casts non sécurisés (as) sauf si vous êtes sûr à 100 % du type. 23 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice Crée une fonction appelée processObject qui : Prend un paramètre obj de type Any. Utilise des casts pour tenter de convertir obj dans un type spécifique. Si :obj est une chaîne de caractères (String), convertis-le en majuscules et affiche le résultat. obj est un entier (Int), multiplie-le par 10 et affiche le résultat. obj est une liste (List), affiche sa taille. Si obj ne peut pas être converti, affiche "Type inconnu ou non convertible". Utilise des casts sécurisés (as?) pour éviter les exceptions. 24 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Correction 25 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Correction 26 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Correction 27 PARTIE 4: MAITRISER LES ASPECTS AVANCÉS DE KOTLIN PLAN 1. Utiliser les types checks et casts 2. Type Aliases en Kotlin 3. Type safe builders 4. Introduire les coroutines 28 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Un type alias en Kotlin est un alias ou un surnom donné à un type complexe ou long. Cela peut rendre le code plus lisible et plus facile à maintenir. Au lieu de répéter un type complexe tout au long de votre code, vous pouvez lui attribuer un nom plus simple ou plus significatif. 29 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Syntaxe de base Pour définir un type alias, on utilise le mot-clé typealias. Où NomAlias est le nouveau nom que vous donnez au type, et Type est le type que vous souhaitez aliasser. 30 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Exemple de base 31 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Exemple avec des types de fonction complexes Les type aliases peuvent également être utilisés pour des types de fonction complexes. 32 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Exemple avec des types de fonction complexes Les type aliases peuvent également être utilisés pour des types de fonction complexes. L’opérateur :: en Kotlin est utilisé pour référencer une fonction ou une propriété. Lorsque vous écrivez ::add, vous créez une référence à la fonction add, au lieu de l'appeler directement. 33 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Exercice Crée un alias appelé IntOperation pour une fonction qui prend deux entiers (Int) et retourne un entier. Implémente deux fonctions simples sum : additionne deux nombres. product : multiplie deux nombres. Écris une fonction executeOperation qui prend deux entiers et une opération de type IntOperation. Cette fonction applique l’opération sur les deux nombres et retourne le résultat. Appelle la fonction executeOperation pour effectuer une addition et une multiplication, et affiche les résultats. 34 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 35 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 36 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 37 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Exercice 1. Crée un alias appelé StringOperation pour une fonction qui prend une chaîne de caractères (String) et retourne une autre chaîne de caractères. 2. Implémente deux fonctions toLowerCase: transforme une chaîne en minuscules. addPrefix: ajoute un préfixe "Hello, " à une chaîne. 3. Écris une fonction processString qui prend une chaîne de caractères et une opération de type StringOperation. Cette fonction applique l’opération à la chaîne et retourne le résultat. Appelle la fonction processString avec les deux opérations et affiche les résultats. 38 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 39 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 40 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type Aliases en Kotlin Correction 41 PARTIE 4: MAITRISER LES ASPECTS AVANCÉS DE KOTLIN PLAN 1. Utiliser les types checks et casts 2. Type Aliases en Kotlin 3. Type safe builders 4. Introduire les coroutines 42 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Type safe builders Type safe builders Les type-safe builders en Kotlin sont un modèle de conception utilisé pour construire des structures complexes de manière claire et concise, tout en garantissant la sécurité des types à la compilation. Ils sont souvent utilisés dans des contextes comme les DSL (Domain-Specific Languages), où une syntaxe naturelle et lisible est essentielle. 43 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders Un type-safe builder exploite : Les lambdas avec un récepteur (DSL marker). La puissance des extensions pour guider les utilisateurs sur les structures qu'ils peuvent construire. 44 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders Tu veux créer une structure comme une pizza avec : Une base. Plusieurs ingrédients. 45 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders 46 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders On utilise une fonction pour simplifier la construction de la pizza : 47 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders Maintenant, construire une pizza devient facile et intuitif : 48 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders Résultat affiché 49 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders - Construction d'un HTML 50 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders - Construction d'un HTML 51 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders - Construction d'un HTML 52 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders - Construction d'un HTML 53 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Type safe builders - Construction d'un HTML 54 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice Dans cet exercice, tu vas étendre un builder type-safe pour créer un document HTML avec un titre, un en-tête (header), et un pied de page (footer). L'objectif est de bien comprendre comment utiliser un builder pour générer du HTML dynamique de manière claire et concise. 55 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice 1. Créer un builder pour le titre (title) : La méthode title permet d'ajouter un titre dans la balise de la section du document HTML. 56 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice 2. Créer un builder pour le header (header) : La méthode header permet d'ajouter un en-tête de page dans la balise. L'en-tête peut contenir un ou plusieurs éléments comme des titres () et des paragraphes (). 57 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice 3. Créer un builder pour le header (footer) : La méthode header permet d'ajouter un pied de page dans la balise. 58 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice 4. Structure HTML à générer : Le document HTML doit comporter les sections suivantes : : Le titre du document. : Le contenu du header avec un titre et un paragraphe. : Le contenu du footer avec des informations supplémentaires comme un texte de droit d'auteur. 59 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN UTILISER LES TYPES CHECKS ET CASTS Exercice 5. Programme main Utilise le type-safe builder pour créer un document HTML avec ces trois sections. 60 PARTIE 4: MAITRISER LES ASPECTS AVANCÉS DE KOTLIN PLAN 1. Utiliser les types checks et casts 2. Type Aliases en Kotlin 3. Type safe builders 4. Introduire les coroutines 61 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Les coroutines en Kotlin sont une façon simple et efficace d'écrire du code asynchrone ou non-bloquant. Elles permettent de gérer facilement les tâches longues comme les appels réseau ou les opérations sur une base de données, sans bloquer le fil principal (Main Thread). 62 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Qu'est-ce qu'une coroutine ? Définition : Une coroutine est une manière simple et légère de gérer des tâches longues ou asynchrones comme les appels réseau ou les accès à des fichiers. Pourquoi utiliser les coroutines ? Elles permettent d'exécuter du code sans bloquer le thread principal (UI). Elles sont plus légères que les threads traditionnels. 63 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Ajouter les dépendances Avant d'utiliser les coroutines, ajoutez les dépendances nécessaires dans votre fichier build.gradle : 64 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Comment Créer une Coroutine ? Pour démarrer une coroutine, vous devez utiliser une fonction comme launch ou async. a) launch : Utilisée pour des tâches qui ne retournent rien (pas de résultat). 65 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Autre exemple 66 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Comment Créer une Coroutine ? b) async : Utilisée pour des tâches qui retournent un résultat. Elle retourne un objet de type Deferred que l'on peut utiliser pour obtenir un résultat une fois la tâche terminée. 67 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Suspendre une Coroutine Les coroutines peuvent être suspendues et repris à tout moment. La fonction delay est un exemple de suspension d'une coroutine, sans bloquer le thread. 68 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Les Scopes des Coroutines Les coroutines sont lancées dans des scopes qui définissent la durée de vie de la coroutine. Le scope le plus utilisé est GlobalScope, mais il existe aussi d'autres types. runBlocking est un scope particulier utilisé principalement pour bloquer le thread courant et attendre la fin des coroutines lancées dans ce scope. 69 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Utiliser runBlocking pour tester des coroutines runBlocking est utile pour bloquer le thread principal pendant que vous testez une coroutine : 70 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Utiliser runBlocking pour tester des coroutines Si l'objectif est d'exécuter les coroutines dans l'ordre attendu, où le message "Tâche dans la coroutine terminée" s'affiche avant "Fin de runBlocking (en attente des coroutines)", il faut attendre explicitement la fin des coroutines enfants avant de continuer. 71 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Utiliser runBlocking pour tester des coroutines 72 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Quand ne pas utiliser runBlocking ? Dans des applications Android ou avec une UI : Ne bloquez jamais le thread principal d'une application Android, car cela entraînerait un gel de l'interface utilisateur. Utilisez plutôt des coroutines avec Dispatchers.Main pour les tâches liées à l'interface utilisateur. 73 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Exemple réel avec Dispatchers Les dispatchers permettent de définir sur quel thread une coroutine doit s'exécuter. Par exemple : Dispatchers.Main : Exécute la coroutine sur le thread principal (UI). Dispatchers.IO : Idéal pour les tâches d'entrée/sortie comme lire un fichier ou interagir avec une base de données. Dispatchers.Default : Utilisé pour les calculs intensifs. Dispatchers.Unconfined est léger et ne force pas un thread particulier après une suspension. Il est principalement utilisé pour des tâches simples ou des tests. 74 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Exemple réel avec Dispatchers 75 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Comment changer le contexte d'une Coroutine? Ceci peut être facilement réalisé en utilisant la fonction suspend withContext(Dispatcher). Cela permet de changer facilement le contexte de démarrer une Coroutine et de passer d'un Dispatcher à l'autre. Voici un exemple de la façon dont nous pouvons l'utiliser pour passer du Dispatcher par défaut au Dispatcher IO: 76 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Utilisation de suspend pour écrire des fonctions suspendues Les fonctions suspendues peuvent être appelées depuis une coroutine ou une autre fonction suspendue. Exemple : 77 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Utilisation de suspend pour écrire des fonctions suspendues Les fonctions suspendues peuvent être appelées depuis une coroutine ou une autre fonction suspendue. Exemple : 78 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Les coroutines simplifient l'écriture de code asynchrone. launch et async permettent de démarrer des coroutines. delay suspend une coroutine sans bloquer le thread. Dispatchers permettent de choisir le contexte d'exécution (UI, IO, etc.). Les fonctions suspend sont au cœur des coroutines. 79 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Exercice 1 Lancer une coroutine avec Dispatchers.IO pour simuler une tâche (comme lire un fichier). Afficher le thread sur lequel s'exécute cette coroutine. Ajouter une autre coroutine avec Dispatchers.Default pour effectuer un calcul (exemple : somme de 1 à 100). 80 Partie 4 - MAITRISER LES ASPECTS AVANCÉS DE KOTLIN Introduire les coroutines Exercice 2 Créer une coroutine avec Dispatchers.IO pour simuler un appel réseau (utilisez delay(2000L)). Une fois l'appel réseau terminé, revenez sur Dispatchers.Main pour afficher un message simulant une mise à jour de l'interface utilisateur. 81