Want to create interactive content? It’s easy in Genially!

Get started free

PROGRAMMATION ORIENTÉE OBJET

Fabian CISNEROS-BRID

Created on April 20, 2023

Start designing with a free template

Discover more than 1500 professional designs like these:

Modern Zen Presentation

Newspaper Presentation

Audio tutorial

Pechakucha Presentation

Desktop Workspace

Decades Presentation

Psychology Presentation

Transcript

PROGRAMMATION ORIENTÉE OBJET

Notions de Diagramme de classes. Implémentation en Java.

Commencer >

Index

D.C. - JAVA

NOTIONS POO

INTRODUCTION

DIAGRAMME DE CLASSE

CONTEXTE

+ NOTIONS (1)

NOTIONS - RECAP

INTRODUCTION

Source : https://openclassrooms.com/fr/courses/4670706-adoptez-une-architecture-mvc-en-php/7847610-decouvrez-du-code-professionnel

INTRODUCTION

La programmation procédurale utilise des procédures (fonctions) qui récupèrent des données en entrée, les traitent puis produisent des données en sortie. L'enjeu de ce type de programmation est d'écrire la logique, pas de définir les données.

INTRODUCTION

La programmation orientée objet (POO) est un modèle de langage de programmation qui s'articule autour d'objets et de données, plutôt que d'actions et de logique. La POO a changé la perspective : l'important, ce sont les objets à manipuler plutôt que la logique nécessaire à cette manipulation. De cette manière tout ce qui nous entoure peut devenir potentiellement un objet à implémenter dans une application ou programme.

INTRODUCTION

La première étape (modélisation des données) consiste à identifier tous les objets que le programmeur veut manipuler et leurs interactions. La deuxième étape, l’objet est conceptualisé en une classe d'objet. Cette classe définit le type de données qu'elle contient et toute séquence logique susceptible de la manipuler (c’est-à-dire, tout ce que c’est objet “peut faire”). Chaque séquence logique distincte est une méthode.

DÉFINITION : CLASSE

Description des caractéristiques de l’objet, ainsi que de son comportement (ce qu’il peut faire) Une classe comporte des attributs/champs (variables d’instance) et des méthodes (permettent aux objets créés de réaliser des actions).

DÉFINITION : CLASSE

DÉFINITION : ATTRIBUT

Un attribut (on dit aussi champ) est un élément caractérisant la structure des objets.

  • Chaque attribut possède un nom et un type.
  • Chaque attribut possède une valeur pour toute instance.

DÉFINITION : MÉTHODE

Une méthode est un élément du comportement des objets. C'est une procédure ou une fonction définie dans le classifieur (classe) qui décrit ces objets.

  • Chaque méthode possède un nom et PEUT avoir une liste de paramètres.
  • Chaque méthode possède en plus un type de résultat.

DÉFINITION : OBJET

Un objet représente un concept ou une chose du monde réel ou abstrait. Il s'agit d'une instance de cette classe, avec des valeurs spécifiques attribuées aux propriétés définies dans la classe.

  • Une instance est la réalisation concrète d'une classe : elle possède ses propres valeurs pour les attributs définis dans la classe.

DÉFINITION : OBJET

DIAGRAMME DE CLASSES

nom de la classe
PORTÉE
attributs et leur type
méthodes

DIAGRAMME DE CLASSES

Mes attributs et mes méthodes peuvent être utilisées que par moi de manière interne dans le fonctionnement de la classe (privés "-" : private); par tous ceux qui vont utiliser les objets créés à partir de moi (publiques "+" : public); par les classes qui héritent de moi ou bien celles qui sont dans le même package que moi (protegés "#" : protected)

DIAGRAMME DE CLASSES - CLASSE JAVA - PORTÉE

public class Marchandise { private int poids; private int volume; public Marchandise(int poids, int volume) { super(); this.poids = poids; this.volume = volume; } public int Poids() { return poids; } public int Volume() { return volume; } }

PORTÉE

DIAGRAMME DE CLASSES - DIAGRAMME D'OBJET

m1 : Marchandise
poids = 24 volume = 15

CLASSE JAVA - CONSTRUCTEUR

