S'entraîner : Classes et collections

1. Avant de commencer

Dans ce parcours, vous avez découvert les concepts généraux, les différents types de classes, les collections et les fonctions d'ordre supérieur. Pour mettre en pratique ce que vous avez appris, vous allez aider votre équipe à améliorer sa nouvelle application de suivi des événements. Les instructions de chaque étape décrivent l'état actuel de l'application et la tâche à effectuer.

Nous vous recommandons d'utiliser Kotlin Playground pour mener à bien ces exercices.

Conditions préalables

  • Vous avez terminé le parcours 1 du module 3 dans le cours Principes de base d'Android avec Compose et les parcours qui le précèdent.
  • Vous connaissez les bases du langage de programmation Kotlin, y compris les classes, les objets, les collections et les fonctions avancées.

Ce dont vous avez besoin

2. Présentation de l'application

Vous êtes le dernier ingénieur logiciel à avoir rejoint l'équipe chargée de l'application de suivi des événements. Comme son nom l'indique, cette application permet aux utilisateurs de suivre leurs événements. Votre équipe vous assignera des tâches pour contribuer à en développer les fonctionnalités.

À la fin de chaque tâche, vous devrez comparer votre solution à celle que nous mettons à votre disposition. Plusieurs approches permettent d'obtenir la fonctionnalité souhaitée. Par conséquent, ne vous inquiétez pas si votre code ne correspond pas exactement au code de solution fourni.

Pour commencer sur les mêmes bases, utilisez le code de solution fourni à la tâche précédente comme code de démarrage de la prochaine tâche.

3. Tâche 1

Un autre ingénieur logiciel a déjà implémenté des éléments généraux dans l'application. Vous avez pour mission d'ajouter les détails.

Vous devez implémenter la classe Event. Cette classe permet de conserver les détails de l'événement saisi par l'utilisateur. Indice : cette classe n'a pas besoin de définir de méthodes ni d'effectuer des actions.

Pour cette tâche, vous devez créer une classe de données nommée Event.

Une instance de cette classe doit pouvoir stocker les éléments suivants :

  • Titre de l'événement sous forme de chaîne.
  • Description de l'événement sous forme de chaîne (peut être une valeur nulle).
  • Tranche horaire de l'événement sous forme de chaîne. Il suffit de savoir si l'événement commence le matin, l'après-midi ou le soir.
  • Durée de l'événement, exprimée en minutes, sous forme de nombre entier.

Avant de continuer, essayez de rédiger le code pour vous-même.

À l'aide de votre code, créez une instance avec les informations suivantes :

  • Titre : Étudier le Kotlin
  • Description : Engagez-vous à étudier le Kotlin au moins 15 minutes par jour.
  • Tranche horaire : Le soir
  • Durée : 15

Essayez d'imprimer votre objet pour vérifier que vous obtenez le résultat suivant :

Event(title=Study Kotlin, description=Commit to studying Kotlin at least 15 minutes per day., daypart=Evening, durationInMinutes=15)

Une fois que vous avez mené à bien cette tâche ou que vous avez épuisé toutes les possibilités, cliquez sur Suivant pour découvrir comment nous l'avons codée.

4. Solution de la tâche 1

Votre solution devrait ressembler à ce qui suit :

data class Event(
    val title: String,
    val description: String? = null,
    val daypart: String,
    val durationInMinutes: Int,
)

5. Tâche 2

Pour assurer le bon déroulement du projet, votre responsable décide d'utiliser le code que nous avons fourni pour la classe de données.

Après que les membres de votre équipe ont utilisé la classe Event pendant un certain temps, un de vos collaborateurs se rend compte que l'utilisation d'une chaîne pour la tranche horaire n'est pas idéale.

Certains développeurs ont enregistré la valeur "Matin", d'autres "matin", et d'autres encore "MATIN".

Cela cause de nombreux problèmes.

Votre tâche consiste à résoudre ce problème en effectuant une refactorisation. La refactorisation est le processus permettant d'améliorer le code sans modifier ses fonctionnalités. Certains exemples permettent de simplifier la logique ou de déplacer le code répété dans des fonctions distinctes.

Quel type de classe peut être utilisé pour modéliser un ensemble limité de valeurs distinctes afin de corriger ce problème ?

Votre équipe souhaite que vous modifiiez le code de la tranche horaire afin d'utiliser une classe d'énumération. Avec une classe d'énumération, vos collègues seront obligés de choisir l'une des valeurs de tranche horaire fournies, ce qui évitera ce type de problème.

La classe d'énumération doit être nommée Daypart. Elle doit comporter trois valeurs :

  • MORNING
  • AFTERNOON
  • EVENING

Comment créeriez-vous cette classe d'énumération ?

Comment procéderiez-vous pour refactoriser la classe Event afin de pouvoir l'utiliser ?

Essayez de coder votre propre solution maintenant avant d'aller plus loin.

Cliquez sur Suivant pour découvrir notre solution.

6. Solution de la tâche 2

enum class Daypart {
    MORNING,
    AFTERNOON,
    EVENING,
}

La classe de données Event refactorisée utilise désormais la classe d'énumération :

data class Event(
    val title: String,
    val description: String? = null,
    val daypart: Daypart,
    val durationInMinutes: Int,
)

7. Tâche 3

Vos collègues aiment utiliser la classe Daypart refactorisée, mais ils rencontrent d'autres problèmes.

