Vous êtes sur la page 1sur 11

1/ INTRODUCTION

En terme de programmation, il y a eu plusieurs volutions successives. Une des principales, fut la programmation structure, dont le principe premier tait de diviser un programme en sous-programmes, afin de pouvoir en grer la complexit. Ce type de programmation tient avant tout compte des traitements et peut tre rsum par la question "Que doit faire le programme ?". Les langages orients objets sont une nouvelle mthode de programmation qui tend se rapprocher de notre manire naturelle d'apprhender le monde. Les L.O.O. se sont surtout pos la question "Sur quoi porte le programme ?". En effet, un programme informatique comporte toujours des traitements, mais aussi et surtout des donnes. Si la programmation structure s'intresse aux traitements puis aux donnes, la conception objet s'intresse d'abord aux donnes, auxquelles elle associe ensuite les traitements. L'exprience a montr que les donnes sont ce qu'il y a de plus stable dans la vie d'un programme, il est donc intressant d'architecturer le programme autour de ces donnes.

2/ PRINCIPE DES MODELES A OBJETS


Les modles objets ont ts cres pour modliser le monde rel. Dans un modle objet, toute entit du monde rel est un objet, et rciproquement, tout objet reprsente une entit du monde rel. Un objet est un groupe de donnes structures caractris par un identifiant unique reprsentant le monde rel. Un objet est constitu dattributs qui caractrisent la structure de celui-ci. Exemple : Rfrence, Dsignation, PrixUnitaire et Quantit sont les attributs de l'objet de type ARTICLE. L'objet est manipul par des procdures appeles mthodes qui sont caractrises par une entte dfinissant leur nom, les paramtres d'appel et de retour pour chacune d'elle. Exemple : Nous pouvons dfinir comme mthodes de l'objet ARTICLE PrixTtc : Mthode permettant de calculer le prix TTC d'un article SortieArticle : Mthode permettant de diminuer la quantit en stock EntreeArticle : Mthode permettant d'augmenter la quantit en stock

On ne peut excuter une mthode sans prciser l'objet sur lequel elle s'applique. L'ensemble des proprits d'un objet (attributs et mthodes) constitue un ensemble appel classe.

3/ L'ENCAPSULATION
La fusion d'un bloc de code et d'un bloc de donnes est un concept nouveau, celui d'encapsulation. L'encapsulation est base sur la notion de services rendus. Une classe fournit un certain nombre de services et les utilisateurs de cette classe n'ont pas connatre la faon dont ces services sont rendus. Il faut donc distinguer dans la description de la classe deux parties : La partie publique, accessible par les autres classes,

La partie prive, accessible uniquement par les mthodes de la classe. Il est vivement recommand de mettre les attributs d'une classe dans la partie prive, ainsi protgs, les membres privs d'une classe ne sont pas directement modifiables. Exemple : Pour la classe ARTICLE Rfrence, Dsignation, PrixUnitaire et Quantit sont les membres privs, PrixTtc, EntreeArticles, SortieArticles reprsentent les membres publics, la modification de la variable quantit sera effectue par l'intermdiaire des deux dernires mthodes. Classe Article Dclaration de la classe ARTICLE ARTICLE=classe Priv : Rfrence : Entier Dsignation : Chane(30) PrixUnitaire : rel Quantit : Entier Public : Procdure Init(Rf : Entier ; Dsig : Chane(30) ; PrixUnit : Rel) Fonction PrixTtc(TauxTva : rel) : Rel Procdure EntreeArticles(QteEntree : Entier) Procdure SortieArticles(QteSortie : Entier) Procdure AfficheArticle() Fclasse Dfinition des mthodes Procdure ARTICLE.Init(Rf : Entier ; Dsig : Chane(30) ; PrixUnit : Rel) Dbut Rfrence := Rf Dsignation := Dsign PrixUnitaire := PrixUnit Quantit := 0 FinProc Fonction ARTICLE.PrixTtc(TauxTva : rel) : rel Dbut Retourne(PrixUnitaire + PrixUnitaire*TauxTva) FinFonc Procdure ARTICLE.EntreeArticles(QteEntree : Entier) Dbut Quantit := Quantit + QteEntree FinProc Procdure ARTICLE.SortieArticles(QteSortie : Entier) Dbut Quantit := Quantit - QteSortie FinProc Procdure ARTICLE.AfficheArticle() Dbut AFFICHER(Rfrence, Dsignation, PrixUnitaire, Quantit) FinProc Appel des mthodes : Programme exemple Var Imp1, Imp2 : pointeur ARTICLE Debut Imp1 = nouveau(ARTICLE) /* instanciation d'un objet Imp1 de type ARTICLE */

