La programmation objet                                             

Accueil Sommaire Le cours WEB Outils les examens bts Cycle d'apprentissage


Remonter Exercices Aller plus loin


 

cours récupéré sur le site   www.univ-tours.fr/discala/

LE LANGAGE OBJET 

La programmation classique ou procédurale telle que le débutant peut la connaître à travers des langages de programmation comme Pascal, C etc... traite les programmes comme un ensemble de données sur lesquelles agissent des procédures. Les procédures sont les éléments actifs et importants, les données devenant des éléments passifs qui traversent l’arborescence de programmation procédurale en tant que flot d’information. 

Cette manière de concevoir les programmes reste proche des machines de Von Neuman et consiste en dernier ressort à traiter indépendamment les données et les algorithmes (traduits par des procédures) sans tenir compte des relations qui les lient. 

En introduisant la notion de modularité dans la programmation structurée descendante, l’approche diffère légèrement de l’approche habituelle de la programmation algorithmique classique. Nous avons défini des machines abstraites qui ont une autonomie relative et qui possèdent leurs propres structures de données; la conception d’un programme relevait dès lors essentiellement de la description des interactions que ces machines ont entre elles.

La programmation orientée objet relève d'une conception ascendante définie comme des "messages" échangés par des entité de base appelées objets. 

comparaison des deux topologies de programmation
 


 
 Les langages objets sont fondés sur la connaissance d’une seule catégorie d’entité informatique : l’objet. Dans un objet, traditionnellement ce sont les données qui deviennent prépondérantes. On se pose d’abord la question : "de quoi parle-t-on ?" et non pas la question "que veut-on faire ?", comme en programmation algorithmique. C’est en ce sens que les machines abstraites de la programmation structurée modulaire peuvent être considérées comme des pré-objets. En fait la notion de TAD est utilisée dans cet ouvrage comme spécification d’un objet, en ce sens nous nous préoccupons essentiellement des services offerts par un objet indépendamment de sa structure interne. 

Programmation structurée :

 

1 : Concepts fondamentaux de La P.O.O

Nous écrirons P.O.O pour : programmation orientée objet.

Voici trois concepts qui donnent toute sa puissance à la P.O.O.
 

·         Concept de modélisation à travers la notion de classe et d’instantiation de ces classes.

·         Concept d’action à travers la notion d’envoi de messages et de méthodes à l’intérieur des objets.

·         Concept de construction par réutilisation et amélioration par l’utilisation de la notion d’héritage.   

1.1 : les objets 

Définition

Un module représente un objet ou une classe d’objet de l’espace du problème et non une étape principale du processus total, comme en programmation descendante.

Recenser les objets du monde réel
Lors de l’analyse du problème, faire l’état de l’existant en recensant les objets du monde réel. On établit des classes d’objets et pour chaque objet on inventorie les connaissances que l’on a sur lui :

    • Les connaissances déclaratives,

    • les connaissances fonctionnelles,

    • l’objet réel et les connaissances que l’on a sur lui sont regroupés dans une même entité.

On décrit les systèmes en classes d’objets plutôt qu’en terme de fonction.

Exemple :

Une application de gestion bancaire est organisée sur les objets comptes, écritures, états.


Les objets rassemblent une partie de la connaissance totale portant sur le problème. Cette connaissance est répartie sur tous les objets sous forme déclarative ou procédurale.  

Les objets sont décrits selon le modèle des structures abstraites de données (TAD) : ils constituent des boîtes noires dissimulant leur implantation avec une interface publique pour les autres objets. Les interactions s’établissant à travers cette interface.

Un objet : 

Encapsulation

 
c’est le fait de réunir à l'intérieur d'une même entité (objet) le code (méthodes) + données (champs). Il est donc possible de masquer les informations d'un objet aux autres objets.

2 niveaux d’encapsulation :

Privé

les champs et les méthodes masqués sont dans la partie privée de l’objet.

Public

les champs et les méthodes visibles sont dans la partie interface de l’objet.

1.2  : les classes

Postulons une analogie entre les objets matériels de la vie courante et les objets informatiques. Un objet de tous les jours est souvent obtenu à partir d’un moule industriel servant de modèle pour en fabriquer des milliers. Il en est de même pour les objets informatiques.

Définition

Une classe est une sorte de moule ou de matrice à partir duquel sont engendrés les objets réels qui s’appellent des instances de la classe considérée.

Remarque

En POO, programmer revient donc à décrire des classes d’objets, à caractériser leur structure et leur comportement, puis à instancier ces classes pour créer des objets réels. Un objet réel est matérialisé dans l’ordinateur par une zone de mémoire que les données et son code occupent. 

