Objets et classes Définitions * Un objet est une entité * Chose concrète ou abstraite * Ayant un intérêt pour l'étude * Pouvant être reconnu distinctement * Exemple: une voiture Clio 2 DCI, un stylo bleu... * Classe = objets d'un même type * Décrit un ensemble d'objets similaires * Exemple * Classe = voiture * Objets = Clio 2 DCI, Punto S55... Membres d'une classe * Une classe possède des "membres" * Des attributs * Des méthodes * Attributs = état * Caractéristiques de l'objet * Exemple: la couleur de la voiture * couleur sera un attribut de la classe voiture * bleu sera la valeur de cet attribut pour un objet précis * Ensemble des valeurs des attributs = état de l'objet * Programmation: attribut = variable propre à l'objet * Méthodes = comportement * Fonctionnalités de l'objet * Exemple: la voiture accélère * accélérer sera une méthode de la classe voiture * Une méthode permet de changer l'état de l'objet * Programmation: méthode = fonction propre à l'objet Formalisme UML * UML = Unified Modeling Language * Formalisme international pour la modélisation * Permet de modéliser tout type de système * Utilisé en particulier pour modéliser des logiciels * Programmes informatiques * Bases de données * Sites Web * Principaux types de schémas * Diagramme des cas d'utilisation * Analyse des besoins * Diagramme de classes * Structure statique du système * Diagramme d'interactions * Structure dynamique du système * On présente ici le diagramme de classes Représentation en UML * Représentation d'un objet * Représentation d'une classe ==> décrire des objets ayant * Des propriétés (des attributs) similaires * Un comportement (des méthodes) commun * Des relations communes avec d'autres objets Envoi de messages * Un objet peut demander à un autre d'effectuer une action * Exemple: "alonso" envoie le message "accélérer" à "clio" * Que se passe-t-il d'un point de vue programmation ? * Requête auprès du receveur * Durant l'exécution d'une des méthodes de "alonso" * Appel à la méthode "accélérer" de "clio" * Syntaxe généralement employée (C++ / Java / C#): clio.accelerer() * Généralement, exécution synchrone de la requête * L'objet "alonso" arrête alors son exécution * L'objet "clio" prend la main le temps d'exécuter "accélérer" * Similaire à un appel de fonction 1er principe fondateur: l'encapsulation * Séparation forte entre "interface" et "implémentation" * Interface = partie visible d'un objet * Signatures des méthodes disponibles de l'extérieur * Messages / services auxquels l'objet répond * Accessibles aux objets d'autres classes * Implémentation = partie cachée d'un objet * Tous les attributs * Contenu de toutes les méthodes * Détails du fonctionnement des méthodes masqués * Signatures des méthodes indisponibles de l'extérieur * Intérêt: principe d'abstraction * Connaître le moins d'éléments possibles sur l'objet utilisé * Modifier l'implémentation d'un objet est sans conséquences * Seule la modification de son interface a des répercussions Visibilité des membres (1/3) * Possibilité de contrôler la visibilité des membres * Membre public (symbole UML: +) * Accès par n'importe quel objet * Membre privé (symbole UML: -) * Accès par les objets de la classe uniquement * Membre protégé (symbole UML: #) * Accès par les objets de la classe et de ses "sous-classes" * Définition de "sous-classe" au chapitre suivant * Certains langages proposent des niveaux spécifiques * Exemple: membres "friendly" en Java * Permettent une visibilité au niveau d'un module / package Visibilité des membres (2/3) * En général: les attributs sont cachés * Visibilité privée ou protégée * Seules les méthodes de l'objet modifient les attributs * Accès aux attributs par des méthodes spécifiques * Par convention * getX() retourne la valeur de l'attribut X * setX(valeur) affecte une valeur à l'attribut X * Ces méthodes sont appelées des "accesseurs" * Permettent d'effectuer un contrôle * Exemple: vérifier qu'une valeur est correcte avant affectation Visibilité des membres (3/3) Cycle de vie d'un objet (1/4) * Création d'un objet en deux temps * Allocation de la mémoire pour stocker son état * Initialisation de son état * Manière d'allouer la mémoire dépendante du langage * C++ * Variables: automatique (sur la pile) * Pointeurs: à la charge du développeur (sur le tas) * Java / C# * Références: à la charge du développeur Cycle de vie d'un objet (2/4) * Initialisation = "construction" * Construction d'un objet de classe X ==> Exécution d'une méthode spécifique de X * Méthode appelée "constructeur" * Reçoit éventuellement des arguments * Porte généralement le nom de la classe (C++ / Java / C#) * Allocation et construction souvent liées * Mot-clé généralement utilisé (C++ / Java / C#): new * Exemple: new Voiture() * Alloue et initialise un objet de la classe "Voiture" * On parle d'"instanciation" de la classe * Objet appelé "instance" de la classe Cycle de vie d'un objet (3/4) * Suppression d'un objet en deux temps * "Terminaison" de l'état de l'objet * Des actions peuvent être nécessaires quand un objet est détruit * Libération de la mémoire occupée * Manière de libérer la mémoire dépendante du langage * C++ * Variables: automatique (à la fin de la portée) * Pointeurs: à la charge du développeur * Java / C# * Gérée automatiquement par un "ramasse-miettes" Cycle de vie d'un objet (4/4) * Suppression = "destruction" * Destruction d'un objet de classe X ==> Exécution d'une méthode spécifique de X * Cette méthode est appelée "destructeur" * Elle ne peut pas avoir d'argument * C++: porte le nom de la classe précédé de "~" * Peu utilisée quand il y a un ramasse-miettes (Java / C#) * Car difficile de prédire quand l'appel va se produire * Destruction et libération souvent liées * Mot-clé utilisé par C++: delete Mot-clé "this" * Exécuter une méthode = appliquer une action sur un objet * Exemple: clio.accélérer() * Ne peut s'exécuter que si un objet est fourni * Exemple: classe "Personne" + méthode "danser" * Une deuxième personne en argument: danser(p:Personne) * Code de la méthode * afficher(this.getNom() + " danse avec " + p.getNom()); * Deux objets "Personne" sont manipulés * p = objet passé en argument * this = objet sur lequel l'action est appliquée (C++ / Java / C#) * p1.danser(p2) ==> "p1 danse avec p2" Membres de classe (1/2) * Membres propres à chaque objet = membres "d'instance" * Définition vue jusqu'à présent * Chaque objet possède ses propres attributs * Une méthode s'applique sur un objet donné * Membres communs aux objets d'une classe = membres "de classe" * Une méthode peut s'exécuter sans fournir d'objet * Equivalent d'une fonction * Tous les objets d'une classe peuvent partager un attribut * Exemple: nombre d'objets existants de cette classe * Fournir la classe au lieu d'un objet pour accéder au membre * Java / C#: Voiture.getNbVoiture() * C++: Voiture::getNbVoiture() * Syntaxe pour la déclaration d'un membre de classe * UML: soulignée * Programmation: souvent précédée de "static" (C++ / Java / C#) Membres de classe (2/2) |