Maintenant que votre boîte à outils Java est prête, vous vous lancez dans le développement du projet. Justement, vous avez été convié à une réunion de lancement animé par Jenny et vous y retrouvez Marc :
Jenny :
Bienvenue pour cette réunion de lancement de la première itération du projet Epicrafter's Journey. Marc tu nous en rappelles l’objectif s’il te plaît.
Marc :
Bien sûr, étant donné que nous n’avons pas une seule ligne de code écrite encore, il faut commencer par créer le projet. Nous devrons ensuite créer la structure de base de nos blocs de construction.
Jenny :
Merci, est-ce que tu pourrais définir ça précisément en plusieurs tâches et les envoyer à l’équipe ? Les autres équipes de développement ont hâte de pouvoir s'appuyer sur ce code, je compte sur vous !
La documentation du projet indique précisément ce qu’est un bloc de construction dans le contexte Epicrafter's Journey :
“Un bloc de construction est un élément reproductible par l’utilisateur. Le bloc est défini par 3 caractéristiques : longueur, largeur, et hauteur.”
En termes de modélisation, c’est assez simple pour l’instant. La structure est la suivante :
Appréhendez la programmation objet puis coder la première représentation du bloc de construction !
Découvrez la programmation orientée objet
Commençons par énoncer trois problématiques de développement logiciel.
Comment permettre à notre programme de représenter le monde réel ?
Comment avoir un code facilement modifiable sans effet de bords ?
Comment avoir un code permettant facilement l’ajout de nouvelles fonctionnalités sans effet de bords sur les fonctionnalités existantes ?
Pour faire une comparaison, développer une application c’est comme construire une maison. Et nous souhaitons que notre maison :
soit conforme aux besoins de ses habitants (problématique 1)
permette d’être entretenue et maintenue sans difficulté : changer un carreau de carrelage n’implique pas de tous les changer par exemple (problématique 2)
permette des évolutions : ajouter une extension à la maison sans tout reconstruire par exemple (problématique 3)
Pour résoudre ces problématiques, l’architecte devra sans aucun doute faire des choix avisés quant à la structure de la maison. De la même façon, pour avoir une application qui répond aux problématiques, un développeur devra correctement structurer son code.
C’est à ce moment-là que la programmation orientée objet devient une solution car elle nous donne un outil clé pour structurer le code : les objets !
Comparons un objet à une pièce de la maison. Une pièce se définit par des informations comme sa longueur, sa largeur, sa hauteur ou encore la couleur des murs. Et elle se définit aussi par des capacités, par exemple permettre de cuisiner ou bien de dormir ou de se laver (ou les 3 pour un studio).
Comment définir du coup ces informations et traitements dans le cas d’un objet ?
De la même façon que l’architecte écrit le plan de chaque pièce de la maison, nous devons écrire le plan de chaque objet.
Pour définir ce plan, on écrit une classe. Une classe va donc définir des informations et des traitements.
On nomme les informations d’une classe :
variables de classe
ou attributs
ou propriétés
On nomme les traitements d’une classe :
fonctions de classe
ou méthodes
Replaçons-nous dans le contexte du projet Epicrafter’s Journey et créons la classe qui représente un bloc. Pour ce premier exemple, j’en fais une version incomplète, on complétera au fur et à mesure
Je choisis ici d’avoir une classe nommée Bloc qui possède comme information une description et comme traitement la capacité d’afficher cette description dans la console :
Bloc.java
package ej;
public class Bloc {
String description;
void afficherDescription() {
System.out.println(this.description);
}
}
Les points à retenir de ce code sont :
Le mot-clé pour définir une classe est donc tout simplement class.
Au sein des accolades { } qui suivent la déclaration de la classe, les informations (attributs) et les traitements (méthodes) sont définis.
Au sein d’une méthode, je peux accéder à un attribut grâce à la syntaxe this.[nom de l’attribut], par exemple
this.nom
Et c’est tout ? Car pour l’instant ça ne change pas grand-chose à ce qu’on a déjà vu.
C’est vrai, je vais donc vous montrer ce que l’on peut faire de plus grâce aux objets !
Mettez en œuvre le processus d’instanciation à travers les constructeurs
Tout d’abord tout comme il est nécessaire de construire les pièces d’une maison une fois qu’on en a le plan, il est nécessaire de construire l’objet à partir de la classe. Cela revient à donner vie à l’objet pour pouvoir l’utiliser.
Cette opération de construction est nommée instanciation. Elle permet d’obtenir une instance.
Retrouvez-moi dans la démonstration suivante pour voir comment faire :
Que pouvons-nous retenir ?
L’instanciation se déclenche grâce au mot-clé new et exécute automatiquement une fonction particulière nommée constructeur.
Java ajoute un constructeur par défaut (qui ne fait rien) à toutes les classes qui n’ont pas de constructeur déclaré.
Un objet instancié peut être stocké dans une variable typée par l’objet.
Le caractère
.
permet d’appeler une méthode de l’objet à partir de la variable qui contient l’instance.Il est possible d’instancier plusieurs fois la même classe.
Voici le code du fichier Bloc.java
Bloc.java
package ej;
public class Bloc {
String description;
Bloc() {
this.description = “Ceci est un bloc du jeu Epicraft’s Journey”;
}
void afficherDescription() {
System.out.println(this.description);
}
}
Et voici le code du fichier Main.java
Main.java
package ej;
public class Main {
public static void main(String[] args) {
Bloc unBloc = new Bloc(); // déclaration et instanciation
unBloc.afficherDescription(); // appel d’une méthode de l’objet
}
}
Mine de rien, cela fait pas mal d’informations d’un coup ! Allez, ne lâchez rien, continuons
Tout comme à partir d’un même plan on peut construire plusieurs maisons sur des terrains différents, à partir d’une même classe on peut instancier plusieurs objets.
Et tout comme ces différentes maisons peuvent varier sur certains points (par exemple la couleur des murs), les instances peuvent avoir des données différentes.
Comment faire ?
L’une des façons est d’utiliser un constructeur paramétré. Un constructeur étant simplement une fonction particulière, comme toute fonction, il peut avoir des paramètres.
Prenons un exemple :
Bloc.java
package ej;
public class Bloc {
String description;
Bloc(final String description) {
this.description = description;
}
void afficherDescription() {
System.out.println(this.description);
}
}
Main.java
package ej;
public class Main {
public static void main(String[] args) {
Bloc unBloc = new Bloc("Ceci est le premier bloc");
unBloc.afficherDescription();
Bloc unDeuxiemeBloc = new Bloc("Ceci est le deuxième bloc");
unDeuxiemeBloc.afficherDescription();
}
}
Contrairement au premier exemple où la description était définie en dur dans la classe, ici la description est passée en paramètre du constructeur lors de l’instanciation. Ainsi chaque instance peut varier bien que la structure de l’objet soit conservée.
Renforcez l’intégrité de vos classes avec l’encapsulation
Voyons une autre caractéristique des objets. Dans le chapitre sur les variables, j’ai indiqué que ces dernières ont une portée. Pour rappel, la portée est la zone de code où une variable est accessible. Et la règle que nous avons vue jusqu’à présent est la suivante: une variable est accessible dans le bloc d’instructions où elle est déclarée.
La programmation orientée objet inclut un concept nommé encapsulation. Grâce à l’encapsulation, la portée des attributs d’une classe ne sera pas forcément limitée à la portée du bloc d’instructions associées (à savoir la classe).
Retrouvez-moi la démonstration qui suit pour comprendre :
Retenons les points suivants :
La visibilité concerne les attributs, les méthodes et les classes.
La visibilité public permet à un code en dehors de la classe d’accéder et modifier l’attribut ou d’appeler une méthode de la classe.
La visibilité private interdit à tout code en dehors de la classe d’accéder ou modifier un attribut ou d’appeler une méthode de la classe.
Mais quel est l’intérêt ?
L’encapsulation permet de protéger l’intégrité de l’objet. Imaginez une maison où l'interrupteur pour allumer la lumière d’une chambre soit sur la façade extérieure. Cela serait illogique car n’importe qui pourrait alors allumer ou éteindre la lumière.
De la même façon, on ne veut pas que n’importe quel code puisse accéder aux informations ou appeler n’importe quelle méthode de l’objet. On risquerait de rencontrer des comportements non souhaités !
Il existe une bonne pratique de programmation qui consiste à mettre constamment tous les attributs en visibilité privée.
Mais comment faire pour qu’un code à l’extérieur de la classe puisse y accéder ou le modifier dans le cas où ce serait nécessaire ?
Dans ce cas-là, on ajoutera deux fonctions :
un accesseur (getter en anglais) pour accéder à l’attribut
un mutateur (setter en anglais) pour modifier l’attribut
Voici un code d’exemple :
Bloc.java
package ej;
public class Bloc {
private String description;
public Bloc(final String description) {
this.description = description;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
}
À vous de jouer
Contexte
À la suite de la réunion de lancement, Marc vous affecte vos premières tâches techniques dans l’outil de suivi de projet :
ID de la tâche : 1
Nom de la tâche : Créer la structure du projet
Description de la tâche :
Créer un projet Java nommé EpicrafterJourney.
Créer un package nommé ej.
et
ID de la tâche : 2
Nom de la tâche : Créer la classe Bloc
Description de la tâche :
La définition métier d’un bloc est “Un bloc de construction est un élément reproductible par l’utilisateur. Le bloc est défini par 3 caractéristiques : longueur, largeur et hauteur.”
Créer une classe Java respectant cette définition, permettant d’instancier un bloc en spécifiant les valeurs des caractéristiques et avec un accesseur pour chaque attribut.
Vous vous mettez directement au travail !
Consignes
Créez une classe nommée Bloc
Ajoutez un attribut longueur, un attribut largeur, un attribut hauteur. Les trois attributs seront de type int et de visibilité privée.
Ajoutez un constructeur paramétré permettant de définir la valeur des trois attributs.
Ajouter l’accesseur pour chaque attribut.
En résumé
Un objet est un ensemble d’attributs et de méthodes.
Une classe permet de décrire la structure de l’objet.
L’instance d’un objet est obtenue en instanciant une classe.
L’instanciation appelle automatiquement le constructeur.
L’encapsulation permet de protéger l’intégrité des objets.
Dans le prochain chapitre, je vais vous montrer l’un des plus grands avantages de la programmation orientée objet !