QU'EST-CE QUE LE CONCEPT ORIENTÉ-OBJETS ?


Par Terry Montlick, traduit de l'anglais par Charles Gigučre.

Le coeur du concept - La «boîte noire»

Le concept orienté-objets est tout ce qui concerne les objets. Un objet est une «boîte noire» qui reçoit et transmet des messages. La boîte noire renferme du code (séquences d'instructions pour l'ordinateur) et des données (les informations sur lesquelles les instructions opèrent). Traditionnellement, le code et les données ont toujours été tenus à l'écart. Par exemple, dans le langage C, les unités de code sont appelées des fonctions, alors que les unités de données sont appelées des structures. Les fonctions et les structures ne sont pas directement liées en C. Une fonction C peut opérer sur plus d'une structure et plusieurs fonctions peuvent opérer sur la même structure.

Ce n'est pas le cas dans le concept orienté-objets! Dans la programmation OO (orientée-objets), le code et les données sont fusionnés dans un seul et même espace indivisible -- l'objet. Cela confère de gros avantages comme vous le verrez dans quelques instants. Mais en premier lieu, voici l'explication de la métaphore «boîte noire» utilisée pour désigner un objet. Une règle fondamentale dans la programmation orientée-objets : en tant qu'utilisateur d'un objet, vous ne devriez jamais avoir besoin de voir l'intérieur de la boîte!

Pourquoi ne devriez-vous pas avoir besoin de voir ce qu'il y a à l'intérieur d'un objet ? Parce que toutes les communications sont effectuées via des messages. L'objet qui reçoit un message est appelé le récepteur du message. Les messages définissent l'interface de l'objet. Tout ce qu'un objet peut faire est décrit par son interface de messages. Alors vous ne devriez pas avoir besoin de connaître ce qu'il y a à l'intérieur de la boîte noire pour l'utiliser.

Et ne pas pouvoir regarder à l'intérieur de la boîte noire d'un objet ne vous soumet pas à la tentation de vouloir le modifier. Si vous le faisiez, vous devriez mettre le nez dans les détails de fonctionnement de l'objet. Que faire si la personne qui a programmé l'objet décide plus tard de modifier ces détails ? Alors vous seriez dans de beaux draps. Votre logiciel ne marcherait plus correctement! Mais aussi longtemps que vous travaillez avec les objets en tant que boîtes noires via des messages, c'est garanti que le logiciel fonctionnera. L'accès à un objet uniquement par ses messages, tout en conservant les détails privés est appelé la dissimulation des informations. Le terme technique équivalent est encapsulation.

Pourquoi tant de soucis concernant la modification des logiciels ? Parce que l'expérience nous a appris que les logiciels changent. Un adage populaire dit «les logiciels ne sont pas écris, ils sont réécris». Et certaines des erreurs les plus coûteuses dans l'histoire de l'informatique proviennent de logiciels qui se sont brisés suite à des tentatives de modifications par une autre personne.

 

Les Classes

Comment les objets sont-ils définis ? Un objet est défini via sa classe, qui détermine tout à propos de l'objet. Les objets sont des instances individuelles d'une classe. Par exemple, vous pourriez créer un objet appelé Spot de la classe Chien. La classe Chien définie ce qu'est être un objet de type Chien, et tous les messages sur lesquels un objet de type Chien peut interagir. Tous les langages orientés-objets ont une quelconque méthode, habituellement appelé usine, pour «fabriquer» des instances d'objets à partir d'une classe.

Vous pouvez fabriquer plus d'un objet de cette classe et les appeler Spot, Fido, Toutou, etc. La classe de type Chien définie les messages que les objets de type Chien peuvent comprendre, tels que «Jappe», «Va chercher» et «Roule sur toi-même».

Le terme méthode est également utilisé. Une méthode est simplement l'action effectuée suite à la réception d'un message. C'est le code qui est exécuté lorsqu'un message est envoyé à un objet en particulier.

Souvent des paramètres sont fournis avec les messages. Par exemple, le message «va chercher» devrait contenir un paramètre qui indique quoi allez chercher, par exemple «le bâton». Ou le message «Roule sur toi-même» pourrait contenir un paramètre indiquant la vitesse et un second paramètre indiquant combien de fois.

 

Quelques exemples concrets

Si vous vouliez additionner deux nombres, disons 1 et 2, en utilisant un langage qui n'est pas orienté-objets comme le C (ne vous inquiétez pas -- vous n'avez pas à connaître le langage C pour comprendre ces exemples), vous pourriez écrire ceci:

 

