Programmation Par Objets : Petite Introduction




Najib Tounsi
Ecole Mohammadia d'Ingénieurs, Rabat Logo EMI



Année 2018/2019
1ère année Génie Informatique

http://www.mescours.ma/Java/PooJavaPart-0.html

Sommaire

Programmation avec les objets

Deux aspects

Objet = entité du monde réel.

Exemples En Javascript

document.write(); 

document est une  page Web en cours d'affichage (l'objet considéré). L'effet de cette fonction write() est écrire un message dans le document.

 document.getElementsByTagName( 'p' );

fonction qui retourne un objet paragraphe ( p ) dans un document HTML.

par = document.getElementsByTagName( 'p' );
par.setAttribute("style", "color:blue");

on peut ensuite lui attribuer avec setAttribute() une couleur bleu (color:blue)...

window.open("https://docs.oracle.com/javase/tutorial/");

on ouvre l'URI spécifié dans l'objet window, qui représente une fenêtre du navigateur.

window.moveTo(...)    déplace une fenêtre vers la position donnée

Exemples en Java

ecran.println("Hello, World"); 

Objet = données + opérations

OBJET = données + opérations  (dits aussi attributs et méthodes).

String
attributs length , ...
méthodes : charAT(), concat(), indexOf(), ...
usage :  i = s.indexOf('a');    -- le rang de a dans la chaîne s.
Point
  p.setX(2);          -- affecte 2 à l’abscisse x du point p
  a = p.getY();     -- accès à l’ordonnée y de p
Calendar
 maintenant = Calendar.getInstance();
  jour = maintenat.get (Calendar.DAY_OF_MONTH);

etc...

Objet = abstraction, qui permet de s'intéresser d'abord à l'essentiel.

Exemple d'une pile

Algorithme


Pile p ← vide; 
Lire un caractère c
Tant que c défini {
si (c = <<une parenthèse ouvrante>>)
p ← empiler(p, c)
sinon si (c <<est une parenthèse fermante>>) {
si (estVide(p)) retourner "ERREUR: parenthèse fermante en trop"
sinon si (sommet(p) <<est du même type que>> c)
p ← depiler(p)
sinon retourner "ERREUR: parenthèses de types différents"
sinon continuer
Lire un caractère c
}
}
si (estVide(p)) retourner "OK"
sinon retourner "ERREUR: il manque au moins une parenthèse fermante"

Programme en Java

public class TestPileParenthese2 {
static String s = "(())<[{}]#";
static String ouvrante ="([{<";
static String fermante =")]}>";

static public void main(String args[]) {
char c; int i=0; boolean ok = true;

Pile p = new Pile();

while ((c = s.charAt(i++)) != '#') {
if (ouvrante.indexOf(c)!= -1)
p.empiler(c); // On empile un caractère ouvrant
else if (fermante.indexOf(c) != -1)
if (p.estVide()) { // !parenthèse fermante en trop
erreur ("ERREUR! parenthèse fermante en trop " + c );
ok = false; break;
}
else if (compare (c, p.sommet() )) // même type, on dépile.
p.depiler();
else { // !parenthèses de types différents
erreur ("ERREUR! parenthèses de types différents: " + c);
ok = false; break;
}
// Autrement c'est un autre caractère...
}

if (ok)
if (p.estVide())
System.out.println ("OK, bien parenthesee");
else erreur ("ERREUR! parenthèse ouvrante en trop:" + p.sommet());
else;
}

// Routines locales
static boolean compare (char a, char b){
return fermante.indexOf(a) == ouvrante.indexOf(b);
}
static void erreur(String s) {
System.out.println (s);
}
}

Avantages...

L'application fait  L'objet  fait
p char t[];
int top = -1;
p.empiler (c) top++;
t [top] = c;

p.dépiler top--;
p.sommet() return t [top];

Avantages

Mais Encore ...

Mais où sont donc programmées les données et les opérations sur un objet?

Dans un endroit séparé... La classe.

La Classe ...

Elle déclare les données d'un objet de la classe et les opérations qui lui sont applicables.

Les données
(attributs)
char[] t;
int top;
Les opérations
(méthodes)

public void empiler(char c) {
    t[++top] = c;
}

public char sommet() {
    return t[top];
}
public void depiler() {
    top-- ;
}
public boolean estVide() {
    return (top < 0);;
}
...

Une classe Pile est donc l'ensemble des objets ayant ces caractéristiques.

Le source complet en Java 

NB. Dans certains langages, on dit aussi Module, Type, Package, cluster...

La Classe

La Classe Point

Autre exemple : une classe qui définit un point de l'espace.

/**
 * Classe Point du plan avec ses cordonnées x et y
 */

 public class Point {
    protected int x, y;  
     
     public Point(){ 
	 this (0);
     }     
public void setX(int p) { x = p; } public void setY(int p) { y = p; } public int getX() { return x; } public int getY() { return y; } };

Usage de la classe Point

On n'a pas besoin de connaître les données (réelles) x et y définies pour un objet Point.

Encore moins de les manipuler directement ! (i.e. faire r = p.x; directement sans passer par la méthode appropriée.)

Les Classes

Les Classes Encore

Versions de "programmes"

... EXTENSIONS HORIZONTALES

Réutilisation de "programmes"

...EXTENSION VERTICALE