Imp2 = nouveau(ARTICLE) Imp1.Init(1,"HP Deskjet 690C+", 1824.21) Imp2.Init(2,"CANON BJC-4300", 1326.69) Imp1.EntreeArticles(5) Imp1.SortieArticles(1) Imp1.AfficherArticle() Imp2.EntreeArticle(7) Imp2.AfficherArticle() AFFICHER(IMP1.PrixTtc(0.206)) Fin

4/ CONSTRUCTEURS ET DESTRUCTEURS
Lors de la dclaration d'une instance de classe, une mthode est appele automatiquement. Cette mthode qui permet d'initialiser les objets de la classe dont elle dpend est appele constructeur. Elle est appele aprs l'allocation d'espace mmoire destin l'objet. Inversement, dans la plupart des langages une mthode est excute automatiquement quand l'instance devient hors de porte. Cette mthode qui est appele avant la libration de l'espace mmoire associ l'objet est appele destructeur. L'instanciation d'une classe correspond la cration d'une instance de cette classe, c'est-dire d'un objet. Il existe deux manires d'instancier une classe : Cration d'un objet statique et instanciation lors de la dclaration var a1 : article Dclaration d'un pointeur d'objet, puis instanciation pa : pointeur d'article // dclaration d'un pointeur, pas d'instanciation ... pa:=nouveau(article) // allocation dynamique d'un article, instanciation ... dtruire(pa) // libration de la mmoire alloue Pour nos exemples (voir classe Article), nous utiliserons la deuxime faon qui est plus proche d'un certain nombre de langages (Voir exemples en Visual Basic et Java)

5/ HERITAGE
A partir dun exemple, nous allons expliquer la notion dhritage. Enonc : Une socit possde un fichier PERSONNEL compos des rubriques N Nom Prnom Adresse Ville Fonction Salaire Les employs dont la fonction est REPRESENTANT ont un mode de calcul du salaire qui diffre des autres salaris. Leur salaire est dtermin en additionnant leur salaire fixe, une commission et des frais de remboursement. La commission est calcule en fonction de leur chiffre daffaires selon le barme suivant : Si CA < 100 000 Frs alors commission = CA * 0.02 sinon si CA < 200 000 alors commission = 2 000 + (CA 100 000)*0.04 sinon commission = 6 000 + (CA 200 000)*0.06 fsi fsi

Les frais sont rembourss en fonction dun plafond qui est fix pour chaque reprsentant. N 1 2 3 4 5 PLAFOND FRAIS 1 000 Frs 1 500 Frs 2 000 Frs 2 500 Frs 3 000 Frs

Les frais rembourss sont calculs selon la mthode suivante : Si Frais > Plafond alors FraisRembours s= Plafond Sinon FraisRembours s = Frais Fsi

Problme : Crer une classe SALARIE qui permettra Dafficher les coordonnes dun salari Daugmenter le salaire fixe dun salari en fonction dun pourcentage De modifier les coordonnes dun salari De cumuler au CA dun REPRESENTANT le montant dune nouvelle vente De cumuler les frais d'un REPRESENTANT De remettre zro les cumuls frais et ca d'un REPRESENTANT Dafficher le salaire de chaque salari sous la forme suivante : Si le salari est un REPRESENTANT laffichage du Sinon laffichage du salaire se fera salaire se fera sous la forme suivante : sous la forme suivante : N : 1 N : 9 Nom du salari : RIGOU Nom du salari : ENKLER Adresse : 3, Rue Dinard Adresse : 78, Rue du stade Ville : 60300 SENLIS Ville : 60400 NOYON Fonction : REPRESENTANT Fonction : MAGASINIER SALAIRE FIXE : 7 500 Salaire payer : 8 690 Frs COMMISSION : 5 440 CA : 186 000 REMBOURSEMENT DES NOTES DE FRAIS : 750 TOTAL A PAYER : 13 690 Rsolution : Attributs : Num, Nom, Prenom, Adresse, Ville, Fonction, Salaire : sont des attributs qui conviennent quel que soit le type de fonction quexerce lemploy. Ca, frais et PlafondFrais ne concernent que les employs ayant pour fonction REPRESENTANT . Mthodes : Quatre mthodes peuvent tre dfinies concernant tous les types demploys. AfficherCoordonnees( ) AugmenterSalaire(rel tauxPourcentage) ModifierNom(chaine NouvNom) ModifierAdresse(chaine NouvRue, chaine NouvVille)
Une autre mthode concerne tous les employs mais diffre selon que lemploy est un REPRESENTANT ou non.

