Download programmation orienté objet and more Summaries Java Programming in PDF only on Docsity! Paradigmes de programmation — 3°“ Licence (SI/ISIL) | Chapitre N°5: Programmation orientée objet
Chapitre 5: Programmation orientée objet
Le paradigme de la programmation orientée objet est à l’origine dé plusieurs motivations.
Entre autres, une décomposition modulaire ne permettant pas de prendre en compte des
problèmes complexes. Ainsi, la manipulation de volume d'information important met en
évidence la nécessité de regrouper en entités les ensembles de données partageant les mêmes
caractéristiques.
Les concepts de la programmation orientée objet ont comme racine le langage Simula 67,
mais ils n’ont pas été entièrement développés jusqu’à ce que l’évolution du Smalltalk ait eu lieu.
Smalltalk a été le premier langage offrant un support complet pour la programmation orientée
objet. Un langage de programmation orienté objet s’appuie sur trois techniques fondamentales
qui sont: l’encapsulation (regrouper données et traitements ensemble), l'héritage (permet la
réutilisation) et le po/ymorphisme (permet la surcharge et la liaison dynamique).
La programmation orientée objet est la programmation dans laquelle les programmes sont
organisés comme des ensembles d'objets qui interagissent entre eux par envoi de messages.
Chaque objet représente une instance d’une classe. L'ensemble des classes est organisé dans
une hiérarchie selon la relation d’héritage.
L'objectif de ce chapitre est d'introduire les concepts de base de la programmation
orientée objet, puis de discuter les supports de ce style de programmation dans certains
langages orientés objet tel que Simula, Smalltalk, C++ et Java. Ainsi, présenter une évaluation
de la programmation orientée objet.
1. Concepts de base de la programmation orientée objet
Un objet est l’entité élémentaire dans le paradigme orienté objet. Il intègre les données et
les procédures ou méthodes qui manipulent ces données. Cela illustre le principe de
l'encapsulation qui permet l’abstraction des données. La classe est l’entité conceptuelle qui
décrit les objets. Les classes d'objets sont organisées en hiérarchie d’héritage. Une méthode
définie au niveau d’une classe peut être redéfinie par une sous-classe, ce qui illustre le principe
de la surcharge.
1.1 Classe
Une classe est une entité qui regroupe sous le même nom des données et des méthodes
qui manipulent ces données. Généralement une méthode appartenant à une classe ne peut
manipuler que les données de celle-ci et ne peut pas accéder aux données d’une autre classe.
Une classe peut être considérée comme un moule à partir duquel on peut créer des objets.
1.2 Instance
La classe est un descripteur statique qu'on ne peut pas utiliser directement (sauf les
membres de la classe). À partir d’une classe on peut construire autant d'exemplaires que l’on
veut. Ces exemplaires sont appelées des instances ou objets de la classe qui a permis de les
Mr. Sedairia A. (2015/2016) 43 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3°" Licence (SI/ ISIL) |_ Chapitre N°5: Programmation orientée objet
créer. Deux instances différentes d’une même classe partagent la même liste de méthodes et de
données mais avec des valeurs différentes (si les données ne sont pas statiques).
1.4 Transmission de messages
Le mécanisme de transmission de messages assure l'interaction entre les objets. Un objet
qui envoie Un message mentionne toujours le récepteur du message, le nom de la méthode à
exécuter et les arguments de cette méthode. L'objet récepteur du message recherche le nom de
la méthode puis procède à son activation. Le résultat de l'exécution de cette méthode sera
retourné à l’objet qui a envoyé le message. La recherche est faite en remontant l’arbre
d’héritage.
1.5 Principe de l’abstraction de données
L'abstraction est le processus qui consiste à représenter des objets qui appartiennent au
monde réel dans le monde du programme que l’on écrit. Il consiste essentiellement à extraire
des variables pertinentes, attachées aux objets que l’on souhaite manipuler, et à les placer dans
un modèle informatique convenable.
Dans la programmation orientée objet une classe est composée d’une interface et d’une
implémentation. L'interface définit les méthodes et l'implémentation se compose de structures
de données et d’algorithmes spécifiant ces méthodes.
1.6 Principe de l’encapsulation
La première étape du travail de conception a consisté à définir les données intéressantes,
et à les regrouper dans des structures qui ont un sens. La deuxième étape consiste à définir les
méthodes d'accès à ces données, et les calculs qui seront effectués dessus. L'idée de la
programmation objet est de regrouper ces méthodes d'accès et de calcul dans la même
structure que les données. Le regroupement des données et des méthodes est un des points
importants des langages objet, qui n’est absolument pas supporté dans des langages tels que le
C, Pascal ou Fortran. C'est cela que l’on appelle l’encapsulation.
L’encapsulation cache les données et les algorithmes et ne laissent visible aux
développeurs que l'interface. Ainsi, une méthode appartenant à une encapsulation ne peut
manipuler que les données de cette encapsulation et ne peut pas modifier les données d’une
autre encapsulation. Par conséquent, les risques d'erreurs sont considérablement réduits et
leurs conséquences sont mieux maîtrisées.
1.7 Héritage
L'héritage est la propriété la plus innovatrice et l’une des plus intéressantes dans la
programmation orientée objet. L'héritage se fait sur des classes et non pas sur des objets. Ce
mécanisme permet, quand on veut construire une classe ayant des propriétés communes avec
une autre classe qui existe dans le système, de ne programmer que les différences entre les
deux. Toutes les variables et les procédures de la classe existante seront ajoutées aux variables
et aux procédures de la classe en construction, La nouvelle entité créée par héritage sera une
Mr. Sedairia À. (2015/2016) 44 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3* "Licence (SI / ISIL) | Chapitre N°5: Programmation orientée objet
2.4 Java
Étant donné que le langage C++ comportait plusieurs limites, James Gosling a décidé de
créer un langage orienté objet reprenant les caractéristiques principales du C++, en éliminant
ses points faibles. Ainsi, ce langage a été nommé Java.
Java est un langage orienté objet par excellence. II possède une syntaxe qui ressemble
beaucoup à celle du C++. Toutefois Java est plus simple que C++ car les caractéristiques critiques
de ce dernier ont été supprimées (pointeurs, héritage multiple, libération de mémoire, etc.).
Seulement l'héritage simple est supporté, bien qu’une sorte d'héritage multiple soit toujours
possible en utilisant les interfaces. Tous les liens de messages aux méthodes dans Java sont
dynamiques. L'avantage principal de Java comparé aux autres langages est sa portabilité. En
effet, un programme Java peut être exécuté sur n'importe qu’elle plate-forme. Le langage de
programmation Java est maintenant devenu un standard des langages orientés objet.
Un programme java est traduit à l’aide d’un compilateur afin de générer le bytecode (un
programme intermédiaire). Ensuite, ce bytecode est interprété par une machine virtuelle
(environnement d'exécution du bytecode, généralement dénoté par JVM). Ce qui rend le
langage Java beaucoup moins rapide que le langage C++, Néanmoins, les nouvelles versions des
machines virtuelles Java se sont bien améliorées en matière de rapidité et fournissent une
performance acceptable.
3. Application de la programmation orientée objet
La POO à obtenu ses premiers succès importants avec la programmation d’interfaces
graphiques. Depuis, son application s'est généralisée à de nombreux domaines tels que les
applications de gestions, les bases de données et les systèmes réparties.
4. Évaluation de ia programmation orienté objet
La programmation orientée objet présente beaucoup d'avantages. Principalement, elle
assure la modularité, la réutilisation, la factorisation, la modélisation des applications
complexes, l’extensibilité, et la compatibilité.
° Modularité
Dans la programmation orientée objet, la modularité est mise en oeuvre par découpage de
l'application en un ensemble de modules (classes) fonctionnellement indépendants et en
entités plus fines (objets).
+ Réutilisation
La programmation orientée objet permet la réutilisation des programmes et des composants
logiciels déjà développés. Une classe sera réutilisée dans sa totalité en créant une nouvelle
instance de cette classe comme elle peut être réutilisée partiellement en lui ajoutant de
nouvelles propriétés ou en modifiant la sémantique de certaines de ses méthodes. Ceci
permet d'exploiter les points communs dans les applications et d'éviter à réinventer les
solutions à des problèmes qui sont déjà rencontrés.
Mr. Sedairia 4. (2015/2016) 47 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3*"“Licence (ST/ ISIL) |_ Chapitre N°5: Programmation orientée objet
e Factorisation
Le mécanisme d’héritage permet une factorisation de la partie commune de la définition de
plusieurs classes. Ce qui permet d'enlever les redondances, d’alléger les programmes de
l'application et de faciliter le travail du programmeur.
e Modélisation
Un langage orienté objet n’est pas concentré sur les procédures mais il manipule des objets.
Un objet est une entité qui contient certains nombre de données et d'actions permettant de
manipuler ces données. Donc, l’approche orientée objet est plus proche de notre mode de
pensée. Ce qui permet d’avoir une modélisation fidèle du monde réel et par conséquent une
meilleure conception des applications ainsi qu’une implémentation plus aisée.
e Extensibilité
L'extensibilité est la facilité d'adaptation d’une application aux changements de la
spécification. Le problème de l’extensibilité devient de plus en plus difficile tant que la taille
de l’application est grande. Ce problème est très lié à l'autonomie des modules de
l'application.
Dans l'approche orientée objet, la décomposition d’une application en différentes classes
nous permet de mieux cerner les parties que l’on veut faire évoluer. De plus, la notion
d’héritage nous permet de construire de nouvelles classes et de programmer juste la
différence avec les classes des applications antérieures.
e Compatibilité
La compatibilité entre les différents composants d’une application est assurée par la
normalisation de ces composants. La programmation orientée objet fournit une structure
unique qui est la classe. Les classes sont instanciées d’une seule manière et communiquent
entre elles à l’aide d’un unique mécanisme qui est l’envoi de message.
5. Conclusion
Les quatres notions : de classe, d’instanciation, d'envoi de message et d’héritage suffisent
à définir le concept de programmation orientée objet. D’autres notions moins fondamentales
sont introduites dans la programmation orientée objet telles que la généricité qui permet de
paramétrer des classes d'objets. Par exemple, la classe pile sera paramétrée par le type de ses
éléments. Une classe paramétrée est également appelée « classe générique ». Il y a également
d’autres notions qui caractérisent les propriétés techniques des différents langages orientés
objet.
Bien qu'elle présente plusieurs avantages, l'approche orientée objet présente aussi
certains inconvénients si bien que la richesse des concepts à maîtriser exige des concepteurs et
des programmeurs de grande qualité. La construction du graphe d’héritage est particulièrement
délicate pour les applications complexes. Ainsi, l’invocation dynamique de certaines méthodes
pendant l'exécution d’un programme nécessite une recherche de l'implantation de la méthode.
Ce qui conduit à un traitement supplémentaire.
Mr. Sedairia A. (2015/2016) 48 Université Larbi ben M'hidi - OEB
Paradigmes de programmation - 3* "Licence (SI/ ISIL) |_ Chapitre N°5: Programmation orientée objet
Résumé langage Java
Java possède un certain nombre de caractéristiques qui ont largement contribué à son
énorme succès :
Java est interprété : le programme source est compilé en pseudo code ou byte code puis
exécuté par un interpréteur Java : la Java Virtual Machine (JVM). Ce concept est à la base du
slogan de Java : WORA (Write Once, Run Anywhere : écrire une fois, exécuter partout). En effet,
le byte code, s'il ne contient pas de code spécifique à une plate-forme particulière peut être
exécuté et obtenir quasiment les mêmes résultats sur toutes les machines disposant d'une JVM.
Java est orienté objet : comme la plupart des langages récents, Java est orienté objet. Chaque
fichier source contient la définition d'une ou plusieurs classes qui sont utilisées les unes avec les
autres pour former une application. Java n'est pas complètement objet car il définit des types
primitifs (entier, caractère, flottant, booléen,...).
Java est portable : il est indépendant de toute plate-forme.
Java assure la gestion de la mémoire : l'allocation de la mémoire pour un objet est automatique
à sa création et Java récupère automatiquement la mémoire inutilisée et restitue les zones de
mémoire laissées libres suite à la destruction des objets.
Il'existe 2 types de programmes avec Java : les applets et les applications. Une application
autonome est une application qui s'exécute sous le contrôle direct du système d'exploitation.
Une applet est une application qui est chargée par un navigateur et qui est exécutée sous le
contrôle d'un plug-in de ce dernier.
La compilation d'un code source: Pour compiler un fichier source il suffit d'invoquer la
commande javac avec le nom du fichier source avec son extension .java ( javac NomFichier.java)
Le nom du fichier doit correspondre au nom de la classe principale en respectant la casse. Suite
à la compilation, le pseudo code Java est enregistré sous le nom NomFichier.class
L'exécution d'un programme : Pour exécuter un fichier .class il suffit d'invoquer la commande
java avec le nom du fichier source sans son extension .class (java NomFichier )
= javac test. java java test
test. java test.class >| executable
Mon premier programme
public class bonjour {
public static void main(String args{]) {
System.out.println("Bonjour le monde! "y
}
}
Le paramètre args passé à la méthode main est un tableau de chaînes de caractères qui contient
les paramètres passés à l'application java sur la ligne de commande. On a accès à ces
paramètres en écrivant args{0], args[1], etc. Le nombre de paramètres est fourni par
args.length.
Mr. Sedairia A. (2015/2016) 49 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3°"] jcence (S1/ ISIL) | Chapitre N°5: Programmation orientée objet
Les constantes
Les constantes sont définies avec le mot clé final : leur valeur ne peut pas être modifiée
une fois qu'elles sont initialisées.
Exemple:
public class Math {
public static final double PI = 3. 14159265358979323846 ;
}
Les méthodes
Les méthodes sont des fonctions qui implémentent les traitements de la classe.
La syntaxe de la déclaration
[visibilité] [static] ] [final] type retourné nom_ méthode (argl, ..){..)]
Le type retourné peut être élémentaire ou correspondre à un objet. Si la méthode ne retourne
rien, alors on utilise void.
La valeur de retour de la méthode doit être transmise par l'instruction return. Elle indique la
valeur que prend la méthode et termine celle ci : toutes les instructions qui suivent return sont
donc ignorées.
Exemple :
private int add(int a, int b) {
return a+b; }
Constructeurs d'une classe
Un constructeur d'une classe est une méthode particulière. Elle n'a pas de type de retour,
et porte le même nom que la classe dans laquelle elle se trouve.
Une classe peut avoir plusieurs constructeurs à condition qu'ils aient des signatures différentes,
c'est-à-dire des paramètres différents.
Une classe qui ne déclare aucun constructeur explicitement en possède en fait toujours un : le
constructeur vide par défaut, qui ne prend aucun paramètre. Si l'on définit un constructeur
explicite, alors ce constructeur vide par défaut n'existe plus,
Le mot-clé this
Le mot-clé this désigne en permanence l'objet dans lequel on se trouve. Il existe dès
l'instant que l'on se trouve dans l'instance de quelque chose. En particulier, il n'est pas défini
dans un élément statique. En général, ce mot-clé est utilisé pour lever l'ambigüité qui peut
exister entre le champ d'une classe et un paramètre d'une méthode dans laquelle on se trouve,
comme dans l'exemple qui suit.
public class Personne {
public void setNom(String nom) {
this.nom = nom ;
//utiliser this pour lever l'ambigüité entre le paramètre et le champ
}
}
Mr. Sedairia À. (2015/2016) 52 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3* “Licence (SI/ISIL) | Chapitre N°5: Programmation orientée objet
Le choix public ou privé
Les champs et les méthodes d'une classe peuvent être publics (mot-clé public) ou privés
(mot-clé private). Comment choisir ?
1. Les classes et leurs constructeurs sont en général publics, leur raison d'être est justement
d'être utilisés par d'autres.
Les champs contenant les données doivent en général être privés.
3. L'accès aux champs se fait par des méthodes de lecture (préfixées par get) et d'écriture
(préfixées par set) qui doivent être publiques.
4. Pour les autres méthodes on décide au cas par cas.
Héritage
Une classe B qui hérite d’une classe A est une sous-classe de A, et À est la super-classe de
B. La classe java.lang.Object est la super-classe de toutes les classes Java, directement ou
indirectement.
Pour créer une classe B qui hérite d’une classe À, il faut utiliser la syntaxe suivante.
public class À {
}
public class B extends À {
}
On peut dire aussi que B étend A, ou dérive de A, ou est une classe dérivée de A. On peut
également exprimer cette relation en termes de parent / enfant, les parents étant les super-
classes, et les enfants les sous-classes.
On dit aussi que les objets de B sont des objets de A. Cette dernière façon d'exprimer la relation
d'héritage est très pratique, et permet de bien comprendre cette notion d'héritage. Une
référence de type A ne peut se voir affecter qu’une référence d’un type À ou dérivé de A.
Une des particularités de Java par rapport à d’autres langages objet tels que le C++, est que
l'héritage multiple n’est pas autorisé. Une classe ne peut hériter que d’une seule classe à la fois,
Empêcher l'héritage
Il est possible d'empêcher qu'une classe soit héritée par une autre classe, ou qu'une
méthode soit surchargée par une méthode d'une sous-classe. || suffit pour cela d'utiliser le mot-
clé final, pris en compte à la compilation.
public final class À { // A ne peut être étendue
}
public B {
public final void test() { // ne peut être surchargée, bien que
// B puisse être étendue
Mr. Sedairia À. (2015/2016) 53 Université Larbi ben M'hidi - OEB
Paradigmes de programmation — 3°" Licence (SI/1SIL) |_ Chapitre N°5: Programmation orientée objet
Polymorphisme et surcharge de méthodes
La surcharge (overload) consiste à écrire plusieurs méthodes de même nom dans une
même classe, prenant des paramètres différents, Quand un appel de méthode est fait, le
compilateur commence par établir la liste des méthodes portant le bon nom. Ensuite, il regarde
la liste des paramètres, trouve celle des méthodes qui correspond le mieux. L'utilisation de telle
méthode plutôt que telle autre est donc décidée à la compilation, et non pas à l'exécution.
La redéfinition (override) consiste à redéfinir une méthode d'une classe parent dans une
classe enfant. Bien souvent, il n'est pas possible, à la compilation, de déterminer quel objet va
effectivement être appelé. Ce mécanisme s'appelle liaison dynamique, qui signifie que l'appel
d'une méthode est déterminé à l'exécution, suivant la nature de l’objet effectivement référencé
(et non seulement suivant le type de la référence).
public class À !{
public String nom = "Classe A";
public void ouSuisye(){
System.out.printin("Je suis dans À !") ;
}
public class B extends A {
public String nom = "Classe B";
public void ouSuisJe(){
System.out.println("Je suis dans Bent)
}
public class Test{
public static void main(String(] args) {
À al = new A() ;
B b = new B() ;
À a2 = b ;
System.out.printin('"al.ouSuisde ? "); al.ouSuisJe();
System.out.println("b.ouSuisJe ? "); b.ouSuisJe();
System.out.printin("a2.ouSuisJe ? "); a2.ouSuisJe() ;
System.out.println("a2.nom = " + a2.nom) ;
}
Nous obtenons le résultat :
al.ouSuis]e ? Je suis dans À !
b.ouSuisJe ? Je suis dans B...
a2.ouSuisJe ? Je suis dans B...
a2.nom = Classe _A
Les classes abstraites
Une classe abstraite est une classe qui ne permet pas d'instancier des objets. Elle ne peut
servir que de classe de base pour une dérivation. Elle se déclare ainsi:
Mr. Sedairia À. (2015/2016) 54 Université Larbi ben M'hidi - OEB