Une classe est composée : 

  • D’attributs (ou champs, ou variables d’instances).
    Les attributs de la classe décrivent la structure de ses instances (les objets).

  • De méthodes (ou opérations de la classe).
    Les méthodes décrivent les opérations qui sont applicables aux instances de la classe

Un exemple : les étudiants

Supposons que chaque étudiant soit caractérisé par sa note en mathématiques (NoteMath) et sa note en informatique (NoteInfo). Un étudiant doit pouvoir effectuer éventuellement des opérations de calcul de ses moyennes dans ces deux matières (MoyMath, MoyInfo)et connaître sa moyenne générale calculée à partir de ces deux notes (MoyTotale). 

 

La classe Etudiant a été créée. Elle ne possède que les attributs NoteMath et NoteInfo. Les méthodes de cette classe sont par exemple MoyMath, MoyInfo, MoyTotale.

Nous avons créé deux objets étudiants (deux instances : Julien et Claudie) de la classe Etudiant.

 

1.3  : L’héritage

Dans un LOO (langage orienté objet), il existe une particularité dans la façon d’organiser ses classes : l’héritage de propriétés. L’objectif est de construire de nouvelles classes en réutilisant des attributs et des méthodes de classes déjà existantes.
C’est un mécanisme très puissant qui permet de décrire des structures génériques en transmettant depuis l’intérieur d’une même classe toutes les propriétés communes à toutes les " sous-classes " de cette classe. Par construction toutes les sous-classes d’une même classe possèdent toutes les attributs et les méthodes de leur classe parent. 

Les attributs et les méthodes peuvent être modifiés au niveau de la sous-classe. 

Il peut y avoir des attributs et/ou des méthodes supplémentaires dans une sous-classe.

Propriétés générales et pratiques de l'héritage :   
Une classe A qui hérite d’une classe B dispose implicitement de tous les attributs et de toutes les méthodes définis dans B. 

Les attributs et les méthodes définis dans A sont prioritaires par rapport aux attributs et aux méthodes de même nom définis dans B.

Exemple :

La classe " Etudiant premier cycle" héritant de la classe Etudiant 

Tout se passe comme si toute la classe Etudiant était recopiée dans la sous-classe Etudiant premier cycle (même si l’implémentation n’est pas faite ainsi). La nouvelle classe dispose d’un attribut supplémentaire (Mention) et d’une méthode supplémentaire (EvaluerMention).


 

2 :  Introduction à la conception orientée objet

 
L’attitude est ici résolument sous tendue par un double souci : fournir des outils méthodologiques rationalisant l’effort de production du logiciel, sans que leur lourdeur rebute l’étudiant non professionnel et masque ainsi l’intérêt de leur utilisation. L’expérience d’enseignement de l’auteur avec des débutants a montré que si les étudiants sont appelés à développer sans outils méthodiques, ils pratiquent ce qu’appelle J.Arsac " la grande bidouille ". Mais dans le cas contraire, l’apprentissage de trop de méthodes rigides biena qu'efficaces (OOD, OMT, UML,...)finit par ennuyer l’étudiant ou du moins par endormir son sens de l’intérêt. Dans ce dernier cas l’on retrouve " la grande bidouille " comme étape finale. Le chemin est donc étroit et il appartient à chaque enseignant de doser en fonction de l’auditoire l’utile et le superflu. 

Nous utilisons ici un de ces dosages pour montrer à l’étudiant comment écrire des programmes avec des objets sans être un grand spécialiste. Une aide irremplaçable à cet égard nous sera fournie par l’environnement de développement visuel Delphi.

2.1  : La méthode de conception OOD simplifiée

La méthode O.O.D (object oriented design) de G.Booch propose 5 étapes dans l’établissement d’une conception orientée objet. Ces étapes n’ont pas obligatoirement à être enchaînées dans l’ordre dans lequel nous les citons dans le paragraphe suivant. C’est cette souplesse qui nous a fait choisir la démarche de G.Booch, car cette méthode est fondamentalement incrémentale et n’impose pas un cadre trop précis et trop rigide dans son application. Cette démarche se révèle être utile pour un débutant et lui permettra de fabriquer en particulier des prototypes avec efficacité sans trop surcharger sa mémoire. 

Identifier les objets et leurs attributs : 

On cherchera à identifier les objets du monde réel que l’on voudra réaliser.

Conseil : Il faut identifier les propriétés caractéristiques de l’objet (par l’expérience, l’intuition,...).On pourra s’aider d’une description textuelle (en langage naturel) du problème. La lecture de cette prose aidera à déduire les bons candidats pour les noms à utiliser dans cette description ainsi que les propriétés des adjectifs et des autres qualifiants.

