Introduction - Pierre Rainero

publicité
Programmation orienté objet :
Introduction :
Les langages de programmation vus jusqu’à présent (C et C++) ne supportent pas la
programmation orientée objet contrairement à d’autres langages comme le Java.
 Un cycle est une succession des étapes à mener à bien pour arriver au terme du projet,
la programmation a une position centrale dans un cycle.
On va chercher à coder en un minimum de lignes, et prévoir de nombreuses maintenances qui
pourront être réalisées par des gens externes au groupe de développement.
Maitrise d’ouvrage : Paye les coûts de développement et rédige le cahier des charges
Maitre d’œuvre :
Groupe ou individu à qui on confie le projet.
Cycle de vie en V :
Cahier des charges
UML
Unified
Modeling
Language
Analyse
Conception
Programmation
(Java)
Normalement si on a bien travaillé on obtient 17 diagrammes différents, groupés en 3 lots :
- Diagrammes structurels
- Diagrammes comportementaux
- Diagrammes d’interaction
Désormais en on ne passera plus par le main, il ne servira qu’à lancer le programme (10 lignes
maximum).
Le paradigme objet :
Un paradigme : Modèle théorique de pensée qui oriente la recherche et la réflexion scientifique.
 Ensemble cohérent de concepts, utilisés pour une programmation efficace et rapide.
Les développeurs peuvent considérer le programme comme une collection d’objets en
interaction.
Termes en Java :
Malloc = new
C/C++
Java
TAD
(=structure)
Classe
Free (fait automatiquement)
Instance d’un TAD
Objet
Char* = string
Fonction
Méthode
Les procédures sont des fonctions particulières donc ce sont aussi des méthodes.
Le langage Java a quelques particularités qui n’existent pas en dans des langages procéduraux.
1. L’encapsulation : Pour expliquer on utilise un exemple, les variables d’une fonction C
sont encapsulées dans la fonction (elles ne peuvent pas être appelées hors de la
fonction).
Le principe est le même mais élargi, on va pouvoir rendre invisible une classe et on va
cacher tous ses attributs.
 On peut trouver dans deux classes différentes des méthodes avec le même nom.
2. Le polymorphisme : A l’intérieur d’une classe on peut avoir la même signature formelle
3. La généricité : Pouvoir réutiliser une classe pour un autre projet (par exemple une grille
d’un jeu d’échec pour un jeu de dames)
4. La persistance : Sauvegarder le travail ou la partie, et pouvoir la rouvrir tel quel plus
tard.
 Faisable très facilement en Java (1 ligne).
5. L’héritage : Permet de récupérer les attributs d’une classe et d’en rajouter, par exemple
en utilisant une classe pour faire une fenêtre (cadre, boutons en haut à droite, etc) puis
en ajoutant d’autres fonctionnalités (menus, etc).
Structuration logique :
• Toute application est une partition de classes
• Chaque classe est la description complète d’une entité fonctionnelle du problème à
traiter (TAD en C/C++, TABLE en SQL)
• Les entités sont identifiées en phase d’analyse (UML)
• Les attributs sont les propriétés de chaque entité (Champs de TAD en C, Colonnes en SQL)
• Les méthodes sont les opérations (comportements) de chaque entité décrite (fonctions
en C/C++)
• Un diagramme de classes UML rassemble et relie entre elles toutes les classes du
problème traité
Module M213 / Langage Java :
• Le mot clé class remplace struct
• Introduction spécificateurs de portée (private/public)
• Masquage implicite de la définition de type (typedef)
• Pas d’accessibilité externe aux champs (private)
• Moyens standards de construction (constructeurs)
• Allocation dynamique des instances (objets)
• Consultation/modification des champs par accesseurs
• Encapsulation des fonctions (méthodes)
Exemple : TAD Point :
C/C++
Java
struct Spoint {
double abscisse;
double ordonnee ;
};
typedef struct Spoint point;
point creerpoint(double uneAbs, double uneOrd);
public class Point {
private double abscisse;
private double ordonnee;
public Point (double uneAbs, double uneOrd) {
abscisse= uneAbs;
ordonnee= uneOrd;
}
public double getAbscisse() {return abscisse;}
public double getOrdonnee() {return ordonnee;}
public String toString() {
return "(" + abscisse + " , " + ordonnee + ")" ;
}
public double distance(Point unB) {
double deltaX= abscisse - unB.abscisse;
double deltaY= ordonnee - unB.ordonnee;
return Math.sqrt(deltaX*deltaX + deltaY*deltaY);
}
}
Constructeur
char* toString(point unA);
double distance(point unA, point unB);
-
Toutes les variables sont dans la Pile
Tous les objets sont dans le TAS
Les ruptures sont marquées par des majuscules
Les méthodes sont en minuscules
Un constructeur a toujours le nom de la classe
Chaque classe décrit toutes les propriétés et toutes les opérations
Tous les modèles sont encapsulés (visibilité limitée !)
toString : Outil d’aide aux test unitaires (il s’agissait d’une fonction maintenant il s’agit d’une
méthode). (Elle produit une forme externe de toutes instances du TAD)
Le return est identique au C, les + permettent la concaténation. Ici le toString retournera une
chaine de caractères (string) du type "(abscisse , ordonnée)", exemple : (1 , 0.7).
distance : public double distance(Point unB), on a juste un seul paramètre. Il y a en réalité deux
objets, il s’agit d’un objet dit objet support, il est implicite, c’est sur lui qu’est appliqué
la méthode.
get : Permet de récupérer les valeurs des attributs (car ils sont privés)
set (à la même manière qu’un get) : Permet de modifier les attributs
 Dans l’exemple ci-dessus, on pourra récupérer l’abscisse ou l’ordonnée mais les modifier.