public class Marchandise { private int poids; private int volume; public Marchandise(int poids, int volume) { super(); this.poids = poids; this.volume = volume; } public Marchandise() { super(); this.poids = 0;this.volume = 0; } ................}

LE CONSTRUCTEUR

est une méthode "particulière" dont le rôle est de créer un nouvel objet. Les constructeurs ont principalement trois tâches :

  1. réserver un emplacement en mémoire pour le nouvel objet.
  2. initialiser les attributs de cet objet, c'est-à-dire leur donner une valeur initiale, et rendre cet objet.
  3. rendre cet objet.

DIAGRAMME DE CLASSES - CLASSE JAVA - ACCESSEURS

public class Marchandise { private int poids; private int volume; public Marchandise(int poids, int volume) { super(); this.poids = poids; this.volume = volume; } public int Poids() { return poids; } public int Volume() { return volume; } }

ACCESSEURS

CLASSE JAVA - Méthodes complémentaires

public class Marchandise { private int poids; private int volume; ...... @Overridepublic String toString() {return "Marchandise [poids=" + poids + ", volume=" + volume + "]";}@Overridepublic boolean equals(Object obj) {......} }

toString()

Permet de décrire la classe à l'aide d’une chaîne de caractères et peut être redéfinie de façon à être adaptée à la classe (instance de classe) qu’on veut décrire.

equals()

Pour les objets est identique à la comparaison “ == ”. Ce qui équivaut à dire à faire une egalité stricte.

Les mots-clés static et final en Java

Définition static : Permet de définir un élément (attribut, méthode ou bloc) appartenant à la classe plutôt qu’à ses instances. Cela signifie que l’élément est partagé entre toutes les instances de la classe et on n'a pas besoin d'instancier (créer) un objet pour y accèder. final : Utilisé pour rendre un élément constant ou non-modifiable, ou réutilisable. Cela s’applique aux variables, méthodes et classes pour limiter leur comportement.

Les mots-clés static et final en Java

Utilisation de static Variables statiques : Une seule copie existe pour toutes les instances de la classe. Variables de classe. Exemple : un compteur partagé entre tous les objets d’une classe. Méthodes statiques : Appartenant à la classe, elles peuvent être appelées sans créer d’objet. Méthodes de classe. Exemple : Méthodes utilitaires comme Math.sqrt(). Blocs statiques : Code exécuté une seule fois au chargement de la classe. Exemple : Initialisation statique d’une ressource partagée.

Les mots-clés static et final en Java

Utilisation de final Variables finales : Une fois initialisées, elles ne peuvent plus être modifiées. Exemple : une constante comme final double PI = 3.14;. Méthodes finales : Une méthode final ne peut pas être surchargée dans une sous-classe (elle ne peut pas être réimplémentée dans une classe fille) Exemple : sécuriser le comportement d’une méthode critique. Classes finales : Une classe final ne peut pas être héritée. Exemple : la classe String en Java est final.

Les mots-clés static et final en Java

Exemple d'utilisation de static

Les mots-clés static et final en Java

Exemple d'utilisation de final

Les mots-clés static et final en Java

Exemple d'utilisation combinée de static et final

ENCAPSULATION

L'encapsulation est une technique essentielle des langages à objets. Elle consiste à réunir au sein d'une classe la structure (attributs) et le comportement (méthodes) d'un type de donnée.
  • On dit alors que le classifieur encapsule la structure et le comportement.
  • Le mot clef private indique que ces variables ou méthodes ne sont accessibles QU'À l'intérieur de la classe. Cela évite qu’on puisse accéder aux champs de la classe de l'extérieur de la classe.
  • L'encapsulation est une évolution de la notion de module que l'on trouve dans des langages tels Pascal ou C.

SURCHARGE

La surcharge est la capacité que possède une classe d'avoir plusieurs méthodes portant le même nom.
Remarque : Tous les langages à objets n'autorisent pas la surcharge, considérée comme très pratique par certains et source de problèmes par d'autres.

L'AGRÉGATION et la COMPOSITION

L'agrégation et la composition est la capacité d'un objet à être constitué de manière concrète ou abstraite par d'autres objets ou à faire référence à d'autres objets. L'agrégation et la composition sont des relations interclassifieurs (entre de classes)
Dans les langages à objets, l'agrégation et la composition sont matérialisées par des attributs. Par exemple, un objet automobile est constitué d'un objet carrosserie, d'un objet moteur et d'un objet Immatriculation.