Identifier les opérations :

On cherchera ensuite à identifier les actions que l’objet subit de la part de son environnement et qu’il provoque sur son environnement.

Conseil : Les verbes utilisés dans la description informelle (textuelle) fournissent de bons indices pour l’identification des opérations. Si nécessaire, c’est à cette étape que l’on pourra définir les conditions d’ordonnancement temporel des opérations (les événements ayant lieu). 
 Etablir la visibilité :

L’objet étant maintenant identifié par ses caractéristiques et ses opérations, on définira ses relations avec les autres objets.

Conseil : On établira quels objets le voient et quels objets sont vus par lui (les spécialistes disent alors qu’on insère l’objet dans la topologie du projet). Il faudra prendre bien soin de définir ce qui est visible ou non, quitte à y revenir plus tard si un choix s’est révélé ne pas être judicieux.

Etablir l’interface : 

Dès que la visibilité est acquise, on définit l’interface précise de l’objet avec le monde extérieur.

Conseil : Cette interface définit exactement quelles fonctionnalités sont accessibles et sous quelles formes. Cette étape doit pouvoir être décrite sous notation formelle; les TAD sont l’outil que nous utiliserons à cette étape de conception. 

Implémenter les objets : 

La dernière étape consiste à implanter les objets en écrivant le code.

Conseil : Cette étape peut donner lieu à la création de nouvelles classes correspondant par exemple à des nécessités d’implantation. Le code en général correspond aux spécifications concrètes effectuées avec les TAD, ou à la traduction des algorithmes développés par la méthode structurée. Lors de cette étape, on identifiera éventuellement de nouveaux objets de plus bas niveau d’abstraction qui ne pouvaient pas être analysés en première lecture(ceci provoquant l’itération de la méthode à ces niveaux plus bas). 

Nous n’opposons pas cette méthode de conception à la méthode structurée par machines abstraites. Nous la considérons plutôt comme complémentaire (en appliquant à des débutants une idée contenue dans la méthode HOOD). La méthode structurée sert à faire élaborer par l’étudiant des algorithmes classiques comme des actions sur des données. La COO permet de définir le monde de l’environnement de façon modulaire. Nous réutiliserons les algorithmes construits dans des objets afin de montrer la complémentarité des deux visions.

Une méthode porteuse d’avenir a vu le jour récemment il s’agit d’UML, méthode unifiant en particulier, la méthode OOD et la méthode OMT utilisée par et pour des professionnels. Il sera intéressant lorsqu'elle sera stabilisée et éventuellement adoptée par tous, d’essayer d’en tirer sa " substantifique moelle " afin de la mettre à la portée des débutants en programmation. 

2.2  : Attitudes et outils méthodologiques

Afin d’utiliser une méthodologie pratique et rationnelle, nous énumérons au lecteur les outils que nous utiliserons selon les besoins, dans le processus d’écriture d’un logiciel.


les outils


 En tout premier la notion de module :

C’est la décomposition d’un logiciel en sous-ensembles que l’on peut changer comme des pièces d’un patchwork.

La notion de cycle de vie du logiciel :

Développer un logiciel ce n’est pas seulement écrire du Pascal, de l’Ada etc...

Utiliser des TAD :

Un type abstrait de données correspond très exactement à l’interface d’un module. Il renforce la méthodologie modulaire.

La programmation structurée par machines abstraites :

On se sert d’une méthode de conception descendante et modulaire des algorithmes utiles pour certaines actions dans le logiciel.

La conception et la programmation orientées objet :

On utilise une version simplifiée de la COO de G.Booch pour définir les classes et leur relations en attendant une simplification pédagogique d’UML.


 

Les autres outils 

La programmation événementielle :

Analyser les événements auxquels réagit l’objet. Construire un graphe de conception d’événements permettant le suivi du logiciel.

Utiliser un RAD visuel/événementiel :

La perception abstraite de la notion d’objet est concrétisée dans ce type d’outil par des classes visuelles qui permettent de bien comprendre ce que signifie la notion de " logiciels en kit ". En outre, la partie communication homme-machine se trouve grandement facilitée par ce genre d’outil (étape d’ergonomie déjà indiquée en algorithmique).

Utiliser la programmation exploratoire :

Attitude qui consiste à écrire des prototypes afin de tester des choix de spécification ou de conception (le RAD visuel est l’outil adéquat dans ce cas pour nous).

Utiliser la programmation défensive :

Attitude qui consiste à rajouter à chaque module lorsque cela est nécessaire, du code de vérification de l’adéquation des données aux spécifications (étape de sécurisation déjà indiquée en algorithmique).