AfficherSalaire( ) Enfin, trois mthodes ne concernent que les employs dont la fonction est REPRESENTANT . CumulCa(entier MontantVente) CumulFrais(entier Depense) RemisecumulZero() Solutions : 1/ Une premire solution consiste associer dune part les 9 attributs tous les salaris, quelle que soit leur fonction, en mettant 0 les attributs Ca, Frais et PlafondFrais dans le cas o le salari na pas la fonction de REPRESENTANT , et dautre part, tester la fonction du salari dans les mthodes CumulCa, CumulFrais, RemiseCumulsZero et AfficherSalaire. 2/ Une autre solution est de dfinir une classe SALARIE ayant comme attributs et comme mthodes ce qui peut convenir tous les types demploys et une autre classe REPRESENTANT avec ses spcificits. La classe REPRESENTANT a des attributs et des mthodes identiques la classe SALARIE, il est donc intressant de ne pas redfinir et rcrire toute cette partie commune. Le mcanisme permettant de rcuprer ces informations est lHERITAGE. En appliquant le mcanisme de lhritage notre problme, la classe REPRESENTANT hrite des attributs et des mthodes de la classe SALARIE, et doit juste dclarer les attributs supplmentaires (Ca, Frais et PlafondFrais) et ses propres mthodes (CumulCa, CumulFrais, RemiseCumulsZero et AfficherSalaire). La mthode AfficherSalaire doit exister dans les deux classes, elle sera juste redfinie dans la classe REPRESENTANT. Rcapitulatif : CONCEPTS DE LHERITAGE : Lhritage permet de crer de nouvelles classes partir de classes existantes. Les classes drives obtenues sont des classes filles , classes drives ou sous classes . Les classes dorigine sont dites des super classes , classes de base ou classes parentes . Les sous classes peuvent hriter des attributs de la super classe dont elles sont issues. Les sous classes peuvent avoir des attributs et des mthodes qui leur sont propres. Certaines mthodes dune super classe peuvent tre redfinies dans les sous classes issues de celle-ci. NOTATION : ClasseDeBase = CLASSE Priv: // membres privs ne sont accessibles que par les membres de la classe Public : // membres publics sont accessibles par tous les membres de lapplication qui utilisent la classe Fclasse ClasseDerivee = CLASSE hrite de ClasseDeBase Priv : // dclaration des attribut spcifique la nouvelle classe Public :

// dclaration des mthodes nouvelles et redfinies de la nouvelle classe Fclasse

6/ POLYMORPHISME
Plusieurs classes peuvent possder donc une mthode de mme nom. Suivant la nature de l'objet auquel elle doit s'appliquer, on appliquera telle ou telle mthode. Le polymorphisme : cela consiste appeler la bonne mthode d'aprs le type de l'objet implment. Dans notre exemple de la classe SALARIE, une mthode Afficher_salaire t dfinie. Nous avons vu que la classe REPRESENTANT qui hrite de la classe SALARIE possde aussi une mthode Afficher_Salaire, qui est une redfinie par rapport la classe mre. Si dans un algorithme, vous crivez : Var : PERSONNE1 = pointeur de SALARIE PERSONNE2 = pointeur de REPRESENTANT ... PERSONNE1.Afficher_Salaire() // La mthode utilise sera celle dfinie pour la // classe SALARIE PERSONNE2.Afficher_Salaire() // La mthode utilise sera celle dfinie pour la // classe REPRESENTANT Classe Representant : Reprenons notre exemple avec les classes SALARIE et REPRESENTANT. La classe REPRESENTANT va hriter des attributs et des mthodes de la classe SALARIE. Elle va dclarer comme attributs supplmentaires Ca et PlafondFrais qui sont spcifiques aux reprsentants. Elle va aussi dclarer comme nouvelle mthode Cumul_Ca et redfinir Afficher_salaire pour laquelle le calcul est diffrent de celui effectu dans la classe de base. Nous pouvons rajouter une mthode Init qui affectera chacun des attributs une valeur qui sera saisie. Cette mthode sera rdfinie dans la classe REPRESENTANT car deux attributs supplmentaires devront recevoir aussi une valeur. Nous obtenons donc : SALARIE = CLASSE Priv : num : entier nom : chaine(20) prenom : chaine(20) adresse: chaine(30) ville: chaine(20) fonction : chaine(20) salaire : rel Public : Procdure Init(nu entier, no chaine(20), pr chaine(20), ad chaine(30), ville chaine(20), fo chaine(20),sa rel ) ; Procdure AfficherCoordonnees( ) ; Procdure AugmenterSalaire(TauxPourcentage : rel) ; Procdure ModifierNom(NouvNom chaine(20)) ; Procdure ModifierAdresse(NouvRue chaine(30), NouvVille chaine(20)) ; Procdure AfficherSalaire( ) ; Fclasse REPRESENTANT = CLASSE hrite de SALARIE Priv : Ca : entier; PlafondFrais : entier; Frais : entier

