Forums Développement Multimédia

Aller au contenu

- - - - -

Concepts de la Programmation Orientée Objet (POO)

TUTO

4 réponses à ce sujet

#1 LAlex

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 5026 messages

Posté 26 August 2003 - 17:05 PM

Auteur : LAlex
URL : http://flash.media-box.net/ - http://www.lalex.com/blog/
Date de création : 31/07/2003
Version : Flash 5 / MX

Présentation

icon_arrow.gif De plus en plus dans le cadre de la programmation en Flash, on entend parler de POO, soit la Programmation Orientée Objet. Pour beaucoup de débutants ou de non programmeurs, ce terme est assez abstrait. Ce tutoriel se propose de vous décrire le pourquoi de la programmation objet, ainsi que ses bases et règles qui lui sont propres.
icon_arrow.gif Ce tutoriel comporte uniquement les bases théoriques de la POO, et ne contient pas de code. Des mises en pratiques seront faites dans d'autres tutoriaux, afin de clarifier chaque aspect distinct de la POO.




1. Principe de la POO

icon_arrow.gif Le but de la programmation Objet est de se rapprocher le plus possible d'une représentation de la réalité en programmation, en considérant que tout objet peut être classé dans une catégorie qui a ses caractéristiques et ses possibilités propres. En effet, tout objet qui nous entoure peut être "classé" dans une categorie qui fait elle-même partie d'autres catégories.

Dans l'exemple précédent, votre mobile fait partie de la catégorie "Téléphone portable", qui elle-même fait partie de la catégorie "Téléphone", faisant partie de la catégorie "Outil de communication téléphonique", faisant partie de la catégorie "Outils de communication", etc.... Tandis qu'un fax est "Outil de communication téléphonique", mais pas un "Téléphone" et encore moins un "Téléphone portable".




2. Vocabulaire

Classe : On appellera "classe" ce qui est nommé plus haut comme étant une "catégorie". Une classe est en fait la description des possibilités offertes par un objet qui va appartenir à cette catégorie. Dans l'exemple précédent, on pourra considérer qu'il existe une classe "Mobile".

Instance : On appellera "instance" tout objet créé à partir d'une "classe". Par exemple, mon téléphone portable est une instance de la classe "Mobile". Un objet est toujours l'instance d'une classe.

Attribut : On appellera "attribut" toute valeur qui s'attache à décrire l'objet. Par exemple, si mon téléphone est bleu, on peut considéré que son attribut 'couleur' a pour valeur 'bleu'.

Méthode : On appellera "méthode" toute série d'instructions qui permettent d'agir sur l'objet, ou de faire agir l'objet lui même. Par exemple, on peut considérer que pour allumer mon téléphone, je fais appel à la méthode 'allumerTelephone'.

Propriété : D'un point de vue purement sémantique, les propriétés d'un objet sont l'ensemble de ses attributs et méthodes. Un abus de langage quasi-systématique consiste à appeler "propriétés" uniquements les attributs de l'objet. Pour plus de simplicité, nous utiliserons cet abus de langage dans le reste du tutoriel.icon_redface.gif

Interface : Une interface est un peu comme une classe, sauf que l'on ne peut pas créer d'objet à partir d'une interface, et qu'elle ne contient pas de code "à executer". Elle sera utilisée comme base pour créer des classes. Elle s'attache à décrire quelles vont être les actions qu'une classe va effectuer, et l'on devra écrire le code qui va permettre d'effectuer ces actions dans la classe. Créer une classe à partir d'un interface est aussi appelé "implémenter une interface".




3. Notions de bases


L'encapsulation
icon_arrow.gif L'encapsulation correspond à appliquer le principe de la "boîte noire" aux objets que l'on crée. Cela consiste à demander à un objet d'effectuer une action, sans se préoccuper de comment il l'effectue. Elle permet également de faire des contrôles de sécurité, et de ne pas effectuer les actions demandées si une condition particulière n'est pas respectée. Par exemple, pour allumer notre téléphone portable, on se contente d'appuyer sur la touche [Power] : peu nous importe ensuite de savoir quelle est la procédure interne suivie par le téléphone pour s'allumer... on désire juste savoir quand le téléphone est prêt à être utilisé.

icon_arrow.gif Pour une action à effectuer, il va falloir déterminer quels vont être les paramètres en entrée, quels vont être les paramètres en sortie, et quels vont être les actions effectuées sur l'objet lui-même, pour ensuite les mettre à disposition de l'utilisateur. Pour notre méthode 'allumerTelephone' :

[*]les actions que l'objet effectue sur lui-même sont