a = 1;
b = 2;
c = a + b;
 

Cela veut dire,

«Prendre a, qui possède la valeur 1, et b, qui possède la valeur 2, additionne-les ensemble en utilisant les fonctionnalités d'addition intégrées au langage C. Prendre le résultat 3 et le placer dans la variable appelée c

Maintenant, voici la même chose en Smalltalk, qui est un langage orienté-objets pur:

 

a := 1.
b := 2.
c := a + b.
 

Un instant. À part les quelques différences de notation, ça a l'air tout à fait identique! OK, c'est pareil, mais la signification est complètement différente.

En Smalltalk, cela veut dire,

«Prend l'objet a, qui possède la valeur 1, et envoie-lui le message «+», avec le paramètre b ci-inclus qui possède la valeur 2. L'objet a reçoit le message et effectue l'action requise, soit d'additionner la valeur du paramètre à l'objet lui-même. Créer un nouvel objet, donne-lui le résultat 3, et assigne cet objet à la variable c

Hm. Ça semble être une manière beaucoup plus compliquée pour accomplir la même chose! Alors pourquoi s'en préoccuper ?

La raison c'est que les objets simplifient considérablement les choses lorsque les données deviennent plus complexes. Supposons que vous désirez un type de données appelé liste, renfermant une liste de noms. En C, la liste serait définie avec une structure.

 

struct list {
<définition de la structure de liste ici>
};
 
list a, b, c;
 
a = "John Jones";
b = "Suzy Smith";
 

Essayons d'ajouter ces nouvelles variables a et b avec le langage C:

 

c = a + b;
 

Devinez quoi? Ça ne marche pas. Le compilateur C génère une erreur lorsqu'il essaie de compiler cette ligne parce qu'il ne sait pas quoi faire avec a et b. Les compilateurs C ne savent qu'ajouter des nombres ensembles, point final. a et b ne sont pas des nombres. On peut faire la même chose avec Smalltalk, mais cette fois, les listes sont bâties à partir d'une classe, qui est une sous-classe de la classe «String» intégrée dans Smalltalk:

 

a := List fromString: 'John Jones'.
b := List fromString: 'Suzy Smith'.
c := a + b.

 

Les deux premières lignes ne font que créer les objets a et b à partir des chaînes de caractères fournies. Maintenant ça fonctionne, parce que la liste a été créée à partir d'une classe qui possède une méthode spécifique qui «sait» comment réagir au message «+». Par exemple, cette méthode pourrait simplement concaténer les paramètres de son propre objet ensemble séparés par des virgules (cela se fait avec une seule ligne de Smalltalk). Alors c aura la nouvelle valeur:

'John Jones, Suzy Smith'

 

L'utilisation des langages non orientés-objets

Il est possible également d'utiliser des objets et messages dans les vieux langages de programmation non orientés-objets. Cela se fait par des appels de fonctions, qui ont l'air normales, mais qui cachent une mécanique permettant l'orienté-objets. Cela permet, entre autres, aux logiciels sophistiqués client-serveur de fonctionner de manière «transparente» à l'intérieur de langages de programmation ordinaires.

Supposons que vous ayez ajouté une fonction d'addition «plus» à un programme C:

 

int plus(int arg1, int arg2)
{return (arg1 + arg2);}

 

Ça ne vous sert pas à grand chose encore. Mais supposons qu'au lieu d'effectuer l'addition sur votre propre ordinateur, vous l'expédiez automatiquement à un ordinateur serveur pour qu'il l'effectue:

 

int plus(int arg1, intarg2)
{return server_plus(arg1 + arg2);}

 

À son tour la fonction server_plus() créé un message renfermant les paramètres arg1 et arg2 et expédie ce message, via un réseau, à un objet spécial situé dans l'ordinateur serveur. Cet objet effectue la fonction «plus» et vous retourne le résultat. C'est une autre manière de faire de l'informatique orientée-objets!

Cet exemple n'est pas très imaginatif et, bien sûr, c'est beaucoup plus simple d'additionner les nombres directement. Cependant, il n'y a pas de limites à la complexité d'un objet. Un seul objet peut contenir des bases de données complètes renfermant des millions de données, en fait, de tels objets sont habituels dans les logiciels client-serveur.