public : Procdure Init(nu entier, no chaine(20), pr chaine(20), ad chaine(30), ville chaine(20), fo chaine(20), sa rel, pf entier ) ; Procdure AfficherSalaire( ) ; Procdure CumulCa(MontantVente : entier) ; Procdure CumulFrais(Depense : entier); Procdure RemiseCumulsZero(); Fclasse

7/ QUELQUES EXEMPLES
Classes simples Article Compte bancaire Classe CompteBancaire Exercice Ecrivez l'algorithme dcrivant une classe COMPTE comprenant les attributs suivants : NumroCpte : Entier NomTitulaire : Chaine(30) Solde : rel Dfinissez les mthodes de cette classe sachant que l'on veut pouvoir dbiter, crditer le compte et afficher le solde de chaque compte cr. Correction de l'exercice Dclaration de la classe compte=classe priv : // cette partie sera inaccessible en dehors de la classe numro : entier nom : chaine(30) solde : rel public : // cette partie sera accessible et constitue l'interface de la classe procdure init(pnum:entier ; pnom:chaine(30)) procdure crditer(montant : rel) procdure dbiter(montant : rel) fonction solde() : rel Fclasse Description des mthodes procdure compte.init(pnum:entier ; pnom:chaine(30) ) dbut numro:=pnum nom:=pnom Solde:=0 Fin procdure compte.crditer(montant : rel) dbut solde:=solde+montant fin procdure compte.dbiter(montant : rel) dbut

solde:=solde - montant fin fonction compte.solde() : rel dbut retourner(solde) fin ProgrammeExemple var c1 : pointeur de compte // dclaration d'un pointeur, pas d'instanciation Dbut c1=nouveau(compte) // instanciation d'un compte c1.init(1,"Dupont") c1.crditer(1000) c1.dbiter(500) afficher(c1.solde()) // affiche 500 dtruire(pc) // libration de la mmoire alloue Fin. Parking Classe Parking Exercice On se propose de simuler la gestion des places d'un parking. Dans ce parking, les entres de vhicules sont contrles automatiquement en fonction des places disponibles, les sorties de vhicules restituant automatiquement des places. Dfinir un objet parking, ses attributs et ses mthodes permettant la gestion des entres et des sorties de vhicules. Dans un premier temps, nous ne grerons que les entres et les sorties de voitures du parking. Correction : Parking=classe Priv: PlacesLibres : Entier PlacesOccupes : Entier Public: Procdure Init(NbPlaces : entier) Procdure EntreeVoiture() Procdure SortieVoiture() Procdure AffPlacesLibres() Fclasse Procdure Init(NbPlaces : entier) Dbut PlacesLibres := NbPlaces PlacesOccupes := 0 FinProc Procdure EntreeVoiture() Dbut Si PlacesLibres >0 ALORS PlacesLibres := PlacesLibres - 1 PlacesOccupees := PlacesOccupees + 1 Fsi FinProc Procdure SortieVoiture() Dbut PlacesLibres := PlacesLibres + 1 PlacesOccupees := PlacesOccupees - 1 FinProc Procdure AffPlacesLibres() Dbut AFFICHER("Places libres : ", PlacesLibres) FinProc

