• 20 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 08/09/2021

Définissez votre premier modèle

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans ce chapitre, nous allons nous intéresser à la composante modèle de l'architecture MVC, et voir comment le définir et l'implémenter dans notre application.

Créez le modèle

Dans notre super application TopQuiz, notre modèle va contenir les informations suivantes :

  • le prénom de l'utilisateur (qu'il saisit sur le premier écran) ;

  • le score de l'utilisateur ;

  • la liste des questions à afficher ;

  • la liste des réponses possibles pour chacune des questions ;

  • la bonne réponse pour chacune des questions.

Le modèle n'est pas nécessairement un seul fichier : ce peut être un ensemble de classes utilisées pour gérer des données différentes. Dans notre cas, il est logique de créer au moins deux classes distinctes : l'une pour gérer les informations et le score de l'utilisateur, l'autre pour gérer l'ensemble des questions.

Gestion des données utilisateur

Commencez par créer une classe nommée User, stockée dans le package model. Pour ce faire, faites un clic droit sur le package model de votre arborescence (sous réserve que vous l'ayez au préalablement créé), puis sélectionnez New > Java Class.

Faites un clic droit sur le package model et sélectionnez New > Java Class pour créer une classe User
Faites un clic droit sur le package model et sélectionnez New > Java Class pour créer une classe User

Indiquez le nom de la classe et laissez la ligne Class en surbrillance.

Dans cette nouvelle classe, ajoutez une variable nommée mFirstName, pour stocker le prénom de l'utilisateur. Rappelez-vous : c'est une bonne habitude de préfixer le nom d'une variable pour déterminer d'un coup d'œil quelle est sa portée. En l'occurrence, m signifie member. Le lecteur saura très facilement qu'il s'agit d'un attribut de classe.

Sachant que nous sommes entre gens sérieux, nous allons préciser que la variable mFirstName est privée (avec l'attribut private), et ajouter deux méthodes : l'une pour accéder à sa valeur et l'autre pour la modifier (getter et setter, en anglais). Revenez ! Je sais que vous êtes déjà en train d'écrire ces méthodes à la main. Rappelez-vous : le développeur informatique est flemmard (c'est la raison pour laquelle j'ai choisi ce métier). Nous allons donc gentiment demander à Android Studio de générer ces méthodes pour nous !

Pour ce faire, positionnez le curseur de votre souris sur la ligne en dessous de la variable mFirstName, appuyez sur  ALT + Insert sur PC, ou ⌘ + N sur Mac, puis sélectionnez Getter and Setter. Sachant que vous n'avez qu'une seule variable membre, Android Studio la sélectionne par défaut. Si vous en aviez plusieurs, vous pourriez sélectionner celle(s) qui vous intéresse(nt). Cliquez sur le bouton OK. Magie !

Dans la colonne Name Prefix, saisissez m pour le champ Field et s pour le champ Static Field. Cliquez sur le bouton Apply puis OK
Dans la colonne Name Prefix, saisissez m pour le champ Field et s pour le champ Static Field. Cliquez sur le bouton Apply puis OK
Mémorisation du prénom du joueur

Lorsque le joueur a terminé de saisir son prénom, il clique sur le bouton de démarrage de jeu. C'est probablement le moment le plus opportun pour mémoriser son prénom dans le modèle.

Pour ce faire, ajoutez un attribut du type User dans la classe MainActivity et initialisez-le dans la méthode onCreate(). Ensuite, mémorisez le prénom du joueur lorsqu'il clique sur le bouton, c'est-à-dire dans la méthode onClick() du bouton :

mUser.setFirstName(mNameEditText.getText().toString());
Récapitulons en vidéo

Retrouvez ces différentes étapes dans la vidéo ci-dessous :

Gestion des questions

De la même façon, commencez par créer une classe Java nommée Question. L'instance de cette classe contiendra une question, avec les quatre réponses associées et la bonne réponse correspondante. De ce fait, la classe va contenir les trois attributs suivants :

private final String mQuestion;
private final List<String> mChoiceList;
private final int mAnswerIndex;

Le premier est le texte de la question. Le deuxième est la liste des réponses proposées. Le troisième est l'index de la réponse dans la liste précédente.

Utilisez la fonction de génération d'Android Studio pour créer automatiquement le constructeur et les getters correspondants. 

Banque de questions

Dans l'idéal, à chaque nouvelle partie, il faudrait que les questions soient différentes, et affichées dans un ordre aléatoire. Pour ce faire, nous allons créer une classe Java spécifique nommée QuestionBank, qui va gérer cette liste de questions pour nous. Voici le squelette de la classe que j'ai développée :

public class QuestionBank {
private List<Question> mQuestionList;
private int mNextQuestionIndex;
public QuestionBank(List<Question> questionList) {
// Shuffle the question list before storing it
}
public Question getNextQuestion() {
// Loop over the questions and return a new one at each call
}
}

J'ai volontairement masqué le code des deux méthodes. Faites travailler vos méninges et essayez de l'implémenter vous-même avant d'aller consulter mon implémentation sur GitHub. Vous êtes libre de la développer à votre façon : ma version n'étant qu'une variante parmi d'autres !

Mettez à jour le contrôleur

Maintenant que le modèle est disponible, nous allons pouvoir l'utiliser dans le contrôleur. Le code qui nous intéresse est situé dans la classe GameActivity : c'est elle qui sera en charge d'afficher les différentes questions à l'utilisateur.

Tout d'abord, nous allons créer l'ensemble des questions du jeu, et les ajouter dans la banque de questions. Si vous souhaitez ajouter vos propres questions pour épater vos amis et vos collègues, rendez-vous sur ce site.

La solution la plus propre consiste à créer une méthode permettant de générer les différentes questions. Pour ce faire, déclarez dans votre activité un attribut du type QuestionBank, et ajoutez une méthode permettant de renvoyer un objet de ce type. Dans cette méthode, créez autant de questions que vous le souhaitez, ajoutez-les à la banque de questions puis renvoyez l'objet valorisé. Par exemple :

Question question1 = new Question(
"Who is the creator of Android?",
Arrays.asList(
"Andy Rubin",
"Steve Wozniak",
"Jake Wharton",
"Paul Smith"
),
0
);
Question question2 = new Question(
"When did the first man land on the moon?",
Arrays.asList(
"1958",
"1962",
"1967",
"1969"
),
3
);
Question question3 = new Question(
"What is the house number of The Simpsons?",
Arrays.asList(
"42",
"101",
"666",
"742"
),
3
);
return new QuestionBank(Arrays.asList(question1, question2, question3));

Il vous suffit d'initialiser votre banque de questions dès la création de l’attribut :

private final QuestionBank mQuestionBank = generateQuestionBank();

Récapitulons en vidéo

Retrouvez cette étape dans la vidéo ci-dessous :

En résumé

  • Un modèle permet de stocker des données et de les réutiliser plus tard.

  • Il est possible de préfixer les variables de classe avec m et les variables de classes statiques avec s pour les identifier plus facilement dans le code.

 Voilà, le modèle est implémenté et le contrôleur est à jour pour utiliser ce nouveau modèle, c'est parfait. 😎 Dans le prochain chapitre, nous implémenterons la logique de jeu dans la classe GameActivity.

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