Le code ci-dessous indique la manière dont ils créent et stockent actuellement les événements de l'utilisateur.

val event1 = Event(title = "Wake up", description = "Time to get up", daypart = Daypart.MORNING, durationInMinutes = 0)
val event2 = Event(title = "Eat breakfast", daypart = Daypart.MORNING, durationInMinutes = 15)
val event3 = Event(title = "Learn about Kotlin", daypart = Daypart.AFTERNOON, durationInMinutes = 30)
val event4 = Event(title = "Practice Compose", daypart = Daypart.AFTERNOON, durationInMinutes = 60)
val event5 = Event(title = "Watch latest DevBytes video", daypart = Daypart.AFTERNOON, durationInMinutes = 10)
val event6 = Event(title = "Check out latest Android Jetpack library", daypart = Daypart.EVENING, durationInMinutes = 45)

Ils ont créé un grand nombre d'événements, et chacun d'eux nécessite actuellement sa propre variable. Plus il y a d'événements créés, plus il devient difficile de les suivre tous. Avec cette approche, est-il difficile de déterminer le nombre d'événements planifiés par l'utilisateur ?

Réfléchissez à une meilleure façon d'organiser le stockage de ces événements.

Comment pouvez-vous stocker tous les événements dans une seule variable ? Remarque : la solution doit être flexible, car d'autres événements peuvent y être ajoutés. Elle doit également renvoyer efficacement le nombre d'événements stockés dans la variable.

Quelle classe ou quel type de données utiliseriez-vous ? Réfléchissez à une manière d'ajouter d'autres événements.

Vous pouvez maintenant mettre en œuvre cette fonctionnalité. Essayez de rédiger le code avant de cliquer sur Suivant pour voir notre solution.

8. Solution de la tâche 3

val events = mutableListOf<Event>(event1, event2, event3, event4, event5, event6)

9. Tâche 4

Votre responsable aime la façon dont l'application se présente, mais souhaite que l'utilisateur puisse voir un résumé de ses événements courts en fonction de leur durée. L'application pourrait, par exemple, indiquer à l'utilisateur qu'il a cinq événements courts.

Un événement "court" dure moins de 60 minutes.

Comment pouvez-vous obtenir ce résultat à l'aide du code de variable events issu de la solution de la tâche précédente ?

Cliquez sur Suivant pour consulter notre solution.

10. Solution de la tâche 4

Plusieurs solutions sont possibles, mais nous avons choisi celle-ci :

val shortEvents = events.filter { it.durationInMinutes < 60 }
println("You have ${shortEvents.size} short events.")

11. Tâche 5

Vos collègues aiment l'application, mais ils souhaitent que les utilisateurs puissent voir un résumé de tous les événements et de leur tranche horaire.

Le résultat doit être semblable à ceci :

Morning: 3 events
Afternoon: 4 events
Evening: 2 events

Comment pouvez-vous obtenir ce résultat à l'aide du code de variable events issu de l'étape précédente ?

Cliquez sur Suivant pour consulter le code de la solution.

12. Solution de la tâche 5

Voici la solution que nous avons choisie, mais d'autres variantes sont acceptées.

val groupedEvents = events.groupBy { it.daypart }
groupedEvents.forEach { (daypart, events) ->
    println("$daypart: ${events.size} events")
}

13. Tâche 6

Actuellement, votre collègue peut rechercher et imprimer le dernier élément à l'aide de son indice. Le code utilisé est : println("Last event of the day: ${events[events.size - 1].title}").

Votre responsable vous suggère de consulter la documentation Kotlin pour trouver une fonction permettant de simplifier ce code.

Quelle fonction avez-vous identifiée ?

Essayez de l'utiliser pour vérifier que vous obtenez les mêmes résultats.

Cliquez sur Suivant pour consulter la solution.

14. Solution de la tâche 6

println("Last event of the day: ${events.last().title}")

15. Tâche 7

Votre équipe aime la classe de données que vous avez conçue, mais trouve qu'il est répétitif de devoir écrire du code chaque fois qu'ils ont besoin de la durée d'un événement sous forme de chaîne :

val durationOfEvent = if (events[0].durationInMinutes < 60) {
        "short"
    } else {
        "long"
    }
println("Duration of first event of the day: $durationOfEvent")

Bien que vous puissiez résoudre ce problème en ajoutant une méthode directement à la classe, cette approche n'est pas idéale, car d'autres équipes ont déjà commencé à utiliser votre classe d'événement dans leurs applications. Si cette classe change, ils devront tester à nouveau l'ensemble de leur code pour vérifier que tout fonctionne.

Sans modifier directement la classe de données, comment écririez-vous une propriété d'extension qui renvoie les mêmes valeurs que le code ci-dessus ?

Une fois que l'implémentation correcte aura été effectuée, vous pourrez utiliser le code suivant pour afficher le même message que celui présenté au début de cette tâche.

println("Duration of first event of the day: ${events[0].durationOfEvent}")

Cliquez sur Suivant pour accéder à la solution.

16. Solution de la tâche 7

val Event.durationOfEvent: String
    get() = if (this.durationInMinutes < 60) {
        "short"
    } else {
        "long"
    }

17. Pratique supplémentaire

Pour vous entraîner davantage en langage Kotlin, consultez le cours sur les bases du langage Kotlin proposé par JetBrains Academy. Consultez la fiche info afin d'accéder à la liste des sujets abordés dans ce cours et de choisir celui qui vous intéresse.