Cela permet également d'illustrer la flexibilité de l'approche orientée-objets. Dans l'exemple que nous venons de décrire, l'objet est très différent de l'exemple «a+b» décrit un peu plus tôt. Ici, il reçoit deux paramètres, soient les deux objets qu'il doit additionner. Dans l'exemple Smalltalk précédent, l'objet recevant le message était le premier objet, a. Dans un environnement client-serveur, l'addition n'est pas effectuée localement, sur la machine faisant office de client, mais à distance, sur la machine faisant office de serveur. Le serveur renferme l'objet récepteur du message, et puisqu'il ne connaît rien du premier paramètre, vous devez lui envoyer les deux paramètres.

 

Héritage

S'il existe déjà une classe qui peut répondre à un tas de messages différents, que faire si vous désirez créer une classe semblable qui répondrait à quelques messages supplémentaires différents ? Pourquoi devoir réécrire la classe entièrement ? Bien sûr, dans tout bon langage de programmation orienté-objets, vous n'avez pas à le faire. Tout ce dont vous avez à faire est de créer une sous-classe (ou une classe dérivée dans la terminologie C++) de la classe originale. Cette nouvelle classe hérite de tous les messages existants, et du même coup, de tout le comportement de la classe originale. La classe originale est appelée la classe parente, ou super classe, de la nouvelle classe. Encore un peu de jargon -- une sous-classe est une spécialisation de sa super classe, et inversement la super classe est une généralisation de sa sous-classe.

L'héritage favorise également la réutilisation. Vous n'avez pas à repartir à zéro lorsque vous voulez écrire un nouveau programme. Vous n'avez qu'à réutiliser un répertoire de classes déjà existant dont les classes ont des comportements semblables au nouveau programme que vous désirez écrire.

Par exemple, après avoir créé la classe Chien, vous pourriez créer une sous-classe appelée Loup, qui définie des messages spécifiques à cette sous-classe, telle que chasse. Ou encore, il vaudrait mieux définir une classe commune appelée Canin duquel Chien et Loup seraient tous deux des sous-classes.

Une bonne part de l'art de la programmation orientée-objets est de déterminer la meilleure manière de répartir un programme en un ensemble de sous-classes. En plus d'accélérer le temps de développement, une bonne construction de classes et sa réutilisation diminuent le nombre de lignes de code, ce qui se traduit par moins de bogues et des coûts de maintenance plus bas.

 

Les langages orientés-objets

Il existe environ deux douzaines de langages de programmation orientés-objets majeurs en utilisation de nos jours. Mais les langages OO commerciaux dominants sont peu nombreux. Ce sont:

 

 

C++

C++ est une version orientée-objets du langage C. Il est compatible avec le C (il englobe le C entièrement), ce qui permet d'incorporer du code C existant dans des programmes C++. Les programmes C++ sont rapides et efficaces, des qualités qui ont permis au C de devenir un langage extrêmement populaire. Cependant, on doit sacrifier de la flexibilité de manière à demeurer efficace. Le C++ utilise le compile-time binding, ce qui signifie que le programmeur doit spécifier la classe spécifique d'un objet, ou au moins, la classe la plus générale auquel appartient l'objet au moment de la compilation. Cela permet un temps d'exécution efficace et une taille de code plus petite, mais il y a un compromis dans la puissance de réutilisation des classes.

C++ est devenu si populaire que la majorité des nouveaux compilateurs C sont en réalité des compilateurs C/C++. Cependant, pour tirer vraiment avantage de la programmation orientée-objets, on doit programmer (et penser!) en C++, et non en C. Cela peut devenir un problème important pour les programmeurs expérimentés en C. Plusieurs programmeurs croient qu'ils font du C++, mais n'utilisent qu'une petite partie de la puissance du langage orienté-objets.

 

Smalltalk

Smalltalk est un langage orienté-objets pur. Alors que le C++ fait des compromis pratiques pour assurer une exécution rapide et une taille de code plus petite, Smalltalk n'en fait aucun. Il utilise le run-time binding, ce qui signifie que rien à propos des caractéristiques des objets n'a besoin d'être connues au moment de la compilation.

Les programmes Smalltalk sont reconnus par plusieurs comme étant plus rapides à développer que les programmes écrits en C++. Une riche librairie de classes qui peuvent être facilement réutilisées par héritage en est la principale raison. L'environnement de développement dynamique de Smalltalk est une autre raison. Il n'y a pas de compilation explicite, comme en C++. Cela rend le processus de développement plus fluide, ainsi différents scénarios peuvent être essayés facilement, et les définitions de classes peuvent être facilement raffinées. Mais être purement orienté-objets oblige les programmeurs à mettre autre chose que leurs orteils dans le monde du OO, comme cela peut se faire en C++. Pour cette raison, Smalltalk prend généralement plus de temps à maîtriser que le C++. Mais ce temps est passé à apprendre les techniques et méthodologies orientées-objets plutôt que les détails d'un langage de programmation particulier. En fait, Smalltalk est syntaxiquement très simple, beaucoup plus que le C ou C++.