Classes et hritage Representant (

8/ Programmation d'objets partir de Visual Basic Version 5 :


Cration d'une classe : Pour crer une classe dans un projet, il faut insrer un module de classe : Commande Insertion/Module de classe et le rserver entirement la dfinition de cette classe. Ce module est enregistr dans un fichier CLS, et sa proprit Name fournit le nom de la classe. Les proprits y sont ensuite dclares comme des variables globales, et sont prcdes par le prfixe : Public : pour les membres publics Private : pour les membres privs Les mthodes y sont codes comme des procdures (Sub) ou des fonctions (Function), et sont prcdes par le prfixe : Public : pour les mthodes publiques Private : pour les mthodes prives Le constructeur de classe est une procdure (Sub) dont le nom est Class_Initialize(). Le destructeur de la classe est une procdure (Sub) dont le nom est Class_Terminate(). Exemple de la classe Service : Programmation d'une classe service permettant de grer les ressources d'un service, par exemple le nombre de licences d'un logiciel de type client serveur : Nous allons crer dans un module Visual basic la classe suivante : service=classe Priv : NbRessourcesLibres : Entier NbRessourcesOccupes : Entier Public : Procdure service(NbRessources : entier) Procdure PriseRessource() Procdure RendreRessource() Procdure RessourcesLibres() : entier Fclasse 'Dclaration des donnes membres prives de la classe d'objet Private NbRessourcesLibres As Integer Private NbRessourcesPrises As Integer 'Dclaration des mthodes Public Sub Class_Initialize() NbRessourcesLibres = 0 NbRessourcesPrises = 0 End Sub Public Sub Init(NbRessources As Integer) NbRessoucesLibres = NbRessources End Sub

Public Sub PriseRessources() If NbRessourcesLibres > 0 then NbRessourcesLibres = NbRessourcesLibres - 1 NbRessourcesPrises = NbRessourcesPrises + 1 Else MsgBox "Plus de ressources",48,"Accs service refus" End If End sub Public Sub RendreRessources() If NbRessourcesPrises > 0 then NbRessourcesLibres = NbRessourcesLibres + 1 NbRessourcesPrises = NbRessourcesPrises - 1 Else MsgBox "Plus de ressources rendre",48,"Toutes les ressources sont disponibles" End If End sub Public Function NbRessources() As Integer NbRessources = NbRessourcesLibres End function Utilisation de la classe dans un autre module : La cration de la classe se fait en deux temps : 'Dclaration d'une variable objet pour contenir l'objet Dim ServiceSQL As Service 'Cration de l'objet et excution automatique du constructeur Set ServiceSQL = New Service L'utilisation de l'objet se fait de la mme faon que pour les objets standards : ServiceSQL.Init(30) ServiceSQL.PriseRessource() ServiceSQL.RendreRessource() Exemple de la classe service avec gestion de file d'attente Classe FileAtt Modifier la classe Service vue prcdemment, en lui ajoutant les attributs et les mthodes ncessaires la gestion d'une file d'attente partir d'un tableau permettant de conserver jusqu' 30 demandeurs de ressource en attente. Principe de fonctionnement des demandes de ressources : Lorsqu'un utilisateur demande un service, deux cas sont envisager : Une ressource est disponible, l'utilisateur peut prendre la ressource Aucune ressource n'est disponible, l'utilisateur peut prendre place dans la file d'attente (si le tableau n'est pas plein) ou refuser d'attendre. Lorsqu'un utilisateur fait le choix de prendre place dans la file d'attente : Il est plac au premier emplacement libre du tableau Lorsqu'un utilisateur rend la ressource, deux cas sont envisager : Personne n'attend dans la file d'attente, la ressource est restitue Au moins un utilisateur est plac dans la file d'attente, la ressource rendue doit lui tre attribue Principe de fonctionnement de la file d'attente: Cette file sera gre selon le principe FIFO (First In First Out). Le tableau reprsentant la file doit conserver un identifiant du demandeur de ressources. Nous considrerons ici que le demandeur est un utilisateur du rseau. Un pointeur (indice du tableau) doit conserver la position du premier emplacement libre. L'utilisateur prioritaire pour la prise de ressource sera plac l'indice 1 du tableau. Lorsqu'un utilisateur sort de la file, chaque utilisateur suivant est dplac vers la case prsdente dans le tableau.

Description de la classe FILEATT sous Visual Basic 5.0 : 'Priv : Private NbRessourcesLibres As Integer Private NbRessourcesPrises As Integer Private Demandeurs(30) As String Private PtLibre As Integer 'Public : Public Sub Class Initialise() NbRessourcesLibres = 0 NbRessourcesPrises = 0 PtLibre = 1 End Sub Public Sub Init(NbRessources As Integer) NbRessourcesLibres = NbRessources End Sub Public Function Libre() As Integer Libre = NbRessourcesLibres End Function Public Sub RemplirTab(Nom As String) NbRessourcesLibres = NbRessourcesLibres - 1 NbRessourcesPrises = NbRessourcesPrises + 1 Demandeurs(PtLibre) = Nom PtLibre = PtLibre + 1 End Sub Public Sub RetraitTab() NbRessourcesLibres = NbRessourcesLibres + 1 NbRessourcesPrises = NbRessourcesprise - 1 For i = 1 To PtLibre - 1 Demandeurs(i) = Demandeurs(i + 1 ) Next i Demandeurs(PtLibre - 1 ) = "" PtLibre = PtLibre - 1 End Sub Public Function Dernier() As Integer Dernier = PtLibre - 1 End Function Public Function Nom(i As Integer) As String Nom = Demandeurs(i) End Function Public Function Prises() As Integer Prises = NbRessourcesPrises End Function