I. Programmation Orientée Objet▲
De manière superficielle, le terme « orienté objet » signifie que l'on organise le logiciel comme une collection d'objets dissociés comprenant à la fois une structure de données (attributs) et un comportement (méthodes) dans une même entité (encapsulation). Exemple : une voiture peut avoir une certaine couleur et en même temps possède un comportement qui sera le même pour toutes les autres voitures, comme accélérer. Ce concept est différent de la programmation conventionnelle dans laquelle les structures de données et le comportement ne sont que faiblement associés.
I-A. Encapsulation▲
L'encapsulation est le principe qui permet de regrouper les attributs et méthodes au sein d'une classe. Cette notion est aussi associée au système de protection qui permet de contrôler la visibilité d'une variable ou d'une méthode. En d'autres termes, cela signifie que chaque fois que vous définissez un membre d'une classe (attribut ou méthode), vous devez indiquer les droits d'accès quant à l'utilisation de ce membre.
I-B. Les objets▲
Chaque objet a une identité et peut être distingué des autres. Deux pommes ayant les mêmes couleurs, forme et texture demeurent des pommes individuelles, une personne peut manger l'une, puis l'autre. De la même façon, des jumeaux identiques sont deux personnes distinctes, même si elles se ressemblent. Le terme identité signifie que les objets peuvent être distingués grâce à leur existence inhérente et non grâce à la description des propriétés qu'ils peuvent avoir. Nous utiliserons l'expression instance d'objet pour faire référence à une chose précise, et l'expression classe d'objets pour désigner un groupe de choses similaires. En d'autres termes, deux objets sont distincts même si tous leurs attributs (nom, taille et couleur par exemple) ont des valeurs identiques (deux pommes vertes sont deux objets distincts).
I-C. Les classes▲
La classification signifie que les objets ayant la même structure de données (attributs) et le même comportement (méthodes) sont regroupés en une classe. Les objets d'une classe ont donc le même type de comportement et les mêmes attributs. En groupant les objets en classe, on abstrait un problème. Les définitions communes (telles que le nom de la classe et les noms d'attributs) sont stockées une fois par classe plutôt qu'une fois par instance. Les méthodes peuvent être écrites une fois par classe, de telle façon que tous les objets de la classe bénéficient de la réutilisation du code. Par exemple, toutes les ellipses partagent les procédures de dessin, de calcul d'aire ou de test d'intersection avec une ligne.
I-D. Les attributs▲
Un attribut est une valeur de donnée détenue par les objets de la classe. Couleur et Poids sont des attributs des objets relatifs à Voiture. Chaque attribut à une valeur pour chaque instance d'objet. Par exemple, l'attribut Couleur porte la valeur rouge dans l'objet Mercedes alors que pour l'objet Clio la valeur de l'attribut Couleur est verte. Les instances peuvent avoir des valeurs identiques ou différentes pour un attribut donné. Chaque nom d'attribut est unique à l'intérieur d'une classe. Ainsi, la classe Voiture et la classe Pomme peuvent avoir chacune un attribut Couleur.
I-E. Les méthodes▲
Une méthode est une fonction ou une transformation qui peut être appliquée aux objets ou par les objets dans une classe. Accélérer et freiner sont des méthodes de la classe Voiture. Tous les objets d'une même classe partagent les mêmes méthodes. Chaque méthode a un objet cible comme argument implicite (c'est l'objet lui-même this, elle peut donc accéder à chacun des attributs). La même opération peut s'appliquer à de nombreuses classes différentes. On dit qu'elle est polymorphe, c'est-à-dire qu'elle prend différentes formes dans des classes différentes. Une méthode peut avoir des arguments, en plus de son objet cible.
II. Fini pour la théorie voyons cela avec un exemple fait avec WinDev▲
Nous allons créer un nouveau projet (Fichier->Nouveau Projet), je vous laisse faire en respectant les consignes suivantes :
- Nom du projet : TpObjet1 ;
- Pas d'analyse.
Créez une nouvelle fenêtre que vous nommerez « Départ » et qui sera la première fenêtre du projet.
Voici la fenêtre une fois ajoutés tous les éléments nécessaires à ce support :
Le but de cette fenêtre est de faire afficher un cercle dans la zone image avec les coordonnées que nous lui passerons :
Nom : c'est le nom que nous donnerons à notre objet cercle ;
Position X : abscisse du coin haut gauche du rectangle dans lequel le cercle est inscrit. Ces coordonnées sont exprimées en pixels ;
Position y : ordonnée du coin haut gauche du rectangle dans lequel le cercle est inscrit. Ces coordonnées sont exprimées en pixels ;
Position x1 : abscisse du coin bas droit du rectangle dans lequel le cercle est inscrit. Ces coordonnées sont exprimées en pixels ;
Position y1 : ordonnée du coin bas droit du rectangle dans lequel le cercle est inscrit. Ces coordonnées sont exprimées en pixels ;
Le bouton Action : il contiendra le code nécessaire au tracé du cercle
Détails :
Champ de saisie ( Nom : Nom )
Champs de saisie numérique.
Libellé de la première Position x : Nom= lposx.
Le second : nom=Lposy.
Le troisième : nom=Lposx1
Le quatrième : Nom=Lposy1
Bouton de nom quelconque.Champ image (nom : Zonedessin).
Voilà, maintenant que le décor est planté passons à l'action !
Il nous faut créer une classe nommée cercle qui aura quatre membres : les coordonnées et une méthode dessiner.
|
Clic Droit->Nouvelle classe. Nommez là cercle. |
Voilà le résultat :
L'éditeur de code pour la classe cercle devrait ressembler à cela :
C'est ici que nous allons définir notre classe. |
|
Exécuté une seule fois en tout à la fin de l'application. Le code de terminaison sert surtout à la libération des objets globaux (donc commun à toutes les instances). |
|
La méthode Constructeur associée à une classe est automatiquement appelée lors de la déclaration d'un objet de la classe. Cela permet de s'assurer que les traitements d'initialisation de l'objet (affectation des membres, par exemple) ne seront pas oubliés par le développeur. |
|
La méthode Destructeur associée à une classe est automatiquement appelée lors de la suppression de l'objet (sortie de procédure dans laquelle l'objet a été déclaré). Cela permet de libérer sans risque d'oubli les ressources utilisées par l'objet. |
Nous allons commencer à coder les membres (où attributs de la classe) :
Comme vous le voyez Cercle est une classe ayant cinq attributs privés (par analogie vous pouvez imaginer cinq variables) elles sont privées c'est-à-dire qu'elles sont inaccessibles de l'extérieur de la classe (c'est le principe de l'encapsulation).
- Privé : accès autorisé depuis un code de la classe.
- Protégé : accès autorisé depuis un code de la classe ou un code d'une classe dérivée.
- Public (par défaut) : accès autorisé depuis n'importe quel code de la classe ou du projet.
Modifions le constructeur :
Le rôle du constructeur est d'initialiser le futur objet avec ou sans paramètre.
Ici cinq paramètres sont passés (c'est les quatre coordonnées que l'on fera saisir à l'utilisateur ainsi que le nom donné à notre cercle).
Nous avons donc x1,y1,x2,y2 et nom. Ces variables vont être affectées à des variables de classe privées (posx1,posy1.). Comme ces variables sont privés, il faut les préfixer avec le caractère « : ».
Créons la méthode de dessin :
Faites un clic droit sur Cercle et validez Nouvelle méthode. Nommez-la Dessine.
Vous devriez, maintenant avoir ceci :
Info : vous pouvez voir ici tous les membres et méthodes définis pour notre classe. Pour la symbolique des icônes, je vous laisse consulter l'aide rubrique POO.
Voici le code de la méthode Dessine :
Explication du code :
// pour pouvoir dessiner on initialise la zone image
dDébutDessin
(
depart.
Zonedessin)
// La procédure dCercle crée le cercle de coordonnées et couleurs définies
dCercle
(:
posx1,:
posy1,
:
posx2,
:
posy2,
iRougeClair
,
iVertClair
)
//La fonction dTexte dessine un texte à une position donnée relative à la zone image
dTexte
(:
posx2,
:
posy2,
:
lenom,
iJauneFoncé
)
Voilà notre classe est finie. Vous savez que WinDev vous permet de la visualiser au format UML ? On va voir ? Aller c'est parti. Cliquez sur Atelier->Modélisation UML->Rétro-ingénierie du projet. Suivez l'assistant et vous verrez le diagramme de classe correspondant à votre classe.
Vous retrouverez ce diagramme dans l'onglet analyse Uml du volet de droite.
La modification (ou l'ajout) d'un membre dans le diagramme sera répercutée immédiatement dans le code et réciproquement, essayez voir !
Il nous faut maintenant créer une instance de cette classe pour la mettre en œuvre. C'est le code du bouton Action qui va réaliser tout ça.
Étudions ce code.
La première ligne instancie un objet moncercle de type Cercle en passant au constructeur les cinq paramètres.
Ensuite, nous exécutons la méthode « dessine » de l'objet.
Passons à la pratique :
Renseignez les champs, cliquez sur le bouton et oh..!!!
Trêve de plaisanterie, vous avez tout compris ? Comme vous le voyez, ce n'est pas très compliqué de créer et manipuler une classe avec WinDev. Pour le prochain cours nous allons monter d'une gamme dans la théorie objet, donc refaites ce cours si tout n'est pas clair et au plaisir de vous revoir !