L'AGRÉGATION et la COMPOSITION (suite)

On parle plutôt de composition quand la durée de vie du constituant dépend de celle du constitué : l'objet carrosserie doit être détruit en même temps que l'objet automobile.
On parle plutôt d'agrégation lorsque l'objet Immatriculation doit continuer d'exister même quand ce n'est plus le cas de l'objet automobile.

L'AGRÉGATION et la COMPOSITION (suite)

L'HÉRITAGE

L'héritage est une technique essentielle des langages à objets. Il permet de définir une nouvelle classifieur (classe) en fonction d'une classe existante.
L'héritage est bien adapté à la spécialisation : on dit alors que le classifieur héritier spécialise le classifieur hérité. Par exemple, le classifieur Employé spécialise le classifieur Personne : un employé est une personne spécialisée.
L'héritage peut être simple (chaque classifieur hérite d'un seul classifieur) comme en Java ou multiple (chaque classifieur peut hériter d'un ou plusieurs classifieurs) comme en Eiffel et C++. Chaque choix a ses avantages et inconvénients.
L'héritage est une relation interclassifieur (entre des classes).

L'ABSTRACTION

L’abstraction est l’un des principes fondamentaux de la programmation orientée objet (POO). Elle consiste à cacher les détails d’implémentation pour se concentrer sur l’essentiel, c’est-à-dire ce qu’un objet fait plutôt que comment il le fait. Voici les principaux éléments à considérer pour bien utiliser l’abstraction dans vos projets en POO :
Classes abstraites
Interfaces
Classes Abstraites vs Interfaces
Réduction de la duplication de code
Avantages de l’abstraction

L'ABSTRACTION

CONTEXTE - PRÉSENTATION

CONTEXTE - DIAGRAMME DE CLASSES (évolution)

Notions de P.O.O. - Récapitulatif

MERCI !

L'ABSTRACTION

Avantages de l’abstraction
  • Simplicité : On ne se concentre que sur les comportements essentiels (par exemple, “se déplacer” ou “soigner”) sans se soucier de l’implémentation interne.
  • Réduction des erreurs : En imposant des méthodes abstraites, on s’assure que chaque sous-classe implémente les comportements nécessaires.
  • Évolutivité : Il est facile d’ajouter de nouvelles fonctionnalités en respectant les structures existantes.
  • Maintenabilité : Une modification dans une classe abstraite peut se répercuter sur toutes les sous-classes, limitant ainsi les interventions manuelles.

OBJET

Explication de l'exemple

Classe : La classe Voiture définit les propriétés (attributs : marque, modele, couleur) et les comportements (méthodes : demarrer, peindre) communs à toutes les voitures. Objet : Les objets voiture1 et voiture2 sont des instances spécifiques de la classe Voiture, avec leurs propres valeurs (marque, modele, etc.).

Le polymorphisme

Paramétré
  • La méthode int addition(int, int) pourra retourner la somme de deux entiers
  • La méthode float addition(float, float) pourra retourner la somme de deux flottants.
  • La méthode char addition(char, char) pourra définir au gré de l'auteur la somme de deux caractères, etc.
On appelle signature le nombre et le type (statique) des arguments d'une fonction. C'est donc la signature d'une méthode qui détermine laquelle sera appelée.

Le polymorphisme paramétré, appelé généricité, représente la possibilité de définir plusieurs fonctions de même nom mais possédant des paramètres différents (en nombre et/ou en type). Le polymorphisme paramétré rend ainsi possible le choix automatique de la bonne méthode à adopter en fonction du type de donnée passée en paramètre. On peut par exemple définir plusieurs méthodes homonymes addition() effectuant une somme de valeurs.

Le polymorphisme

d'héritage

La possibilité de redéfinir une méthode dans des classes héritant d'une classe de base s'appelle la spécialisation. Il est alors possible d'appeler la méthode d'un objet sans se soucier de son type intrinsèque : il s'agit du polymorphisme d'héritage. Ceci permet de faire abstraction des détails des classes spécialisées d'une famille d'objet, en les masquant par une interface commune (qui est la classe de base).

Imaginons un jeu d'échec comportant des classes "Roi", "Reine", "Fou", "Cavalier", "Tour" et "Pion", héritant chacun de la classe "Piece". La méthode mouvement() pourra, grâce au polymorphisme d'héritage, effectuer le mouvement approprié en fonction de la classe de l'objet référencé au moment de l'appel. Cela permettra notamment au programme de dire aux objets pièces de faire un "mouvement" sans avoir à se préoccuper de la classe de la pièce.

L'ABSTRACTION

Réduction de la duplication de code

L’abstraction est un outil clé pour éviter la duplication de code.

  • Méthodes communes : Placez dans les classes abstraites les méthodes génériques que toutes les sous-classes peuvent réutiliser.
  • Méthodes spécifiques : Implementez des méthodes abstraites pour forcer les sous-classes à personnaliser leur comportement.
  • Cela favorise la réutilisation et la maintenabilité du code.

Le polymorphisme

ad hoc

Le polymorphisme ad hoc permet d'avoir des fonctions du même nom, avec des fonctionnalités similaires, dans des classes sans aucun rapport entre elles (si ce n'est bien sûr d'être des filles de la classe Objet). Par exemple, la classe complexe, la classe "Image" et la classe "Lien" peuvent avoir chacune une fonction "afficher". Cela permettra de ne pas avoir à se soucier du type de l'objet que l'on a si on souhaite l'afficher à l'écran.

Le polymorphisme ad hoc permet ainsi de définir des opérateurs dont l'utilisation sera différente selon le type des paramètres qui leur sont passés. Il est donc possible par exemple de surcharger l'opérateur "+" et de lui faire réaliser des actions différentes selon qu'il s'agit d'une opération entre deux entiers (addition) ou entre deux chaînes de caractères (concaténation).

Classes Abstraites vs Interfaces

Exemple : Une interface Soignant pour les personnages capables de soigner. public interface Soignant { public void soigner(); } public class Medecin implements Soignant { public void soigner() { System.out.println("Le médecin soigne les blessés."); } } public class Chirurgien implements Soignant { public void soigner() { System.out.println("Le chirurgien opère avec précision."); } }

l'abstraction

Interfaces

  • Une interface définit un contrat que les classes doivent respecter.
  • Contrairement à une classe abstraite, une interface ne contient que des méthodes abstraites (sans implémentation, dans la plupart des langages modernes).
  • Une classe peut implémenter plusieurs interfaces, ce qui permet de simuler l’héritage multiple.
  • Rôle principal : Garantir que des classes non liées partagent certains comportements.

P.O.O.

Le polymorphisme

Le nom de polymorphisme vient du grec et signifie qui peut prendre plusieurs formes. Cette caractéristique est un des concepts essentiels de la programmation orientée objet. Alors que l'héritage concerne les classes (et leur hiérarchie), le polymorphisme est relatif aux méthodes des objets.

On distingue généralement trois types de polymorphisme :

  • Le polymorphisme ad hoc (également surcharge ou en anglais overloading)
  • Le polymorphisme paramétrique (également généricité ou en anglais template)
  • Le polymorphisme d'héritage (également redéfinition, spécialisation ou en anglais overriding)

Exemple : Une classe abstraite Personnage peut contenir une méthode abstraite seDeplacer(). Les sous-classes Guerrier, Sniper et Médecin redéfiniront cette méthode en fonction de leur comportement spécifique. public abstract class Personnage { abstract void seDeplacer(); // Méthode abstraite void combat() { .... } } public class Guerrier extends Personnage { void seDeplacer() { System.out.println("Le guerrier avance rapidement !"); } }

L'ABSTRACTION

Classe abstraite

C'est une classe qui ne peut pas être instanciée directement. Elle sert de modèle pour les classes dérivées (les sous-classes). Rôle principal : Définir une structure de base que les sous-classes vont spécialiser. Elle peut contenir :

  • Des méthodes abstraites (sans corps) : elles imposent aux sous-classes de fournir leur propre implémentation.
  • Des méthodes concrètes : méthodes déjà définies, prêtes à être réutilisées par les sous-classes.