En Java, il n’y a pas de compilation « séparé » (pas de prototypes), Java compile chaque
classe séparément et en totalité.
Le main est une méthode comme une autre, placée dans une ou plusieurs classes choisies par
le développeur (il faudra alors préciser laquelle lancer).
Le cas des constructeurs :
- Pas de mention du retour (ni type, ni void)
JavaBeans
- Constructeur par défaut (sans paramètres), il est obligatoire d’après les règles de codage
- Constructeurs normaux (signatures différentes)
- Possibilité d’invoquer un constructeur dans le corps de la définition d’un autre
constructeur
Exemple pour un objet de la classe Point :
public Point() {
Valeurs par défaut,
abscisse= 0.;
Constructeur par défaut précisées dans le
ordonnee= 0.;
constructeurs
}
public Point(double x, double y) {
abscisse= x;
Constructeur normal
ordonnee= y;
}
- Mot clé new pour invoquer un constructeur
Exemple pour un objet de la classe Point : Point p0= new Point();
Point p1= new Point(1.5, -2.7);
Appeler une méthode :
Opérateur d’application
- support.méthode();
Objet implicite
-
Avec plusieurs supports : p1.p2.méthode();
Avec plusieurs paramètres p1.méthode(p2,p3);
Chaine de production de programme :
En C :
fichier
Fait disparaitre et traite les #
(les directives)
point.c
Editeur de texte
Programmeur
Préprocesseur (lint)
Compilateur (gcc)
Papiers où sont écris de
la programmation C
Editeur de liens
(links)
Le chargeur
(loader)
point.obj
(.o pour linux)
Fichier contenant du binaire translatable
(Ce fichier ne se produit pas s’il y a des erreurs de compilation)
point.exe
Utilise les .obj et les bibliothèques
(.lib sous Windows et .a sous Linux/CodeBlocs)
Système d’Exploitation
Processus
(le chargeur, l’ordonnanceur (gestionnaire de tâches), le filemanager, l’allocateur mémoire,…)
Applications
TAS
Piles
En Java :
Editeur de texte
Programmeur
Compilateur
(javac)
Programmation Java
P majuscule obligatoire
car c’est une classe
JVM : Java Virtuel Machine
(java)
Processus qui lit ligne par
ligne le P code et l’exécute
Point.java
En byte code (ou code
intermédiaire ou encore P code)
Point.class
JavaDoc : Permet de faire des balises avec un éditeur de texte (comme bloc-notes par exemple),
à la manière de l’HTML. Elle commence toujours par des « @ », exemple :
@author Alain Thuaire - Universite de Nice/IUT - Departement informatique
@version 1.0.0
:
version initiale
Lorsqu’on suit ce « chemin » de production on utilise l’invite de commande windows, en
appelant le compilateur avec comme argument « –help » on peut voir qu’il existe de nombreuses
options qui ne sont pas gérées par les IDE. (exemple : matches qui permet de gérer des
expression régulières comme avec un grep).
Rappel : ls (linux)  dir (windows)
Téléchargement