Contrairement au C++ qui est standardisé, le langage Smalltalk diffère d'une implémentation à l'autre. Les «dialectes» commerciaux les plus populaires de Smalltalk sont:

 

 

VisualWorks

VisualWorks est sans contredit le plus puissant Smalltalk. VisualWorks a été conçu par ParcPlace, qui a ses racines dans le projet original de Xerox PARC, l'inventeur du langage Smalltalk. VisualWorks est indépendant de toute plate-forme, ainsi une application écrite sous un système d'exploitation, par exemple, Microsoft Windows, peut rouler sans modification sous plusieurs autres systèmes d'exploitation supportés par ParcPlace, du Solaris de Sun au Macintosh. VisualWorks présente également un bâtisseur d'interfaces-utilisateurs graphiques (GUI) bien intégré au produit.

 

Smalltalk/V et Visual Smalltalk

Ces versions Smalltalk de Digitalk sont plus petites et plus simples, et sont spécifiquement destinées au ordinateurs IBM et compatibles. Une version Macintosh était disponible, mais son support a été abandonné. Ce n'est pas de bon augure pour les efforts de portabilité de Digitalk. Digitalk a un constructeur de GUI disponible séparément, appelé PARTS Workbench (vendu avec Visual Smalltalk), ce qui permet la construction rapide d'applications.

ParcPlace et Digitalk ont fusionné en une seule compagnie, ParcPlace-Digitalk, Inc. Le futur concernant la ligne de produits de Digitalk est incertain, elle pourrait redevenir une compagnie indépendante.

 

VisualAge

La version d'IBM de Smalltalk, VisualAge, est comparable avec Smalltalk/V muni de PARTS. Ces deux Smalltalk permettent aux programmeurs d'exploiter les caractéristiques spécifiques d'un ordinateur aux frais de la portabilité. IBM a adapté des standards existants de l'industrie tels que la gestion de fichiers et les graphiques. Lorsqu'IBM parle, les gens écoutent, et IBM s'est engagé substantiellement envers Smalltalk.

 

Java

Java est le plus récent et le plus couru des langages orientés-objets. Il a pris d'assaut le monde du logiciel par le lien très étroit qu'il possède avec Internet et les navigateurs Web. Il est conçu comme un langage portable qui peut tourner sur tout ordinateur branché sur Internet via un navigateur. Ainsi, il est très prometteur pour devenir le standard pour la programmation d'applications Internet et Intranet.

Java est un mélange curieux de C++ et Smalltalk. Il possède la syntaxe du C++, le rendant plus facile (ou plus difficile) à apprendre selon votre expérience. Mail il s'est amélioré face au C++ à plusieurs égards. Il n'a pas de pointeurs, un outil de programmation de bas niveau qui rend les programmes plus enclins aux erreurs. Comme Smalltalk, il possède un garbage collection, une caractéristique qui libère le programmeur d'avoir à allouer et désallouer explicitement la mémoire. Et il s'exécute sur une machine virtuelle semblable à Smalltalk, il s'agit d'un logiciel intégré à votre navigateur qui exécute les mêmes bytecodes Java peut importe le type d'ordinateur que vous possédez.

Les outils de développement Java se déploient rapidement et sont disponibles chez la plupart des compagnies majeures de logiciels, telles qu'IBM, Microsoft et Symantec.

 

En résumé

La programmation orientée-objets offre un nouveau et puissant modèle pour l'écriture de logiciels d'ordinateur. Les objets sont des «boîtes noires» qui envoient et reçoivent des messages. Cette approche accélère le développement de nouveaux programmes, et, si utilisée correctement, améliore la maintenance et la réutilisation des logiciels.

Cependant, la programmation OO impose un changement majeur dans la manière de penser des programmeurs. Le langage C++ offre une transition plus facile à partir du C, mais demande tout de même une approche de conception OO pour bien faire usage de cette technologie. Smalltalk offre un environnement OO pur, avec un temps de développement plus rapide et une plus grande puissance et flexibilité. Java est plus prometteur pour les applications OO Internet et Intranet.