Le polymorphisme

De manière générale, il existe trois types de polymorphisme :[list]'). Sur mon téléphone portable (dans la plupart des portables d'ailleurs), si je tape un numéro de téléphone complet, et que j'appelle la méthode 'appelerDestinataire', il va composer le numéro. Si par contre, je rentre '1#' puis que j'appuie sur 'appelerDestinataire', il va chercher le premier numéro dans mon répertoire, puis le composer. Donc, la réaction de la méthode 'appeler' est différente (bien que similaire) selon le paramètre qui lui est donné.

icon_idea.gif Le polymorphisme de "surcharge" (ou "ad hoc" ou "overloading" en anglais) : cela consiste à avoir la même méthode avec la même signature pour des objets de type analogue, voire complétement différents. Si mon téléphone est de marque 'X', il possède une méthode 'appelerDestinataire' et un micro pour parler. Un interphone d'immeuble possède aussi la méthode 'appelerDestinataire' et un micro. Je ne me préoccupe donc pas du type d'objet dont je me sers, il me suffit d'utiliser la méthode 'appelerDestinataire' et d'utiliser le micro pour parler.

icon_idea.gif Le polymorphisme "d'héritage" (ou "overriding" en anglais). Ce polymorphisme est issu (comme son nom l'indique wink.gif) de l'héritage. Cela consiste à faire hériter plusieurs classes d'une même classe 'mère', et de redéfinir une méthode pour chaque classe. Par exemple, les téléphones de différentes marques n'ont pas la même structure interne. Un téléphone de la marque 'X' va par exemple afficher un petit logo quand on utilise 'appelerDestinataire', tandis qu'un autre va allumer l'écran. Chaque contructeur a donc créé sa propre classe "MobileX" ou "MobileY" héritée de la classe "Mobile", puis réécris par dessus la méthode 'appelerDestinataire' pour y integrer ses propres spécificités.
NB : La notion d'héritage est abordée plus loin dans ce tutoriel.




4. Les relations entre objets

L'héritage

icon_arrow.gif L'héritage est une relation entre objets de type "est un". Elle représente le fait, pour une classe, d'être une sous-partie d'une autre classe. C'est le même principe que notre exemple : le téléphone portable "est un" téléphone, et le téléphone "est un" outil de communication téléphonique.

icon_arrow.gif Une "sous-classe" (également appelée "classe fille") hérite des possibilités et des propriétés de sa "super-classe" (également appelée "classe mère"). Il peut arriver que la "classe fille" puisse effectuer des actions supplémentaires ou comporter des propriétés supplémentaires. Il peut également arriver que pour effectuer une même action que sa "classe mère", une "classe fille" ait besoin d'exécuter des instructions supplémentaires. On va alors redéfinir une méthode de cette classe qui va executer ses instructions propres, plsu éventuellement les instructions de la "classe mère". Par exemple, la classe "Mobile" hérite de la classe "Telephone", et récupère donc les porpriétés 'touche0', 'touche1', 'touche2', etc... mais possède également en plus une touche 'on/off'.

icon_arrow.gif Dans d'autres langages, il existe la possibilité de faire de l'héritage multiple, mais pas dans Flash (du moins jusqu'à la version MX). Cela consiste tout simplement à hériter de plusieurs classes : une orange "est un" fruit, mais une orange "est une" sphère aussi. Elle a donc les propriétés d'un fruit (couleur, prix au kilo ...) et celles d'un sphère (rayon). L'héritage multiple suscite un débat important dans la communauté des développeurs. Un language comme C++ permet de créer des classes à partir de plusieurs classes (comme décrit ci-dessus), mais les classes de nouveaux langages comme JAVA ou C# permettent uniquement de faire de l'héritage multiple à partir de plusieurs interfaces, mais ne peuvent hériter que d'une seule classe, cela évitant des conflits de "code" entre deux méthodes ayant le même nom.


La délégation

icon_arrow.gif La délégation est une relation de type "a un" entre deux objets. Elle intervient lorsque deux objets collaborent entre eux. Ce type de relation se décompose en trois parties :

L'association : elle consiste à une simple relation de collaboration entre deux objets. Chaque objet existe de manière totalement indépendante, et n'a pas forcément besoin de l'autre pour "vivre". La relation entre un téléphone portable et son kit main-libre est une relation d'association.

L'agrégation : elle se distingue de l'association par le fait qu'un objet est une partie de l'autre. Ainsi, un bouton sur un téléphone portable a une relation d'agrégation avec le téléphone. Si une certaine touche n'est pas présente, le téléphone peut néanmoins fonctionner, en paliant ce manque par des combinaisons d'autres touches.

La composition : elle est une sous-partie de la relation d'agrégation. Elle représente une relation étroite entre les deux objets : l'objet "père" ne peut fonctionner sans l'objet "fils". L'objet "batterie" ou "micro" d'un téléphone portable ont une relation de composition avec le téléphone, car le téléphone ne peut pas fonctionner sans.
NB : Dans le doute du type de relation à utiliser, il vaut mieux utiliser l'association




5. Petite mise en pratique

icon_exclaim.gif Nous allons ici essayer de mettre en pratique ces quelques notions par un exemple simple, qui diffère de notre téléphone portable qui n'a plus beaucoup de batteries tellement nous l'avons utilisé. icon_biggrin.gif Nous utiliserons un "pseudo-langage" à priori possible à comprendre par le plus grand nombre dont voici les quelques conventions :

icon_idea.gif le terme "classe" signifie que l'on crée une classe. 'classe MaClasse { ... }' signifie "je crée une classe nommée MaClasse dont les instructions sont entre les accolades".

icon_idea.gif Pour dire qu'un objet est d'une certaine classe, nous noterons 'monObjet : MaClasse', ce qui voudra dire "monObjet est une instance de MaClasse"

icon_idea.gif Les méthodes sont declarées sous la forme 'monObjet.maMethode( parametre1, parametre2)', ce qui veut dire "je crée la méthode maMethode de l'objet monObjet qui va prendre les paramètres parametre1 et parametre2". Des parenthèses vides signifient que la méthode ne prend aucun paramètre.

icon_idea.gif L'affectation d'une valeur à une propriété se fait sous la forme 'maPropriete = maValeur'. Cela se traduit par "Je donne à maPropriete la valeur maValeur".

icon_idea.gif L'appel à une méthode se fait sous la forme 'monObjet.maMethode(param1, param2)', ce qui se traduit par "J'appelle la méthode maMethode de monObjet avec les paramètres param1 et param2".

icon_idea.gif Les lignes commencant par '//' sont des lignes de commentaires, et n'interviennent pas dans l'exécution du code.
icon_arrow.gif Le but est de créer un ensemble de classes destinées à décrire une voiture de marque 'MediaBox'.

icon_idea.gif Tout d'abord, commençons par créer une classe 'Vehicule'. Nous allons considérer qu'un véhicule comporte un moteur et des roues toutes identiques. Dans la classe véhicule, nous allons créer une propriété 'modeleDeRoue', qui constituera le modèle des roues du véhicule. En effet, considérant que toutes les roues sont identiques, il ne sert à rien de créer plusieurs roues qui seront exactement les mêmes ... smile.gif
Vous me direz : "Pourquoi pas un volant ?". Tout simplement parce que le volant est quelque chose de spécifique aux voitures, camions etc... Alors qu'une moto est un véhicule, mais n'a pas de volant. Nous pourrions considérer qu'un bateau est un véhicule, mais par soucis de simplification, nous allons ne pas en tenir compte ... wink.gif
En fait, la question à se poser lors de la création d'une classe est : "Toutes les instances de cette classe ont-elles cette propriété ?", ou "Toutes les instances de cette classe peuvent-elles effectuer cette action ?".
Voici donc une classe 'Vehicule' :


ActionScript
classe Vehicule {
// Proprietes
moteurDuVehicule : Moteur
modeleDeRoue : Roue
// Methodes
allumerMoteur ( clef )
eteindreMoteur ( )
}


icon_idea.gif Nous allons ensuite créer une classe 'Voiture', qui "est un" véhicule. Elle va donc hériter de la classe 'Vehicule'. En plus des possibilités d'un véhicule, la voiture possède un volant et un nombre de roues défini. Nous allons donc rajouter ce volant à la classe Voiture . Ce volant offrant la possibilité de tourner, nous allons donc créer une méthode 'tourner' qui va prendre en paramètre la direction dans laquelle on veut tourner.

ActionScript
classe Voiture herite de Vehicule {
// Proprietes
volant : Volant
nombreDeRoues : Nombre
//Initialisation des proprietes
nombreDeRoues = 4
// Methodes
tourner( direction )
}


Vous remarquerez sûrement que l'on ne déclare pas de roue ni de moteur à cette voiture. Elle n'en a pas besoin, car héritant de la classe 'Vehicule', elle hérite automatiquement des ses propriétés et méthodes. Donc, sur une instance de la classe 'Voiture', nous allons pouvoir appeler les méthodes 'allumerMoteur' et 'eteindreMoteur'...


icon_idea.gif Voila enfin le moment de créer notre classe proprement dite : la Voiture MediaBox !!! 8)
L'équipe de MediaBox n'étant pas avare de ses efforts, elle vous offre en exclusivité la possibilité de voler !!! (qui a dit Taxi 2 ?!? ....... J'ai les noms, je vous préviens !!!:twisted:).
Il va donc falloir lui rajouter des ailes, et lui permettre de plier/déplier les ailes, et de décoller (pour l'atterrissage, vous vous débrouillerez) :

ActionScript
classe VoitureMediaBox herite de Voiture {
// Proprietes
ailesDeLaVoiture : Aile
// Methodes
deplierLesAiles ()
plierLesAiles ()
decoller ()
}



Vous noterez ici un des avantages énormes de la POO, c'est que la méthode 'plierLesAiles' peut vérifier si l'on est en vol ou pas avant de les replier effectivement. Si c'est le cas, elle ne repliera pas les ailes et pourra retourner une notification sur le fait qu'elle ne l'ait pas fait, voire donner la raison pour laquelle elle ne l'a pas fait. A l'utilisation d'une VoitureMediaBox, vous ne vous poserez pas ce genre de question, étant donné que l'objet le gère tout seul !
De la même manière que pour la classe 'Voiture', nous n'avons pas à nous soucier des méthodes et propriétés qui ne font pas partie des spécificités de notre 'VoitureMediaBox'.


icon_idea.gif Voici maintenant le moment d'acheter une voiture MediaBox. Pour cela, nous allons créer une instance de la classe 'VoitureMediaBox', puis l'utiliser pour faire un petit tour du monde :


ActionScript
// Mon objet 'maVoitureMB' devient une instance de 'VoitureMediaBox'
maVoitureMB : VoitureMediaBox
// Je demarre ma voiture, je déplie les ailes et je la fais décoller
maVoitureMB.demarrerMoteur( "123456")
maVoitureMB.deplierLesAiles()
maVoitureMB.decoller()





6. Conclusion

icon_exclaim.gif Vous aurez certainement compris pourquoi la programmation Orientée Objet est utilisée maintenant par la quasi-totalité des langages actuels. Elle offre une souplesse et surtout une possibilité de réutilisation très importante. Elle permet de n'écrire qu'une seule fois le même code, et de réutiliser facilement son propre code ou un code provenant d'un autre programmeur. C'est donc un choix évident pour les équipes de développement qui travaillent ensemble. De par sa forte relation avec la représentation de la réalité, la POO est aussi plus naturelle à l'utilisation.

icon_arrow.gif Il ne reste donc plus qu'à lui trouver des inconvénients, mais je n'en vois qu'un : les codes en POO sont plus lents, car les instructions unitaires sont appelées après un passage par de multiples couches, qui prennent évidemment plus de temps qu'un appel direct à l'instruction.

icon_arrow.gif Lors du travail en équipe sur une même application, il faut faire une confiance aveugle à la personne qui a développé les classes que vous utilisez !!! En effet, si une erreur s'est glissée dans l'une de ces classes, elle peut arriver à un dysfonctionnement complet de l'application. En Flash, les accès à la mémoire de l'ordinateur étant correctement protégés, les gênes provoquées sont relativement minimes ...

icon_arrow.gif Un autre "inconvénient" qui n'en est pas un, est que développer en POO nécessite une phase d'analyse bien plus importante, car si elle est bâclée, elle peut nécessiter une réécriture de tout votre code en plein milieu du développement, ou pénaliser les développeurs qui vont utiliser vos classes.

#2 artkabis

    Ceinture Orange

  • Members
  • PipPipPip
  • 49 messages

Posté 10 November 2009 - 01:40 AM

Merci pour ce tuto, les explications sont claires et ceci facilite grandement la compréhension.

PS: je vais envoyer tous les membres de mon forum qui souhaiteraient mieux comprendre les bases de ce fameux concept (POO).

#3 Rouaki

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 19 January 2010 - 21:40 PM

merci

#4 bastoun42

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 20 April 2013 - 12:43 PM

vive mediabox!!!!!
un ENORME merci

#5 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 28 April 2013 - 19:49 PM

S'inscrire pour dire merci, ça c'est sympa !
Bienvenue ici.
Ne rate pas les autres tutoriels sur la POO: http://forums.mediab...ation/poo_bases
Celui-ci est particulièrement détaillé, pour ceux qui sont habitués à coder dans Flash sans utiliser la POO: http://forums.mediab...ases/classesqqc



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP