Pensée orientée objet

De Lillois Fractale Wiki
Révision datée du 30 mars 2010 à 15:57 par Pge (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher


Juillet 2008- Philippe Gonze

[Les notes qui suivent sont destinées à alimenter un cours particulier donné à ma fille Hélène.]

Contexte

La pensée orientée objet est à ce jour et selon mon expérience la plus puissante et la plus féconde pour

  • énoncer
  • traiter

une vaste catégorie de problèmes

  • scientifiques
  • opérationnels
  • business

Comme elle ne fait pas l'objet d'une formation structurée, il m'a paru utile de te la présenter, de la comparer à ses "compétiteurs", d'en appréhender la puissance et les limites.

La pensée humaine

Sans entrer dans de vastes allées philosophiques, la pensée humaine peut être au plus niveau classée en trois groupes.

  1. La pensée émotionnelle est résolument subjective et peuple notre cerveau dans une partie majeure de notre vie. La pensée émotionnelle est ancrée dans notre animalité. Elle gère la compétition, les formes de stress, les formes de désir et de plaisir, la reproduction, l'alimentation et tout ce qui peut caractériser le comportement basique de notre espèce. Par ailleurs si une forme de pensée pouvait être prêtée à d'autres espèces, ce serait la pensée émotionnelle.
  2. Lapensée fusionnelle et religieuse se construite sur des évidences d'autant plus fortes qu'elles sont indémontrables, et donc aussi subjectives qu'incontestables. La pensée fusionnelle est importante chez l'homme primitif. Elle guide ses choix et donne à sa vie le sens qui est souvent difficile à y déceler.
  3. La pensée structurante se veut objective. Elle souhaite traiter des connaissances incontestables. Elle se veut dynamique et incrémentale : ses résultats alimentent de nouvelles pistes de développements. Son contenu et ses résultats apportent la compréhension et la connaissance, mais rarement le sens.

C'est bien sûr à la catégorie de la pensée structurante qu'appartient le pensée orientée objet, mais elle n'est pas seule dans cette catégorie.

La pensée structurante

La pensée structurante est probablement liée historiquement au "miracle grec". Il y eut certainement d'autres émergences de pensées structurantes en d'autres lieux et d'autres temps, mais pour nous occidentaux, les racines de la pensée structurante sont grecques.

A la pensée structurante il faut lier la démarche de modélisation. La démarche de modélisation consiste notamment à mettre deux espaces en perspectives. Le premier espace contient une réalité plus ou moins complexe, mais trop complexe pour être appréhendée immédiatement par notre intelligence. Le second espace contient un modèle, c'est à dire une projection de la réalité du premier espace. Le modèle présente l'avantage d'être plus facile à manipuler, à tester, à décrire.

Toutes les sciences sont construites comme des suites de modèles destinés à appréhender la réalité scientifique objective. L'optique, la mécanique newtonienne, la chimie moléculaire, la génétique, la mécanique quantique, la relativité,... tous sont des modèles. Mais des modèles sont aussi construits pour des aspects beaucoup plus spécialisés et anecdotiques de la réalité: on peut construire un modèle des marées lunaires, des mouvements du coude, de l'évolution des taux de change,... Dès qu'une réalité complexe est réduite par projection à un dispositif plus simple et plus intelligible, on parle d'un modèle.

Note. Je suis ingénieur en mathématiques appliquées, mais au vu de mes productions, le titre d'"ingénieur en modèles" aurait été plus approprié. C'est une pensée que ne renierait pas mon estimé professeur J. Lefèvre, qui m'a donnée le goût de la modélisation et m'a formé à cette démarche...

Note.  Dans le mythe de la caverne, de Platon, les ombres de la réalité sont projetées devant les yeux faibles des enchaînés, qui n'ont du monde que ce modèle très limité. Il s'agit peut-être du plus bel ancêtre de toutes les démarches de modélisation.

La qualité de la pensée structurante (ou la qualité d'un modèle) se mesure à sa fécondité. Est déclarée féconde une pensée structurante (un modèle) qui permet de mieux comprendre la réalité approximée, et par exemple d'en prédire le comportement.

Note. La trajectoire de Mercure est l'exemple historique de ce succès. Le modèle Newtonien en donnait une prédiction. Puis le modèle relativiste en donna une autre, significativement différente. Enfin l'expérience - le retour dans l'espace de la réalité - donna raison au second modèle. En construisant un modèle performant en terme de prédictions, Einstein assura le succès de son modèle, et les expériences concernant Mercure lui offrirent subitement une large notoriété.

Les deux pôles de la pensée structurante

Dans la pensée structurante, il y a de très nombreuses familles.

Elles sont organisées autour de deux pôles : le pôle verbal et le pôle formel.

Le pôle verbal relève du langage naturel.

Le pôle formel est lié à l'usage des langages formels.

Pensée structurante verbale

Au départ la pensée structurante s'est développée de manière verbale. La connaissance du monde s'exprime au moyen des mots du langage naturel. C'est souvent laborieux et imprécis, mais pendant fort longtemps, c'était le seul matériel disponible.

Les philosophes grecs qui construisent leurs modèles de la nature sont les premiers champions de la modélisation, et ils ne peuvent s'appuyer que sur le pôle verbal.

Note. Le succès du miracle grec s'appuie sur la puissance de la langue grecque. La puissance, la concision, la subtilité, et la forte structuration de cette langue morte demandent des efforts d'apprentissage particuliers, mais procurent - consciemment ou non - des rouages de pensées héritant des mêmes qualités. Les langues contemporaines, Français, Anglais, Espagnol,... ne possèdent qu'une infime part de cette structuration - parlée il y a 3000 ans !

Plus tard les démarches de sophistes, et la logique des syllogismes cherchent à construire une connaissance du monde sur une démarche systématique, mais celle-ci ne s'appuie toujours que sur le langage naturel. Elle sont donc victimes de toutes ses limitations : séquentialité, imprécisions, homonymies, synonymes, catégorisations approximatives....

Aujourd'hui encore, une bonne part de la connaissance du monde se construit et se transmet via le langage naturel. Le texte que vous lisez est écrit en langage naturel. Le médecin explique à son patient les rouages du corps et de la maladie par des mots, ceux là-mêmes qu'il a entendus lorsqu'il était étudiant.

Note. C'est une caractéristique de la médecine. Le savoir médical s'organise, se construit, se transmet, se développe pour une part majeure en langage naturel. C'est pour cela peut-être que la médecine accède laborieusement au statut de science, et reste le plus souvent un art.

La pensée verbale peut être extrêmement élégante, diversifiée, féconde, L'enseignement du Latin et du Grec dans les écoles occidentales étaient précieux, et sa disparition coûte bien plus cher que ne le supposent les responsables de l'enseignement. La pensée verbale (et écrite) de ces deux langues mortes sont particulièrement structurantes. Les rouages qu'elles activent dans les cerveaux de ceux qui les apprennent deviennent puissant à force d'entraînement, et leur champs d'application sont bien plus diversifiés que ne le supposent ceux qui ne les ont pas essayé (et ceci n'a évidement rien à voir avec l'utilité très naïve que constitue la connaissance des racines des mots des langues occidentales et des noms scientifiques).

Pensée structurante formelle

Comment décrire la trajectoire d'un astre ou d'une flèche ?

Comment décrire la forme d'une goutte d'eau ou d'une bulle de savon ?

Comment décrire l'évolution d'une population vivante ?

Ici le langage naturel est d'un faible secours : "courbe", "ellipse", "parabole", "solide de révolution", "exponentielle", "matrice" ne sont que des mots, et ils ne révèlent pas en tant que tels la richesse des concepts qu'ils abritent.

Il faut donc inventer d'autres langages pour représenter tout cela, pour en construire les définitions, les caractéristiques, les propriétés.

Pour décrire une ellipse, l'équation mathématique en dit mille fois davantage que le mot ellipse. Les caractéristiques et propriétés jaillissent au sein du nouveau langage.

Copernic, Newton, Paracelse, Mendeleïev, Mendel sont obligés d'inventer et de développer de nouveaux langages pour donner corps à leurs théories. Ces langages sont multiples:

  • le principal mais non le seul : le langage mathématique général
  • le langage chimique
  • le langage logique
  • le langage mathématique matriciel
  • le langage mathématique différentiel et intégral
  • etc...

Comme les langages naturels, ils sont prononçables et visualisables. Mais leur puissance s'exprime toujours à l'intérieur d'eux-mêmes: une démonstration d'algèbre existe par elle-même et dans le langage mathématique, indépendamment du fait qu'elle soit prononcée ou vue.

Dans le domaine scientifique, la fécondité de la pensée structurante formelle est omniprésente. La pensée formelle verbale n'yest plus qu'un ancêtre oublié, ou un serviteur occasionnel. Langages Informatiques

Mais l'histoire des langages a connu d'autres rebondissement, et effets boomerang !

L'invention des machines à calculer, puis des ordinateurs a permis de résoudre des problèmes pratiques innombrables. Les ordinateurs sont aujourd'hui plus nombreux que les humains sur notre planète ! Et à présent, les téléphones, les téléviseurs, les voitures, les appareils ménagers sont de plus en plus des ordinateurs spécialisés et dotés d'organes moteurs et récepteurs.

Mais comment se fait le dialogue entre le prescripteur (l'homme programmeur) et l'ordinateur (l'exécutant programmé) ? Il faut un langage. Les textes produits dans ce langage s'appellent programmes. Le langage des programmes informatiques doit posséder quelques propriétés vitales

  • Il doit être complet et précis. Il doit permettre d'exécuter toutes les instructions souhaitables.
  • Il ne doit tolérer aucune ambiguïté. En aucun cas l'exécutant de dispose de choix.
  • Il doit être lisible par l'exécutant, et de préférence par plusieurs exécutants. Au début de l'informatiqiue chaque type d'ordinateur avait son langage propre; ensuite les ordinateurs ont été conçus pour pouvoir tous comprendre et exécuter des programmes écrits dans des langages indépendants des ordinateurs). C'est le problème de la portabilité, qui n'est toujours pas résolu de manière satisfaisante.
  • Il doit être compréhensible par le prescripteur, et par ses successeurs en charge des mêmes programmes.

Ce dernier point paraît évident et naïf. IL N'EN EST RIEN. En effet, encore maintenant:

  • La plupart des programmes ne sont compréhensibles QUE par celui qui l'a écrit.
  • La plupart des programmes complexes ne sont même plus compréhensibles par les programmeurs qui les ont produits
  • La plupart des programmes actifs contiennent des problèmes (bugs) connus, répertoriés et acceptés.
  • La plupart des programmes actifs ne sont plus gérés par leurs auteurs.
  • La plupart des bugs ne sont pas corrigés, mais ils sont contournés.
  • Bien souvent, la résolution d'un bug induit l'insertion d'un ou plusieurs nouveaux bugs.

Le problème central des langages informatiques

Le problème majeur de l'informatique est donc devenu celui de la compréhensibilité des programmes. Ce problème s'articule autour de trois axes.

La complexité croissante des problèmes traités

La lisibilité des programmes par les auteurs et leurs successeurs

Le dialogue entre les informaticiens programmeurs et les humains qui, en amont des programmeurs, rédigent des spécifications de programmes.

A la lueur de ce qui précède, et à ce stade de l'article. Il est intéressant de classer le langage informatique et ses ambitions.

Le langage informatique est un hybride formel-verbal.

  •  Il se rapproche du langage formel par les propriétés suivantes : précis, complet, non ambigu
  •  Il se rapproche du langage naturel par ses formes, par son caractère séquentiel, par sa visibilité et sa prononçabilité.
si (voiture.moteur.puissance > taxe.puissanceminimale) alors voiture.conducteur.payerTaxe()
  • Il bute sur des formes compréhensibilité, de réutilisabilité.
  • Il ne permet pas encore un dialogue efficace entre spécificateur et programmeur.

Pour progresser sur les deux derniers points supra, les spécialistes de l'informatique ont mis au point entre 1970 et actuellement les langages orientés objets.

Langages orientés objets

Les langages orientés objets (OO) visent à rendre l'exercice de programmation plus productif.

Pour ce qui concerne les résultats, les langages orientés objets ont obtenu de facto un véritable triomphe.

  • 99% des programmes développés actuellement sont écrits en langage OO (qui se souvient de l'assembleur, du Fortran , du Cobol... ?)
  • la complexité des problèmes traités par les langages OO est infiniment supérieure à la complexité des programmes écrits précédemment
  • les programmes OO sont à peine inférieurs à leurs prédécesseurs en termes de performances (vitesse,...)
  • les programmes OO sont supérieurs à leurs prédécesseurs en termes de stabilité (résistance aux défaillances de programmation)

On peut dire que les langages OO relèvent de la pensée structurante, et qu'ils occupent une place intermédiaire entre pensée structurante verbale et pensée structurante formelle. D'un certaine manière les langages OO constitueraient la synthèse et le point de rencontre entre le verbal et le formel. Mais ils restent un langage trop limités à des spécialistes. Plus loin ce point sera rediscuté.

Dans les langages OO, l'accent est mis sur

    • la lisibilité (ce que fait un programme doit être compréhensible en parcourant le programme)
    • la portabilité (un programme OO doit pouvoir tourner sans changement sur des ordinateurs divers, avec des systèmes opératoires (Windows, Linux, Solaris...) distincts)
    • la scalabilité (le même programme doit pouvoir tourner sur des machines de taille totalement différentes, depuis la montre jusqu'à la fusée spatiale).
    • la réutilisabilité (un objet bien défini dans un langage OO doit pouvoir ensuite être réutilisé dans d'autres programmes OO).

Cependant la limite reste la suivante : LE DIALOGUE ENTRE SPECIFICATEUR ET PROGRAMMEUR. Ce dialogue reste maladroit, ambigu, chargé d'imprécisions. Les spécificateurs se plaignent de n'être pas compris par les programmeurs. Les programmeurs se plaignent de voir dans les spécifications reçues des impossibilités, des confusions, des incohérences.

Le programmeur parle et comprend le langage OO. L'approche OO est puissante, universelle, féconde. Elle reprend et dépasse plusieurs points forts des meilleures pensées structurantes.

Comment la sortir du cadre des spécialistes programmeurs ?

Pensée Orientée Objet

Pour développer leurs programmes OO, les programmeurs ont implicitement développé un mode de pensée OO, qui existe indépendemment des langages OO, qui est à la fois plus accessible, plus ordinaire et plus échangeable.

Cette pensée est moins contraignante et moins rigoureuse que l'utilisation des langages OO.

Mais

  • elle est accessible à tous
  • elle permettrait de grandement améliorer le dialogue entre programmeurs et spécificateurs. Elle constitue un pont entre langage OO et langage naturel.
  • elle offreen tant que pensée structurante une puissance incomparable
  • elle se prête à l'enseignement

Voici donc pour suivre les rudiments de la pensée structurante OO

Concepts généraux de la pensée OO

Objet

L'objet est l'entité basique. Ta voiture smart est un objet. Ma voiture audi a6 est un objet. Ce sont deux objets distincts. Il y a d'innombrables autre objets. Il faut imaginer un objet comme une entité concrète, mais ceci devra être nuancé.

Attribut

Ta voiture smart a une couleur : grise.

Ma voiture audi a6 a une couleur : noire.

Ta voiture possède d'autres attributs (on pourrait dire "caractéristiques" ou "propriétés"). On pourrait mentionner:

  • attribut propriétaire : Hélène Gonze
  • attribut moteur : moteur Diesel 1100cc
  • attribut nombre-de-place : 2
  • attribut nombre-de-roues : 4
  • attribut constructeur : Smart
  • attribut année-de-construction : 1999
  • attribut type-de-boite : automatique
  • attribut longueur : 0.184m
  • attribut possède-GPS : faux
  • ...

Formellement, on dit "La valeur de l'attribut <longueur en m> pour l'objet smart-d'Hélène est l'objet <0.184>".

On voit que les attributs peuvent être très nombreux.

La valeur d'un attribut est toujours un autre objet. "0.184" est un objet. "2" est un objet. "automatique" est un objet. "moteur Diesel 1100cc" est un objet. "Hélène Gonze" est un objet (eh oui !).

L'objet "moteur Diesel 1100cc dans ta voiture smart" est encore un objet. Imaginons ses attributs:

  • attribut année-de-construction : 1999
  • attribut cylindrée en cc : 1100
  • attribut puissance en CV Fiscaux: 8
  • ...

Je te laisse deviner une liste d'attribut de l'objet "Hélène Gonze".

Classe

Ta voiture smart et ma voiture a6 ont beaucoup en commun.

Ces deux objets appartiennent à la même classe.

La classe auxquels ils appartiennent est "voiture".

"Hélène Gonze" appartient à la classe "personne humaine".

Il y a d'innombrables classes d'objets.

La base de pensée OO est ici : un objet appartient à une classe ; une classe réunit un certain nombre d'objets qui lui appartiennent.

Instance

En fait on le dit aussi différemment: "TaSmart" est une instance de la classe "voiture".

"Mon-audi-a6" est aussi une instance de la classe "voiture".

"Hélène Gonze" est une instance de la classe "personne humaine".

Une classe reflète une généralité, une abstraction. Ses instances sont concrètes. Cette distinction hérite de celle formulée par platon entre abstraction et concrétion.

Retour aux attributs

Ici nous devons bien distinguer:

Une classe possède des attributs

la classe "voiture" possède l'attribut "moteur" la classe "voiture" possède l'attribut "propriétaire"
la classe "personne humaine" possède l'attribut "nom"

L'instance d'une classe possède pour un attribut une valeur, qui est un objet

l'instance "ta-smart" de la classe "voiture" possède pour l'attribut "propriétaire", la valeur "Hélène Gonze", qui est bien un objet.

Références et langage réservé

Pour faire référence à des objets on leur donne un nom.

Nous avons appellé un certain objet "TaSmart", mais nous eussions pu l'appeler "la petite bagnole d'Hélène" ou "Arthur" ou encore "Le microbe routier de Lillois". Le choix des références (c'est à dire des noms) est libre, donc arbitraire. Mais il est commode d'utiliser des noms qui gardent un sens dans le langage naturel. Par exemple, donner à ta voiture le nom "SarahGonze" n'est pas interdit, mais cela ouvre la voie à de stupides confusions.

Et puis il y a quelque mots qui ont un sens très précis: ce sont "objet", "classe", "instance", "attribut",... (il y en a d'autres). Ceux là doivent être utilisés avec beaucoup de discipline.

Et puis il y a des conventions d'écriture. Pour référencer l'objet qui est la valeur de l'attribut d'un autre objet, on utilise la jonction "." (point).

Par exemple: TaSmart.propriétaire est une référence à l'objet qui est l'attribut propriétaire de l'objet "TaSmart". Il s'agit donc d'une autre référence à l'objet "HélèneGonze".

Tu devines alors ce que signifie : TaSmart.moteur.puissanceCC

En pensée OO, on manipule des objets et des attributs de cette manière.

Bien définir des classes et des attributs semble être un exercice évident. Il va de soi que l'on peut définir des classes en fonction du type de problème que l'on gère. Pour une université, "HélèneGonze" est enregistrée avec tous ses attributs dans la classe "étudiant". Par contre pour Apple, "HélèneGonze" est enregistrée avec de tout autres attributs dans la classe "consommateur".

Dans bien des cas, l'organisation des classes et attributs demande un profonde réflexion, et la nature même des choses y est reflétée. Bien comprendre la nature des choses revient à pouvoir en faire un bon modèle en pensée OO !

Héritage, sous-classe, sur-classe

"TaSmart" est une instance de "voiture".

Mais "TaSmart" est aussi une instance de "véhicule".

"VélodeCyril" aussi est une instance de véhicule. Et "MotoDeGeneviève" aussi est une instance de véhicule.

Il faut y mettre de l'ordre. Nous allons dire:

"Véhicule" est une classe d'objet (tout ce qui permet de se déplacer).

"Voiture" est une sous-classe de la classe véhicule".

"Bicycle" est une sous-classe de la classe "véhicule".

"Moto" et "Vélo" sont deux sous-classes de la classe "Bicycle".

Bien entendu, on pourrait ajouter, avion, planeur, train, voilier,... Comme on le devine, l'ensemble des sous-classes d'une classe donnée s'organise comme un arbre.

Bon. La classe véhicule possède un attribut "nombre-maximum-de-passager". Et ses sous-classes ("voiture", "moto", "train",....) ? Oui : les sous-classes d'une classe possèdent toujours tous les attributs de leur sur-classe. Un vélo possède bien l'attribut "nombre-maximum-de-passager", et le train aussi.

Voici comment résumer ce concept. On exprime:

  • "train" est une sous-classe de "véhicule".
  • "train" hérite de "véhicule" (ce qui signifie que la classe "train" reçoit en héritage tous les attributs de la classe "véhicule".
  • "véhicule" est une sur-classe de "train".

Mais maintenant, les choses peuvent devenir plus subtiles: la propriété "nombre-de-roues" est-elle une propriété de la classe véhicule, de la classe voiture ou de la classe vélo ???

Ici l'effort de modélisation prend forme. On voit qu'il serait utile de créer une classe intermédiaire "véhicule-roulant". "véhicule-roulant" est une sous-classe de "véhicule". "voiture", "camion", "vélo" et "moto" semblent des sous-classes de "véhicule-roulant", avec peut-être des classes intermédiaires...

L'effort de pensée OO, l'effort de modélisation consiste à définir de manière satisfaisante une famille de classes et leurs propriétés respectives, en prenant bien en compte le mécanisme d'héritage des propriétés.

Classe finale

Une classe final est une classe qui ne peut plus avoir de sous-classe. Il s'agit en général d'objets simples, qui ne nécessitent pas pour leur description l'intervention de propriétés complexes.

Par exemple "nombre-entier" est une classe finale.

Classe ancestrale

Il y a une et une seule classe qui est la sur-classe de toutes les autres. C'est la classe "objet". Elle ne possède aucun attribut particulier (sauf aux yeux pervers des informaticiens).

Classe abstraite

Toutes les classes peuvent donner lieu à des instances... ?

Toutes sauf les classes abstraites. Une classe abstraite n'est pas instanciable.

Ainsi, nous pouvons considérer que "vélo" et "moto" sont deux sous-classes d'une classe "véhicule-bi-cycle". La classe "vélo" et la classe "moto" sont instanciables : il existe des vélos et des motos. Quant à la classe "véhicule-bi-cycle", elle possède de fait des attributs (telles que "taille-du-guidon", ou "diamètre des roues"...), mais elle n'est pas instanciable. En effet ses instances ne peuvent être que des motos ou des vélos, c'est à dire en fait des instances des deux sous-classes.

Méthodes

Tout ce qui précède est descriptif et statique. Cependant dans la réalité, les modèles O-O doivent permettre (1) d'obtenir des informations sur les objets et (2) de modifier le comportement des objets.

Ceci se fait au moyen de méthodes passives et actives.

Voyons toujours l'objet "TaSmart"... Voici quelques méthodes passives, qui s'intéressent à l'état instantané de ta voiture.

  • TaSmart.vitesse()
  • TaSmart.latitude()
  • TaSmart.longitude()
  • TaSmart.contenuDuRéservoir()

Ces méthodes passives (informatives) sont définies comme caractéristiques non pas d'un objet instancié ("TaSmart"), mais bien de la classe "voiture". Si l'on fait appel à ces méthodes informatives à différents moments, elles renvoient des résultats différents (par exemple TaSmart.vitesse()). Dans les exemples ci-dessus les méthodes informatives renvoient comme résultats des nombres, c'est à dire des objets simples. Mais on peu en imaginer de plus subtiles:

  • TaSmart.dateDuDernierLavage()
  • TaSmart.voitureQuiPrécède()

Ces deux méthodes informatives-ci renvoient respectivement un objet de classe "date" et un objet de classe "voiture".

On voit que la pensée OO mène à un formalisme sympathique

Si TaSmart.vitesse() > TaSmart.rueVisitée().vitesseAutorisée ....

A coté des méthodes passives (informatives), il y a les méthodes actives. En voici quelques unes, telles que définies au niveau d'une classe:

  • voiture.accélérer()
  • voiture.freiner()
  • vélo.guidon.pencher()
  • moto.frein.appuyer()

Ces méthodes-ci ont pour effet de changer l'état ou le comportement de l'objet ciblé.

Les mécanismes d'héritage définis pour les attributs sont également valables pour les méthodes passives et actives. Dans une sous-classe on dispose de toutes les méthodes définies dans ses sur.classes. Ainsi, si "vitesse()" et "accélérer()" sont des méthode de la classe "véhicule" alors elles sont utilisables dans toutes les sous-classes définies sous "véhicule".

Conclusion

Ce qui précède n'est qu'une brève introduction aux principaux concepts de la pensée OO, mais il doit permettre d'en deviner la saveur. La pensée OO est un paradigme omniprésent pour les techniciens de l'informatique et des sciences. Mais elle peut être rendue accessible à tous, et sa fécondité touche à tous les domaines de réflexion, de business et d'action.

C'est aussi une paradigme qui constitue à la fois un intermédiaire et un dépassement de la pensée structurante verbale et de la pensée structurante formelle.

A ce titre elle deviendra un must pour les esprits éclairés du XXIème siècle. Et peut être même pour mes enfants.. Juillet 2008- Philippe Gonze

[Les notes qui suivent sont destinées à alimenter un cours particulier donné à ma fille Hélène.] Contexte

La pensée orientée objet est à ce jour et selon mon expérience la plus puissante et la plus féconde pour

   * énoncer
   * traiter

une vaste catégorie de problèmes

   * scientifiques
   * opérationnels
   * business

Comme elle ne fait pas l'objet d'une formation structurée, il m'a paru utile de te la présenter, de la comparer à ses "compétiteurs", d'en appréhender la puissance et les limites. La pensée humaine

Sans entrer dans de vastes allées philosophiques, la pensée humaine peut être au plus niveau classée en trois groupes.

  1. La pensée émotionnelle est résolument subjective et peuple notre cerveau dans une partie majeure de notre vie. La pensée émotionnelle est ancrée dans notre animalité. Elle gère la compétition, les formes de stress, les formes de désir et de plaisir, la reproduction, l'alimentation et tout ce qui peut caractériser le comportement basique de notre espèce. Par ailleurs si une forme de pensée pouvait être prêtée à d'autres espèces, ce serait la pensée émotionnelle.
  2. Lapensée fusionnelle et religieuse se construite sur des évidences d'autant plus fortes qu'elles sont indémontrables, et donc aussi subjectives qu'incontestables. La pensée fusionnelle est importante chez l'homme primitif. Elle guide ses choix et donne à sa vie le sens qui est souvent difficile à y déceler.
  3. La pensée structurante se veut objective. Elle souhaite traiter des connaissances incontestables. Elle se veut dynamique et incrémentale : ses résultats alimentent de nouvelles pistes de développements. Son contenu et ses résultats apportent la compréhension et la connaissance, mais rarement le sens.

C'est bien sûr à la catégorie de la pensée structurante qu'appartient le pensée orientée objet, mais elle n'est pas seule dans cette catégorie. La pensée structurante

La pensée structurante est probablement liée historiquement au "miracle grec". Il y eut certainement d'autres émergences de pensées structurantes en d'autres lieux et d'autres temps, mais pour nous occidentaux, les racines de la pensée structurante sont grecques.

A la pensée structurante il faut lier la démarche de modélisation. La démarche de modélisation consiste notamment à mettre deux espaces en perspectives. Le premier espace contient une réalité plus ou moins complexe, mais trop complexe pour être appréhendée immédiatement par notre intelligence. Le second espace contient un modèle, c'est à dire une projection de la réalité du premier espace. Le modèle présente l'avantage d'être plus facile à manipuler, à tester, à décrire.

Toutes les sciences sont construites comme des suites de modèles destinés à appréhender la réalité scientifique objective. L'optique, la mécanique newtonienne, la chimie moléculaire, la génétique, la mécanique quantique, la relativité,... tous sont des modèles. Mais des modèles sont aussi construits pour des aspects beaucoup plus spécialisés et anecdotiques de la réalité: on peut construire un modèle des marées lunaires, des mouvements du coude, de l'évolution des taux de change,... Dès qu'une réalité complexe est réduite par projection à un dispositif plus simple et plus intelligible, on parle d'un modèle.

   Note. Je suis ingénieur en mathématiques appliquées, mais au vu de mes productions, le titre d'"ingénieur en modèles" aurait été plus approprié. C'est une pensée que ne renierait pas mon estimé professeur J. Lefèvre, qui m'a donnée le goût de la modélisation et m'a formé à cette démarche... 
   Note.  Dans le mythe de la caverne, de Platon, les ombres de la réalité sont projetées devant les yeux faibles des enchaînés, qui n'ont du monde que ce modèle très limité. Il s'agit peut-être du plus bel ancêtre de toutes les démarches de modélisation.

La qualité de la pensée structurante (ou la qualité d'un modèle) se mesure à sa fécondité. Est déclarée féconde une pensée structurante (un modèle) qui permet de mieux comprendre la réalité approximée, et par exemple d'en prédire le comportement.

   Note. La trajectoire de Mercure est l'exemple historique de ce succès. Le modèle Newtonien en donnait une prédiction. Puis le modèle relativiste en donna une autre, significativement différente. Enfin l'expérience - le retour dans l'espace de la réalité - donna raison au second modèle. En construisant un modèle performant en terme de prédictions, Einstein assura le succès de son modèle, et les expériences concernant Mercure lui offrirent subitement une large notoriété.

Les deux pôles de la pensée structurante

Dans la pensée structurante, il y a de très nombreuses familles.

Elles sont organisées autour de deux pôles : le pôle verbal et le pôle formel.

Le pôle verbal relève du langage naturel.

Le pôle formel est lié à l'usage des langages formels. Pensée structurante verbale

Au départ la pensée structurante s'est développée de manière verbale. La connaissance du monde s'exprime au moyen des mots du langage naturel. C'est souvent laborieux et imprécis, mais pendant fort longtemps, c'était le seul matériel disponible.

Les philosophes grecs qui construisent leurs modèles de la nature sont les premiers champions de la modélisation, et ils ne peuvent s'appuyer que sur le pôle verbal.

   Note. Le succès du miracle grec s'appuie sur la puissance de la langue grecque. La puissance, la concision, la subtilité, et la forte structuration de cette langue morte demandent des efforts d'apprentissage particuliers, mais procurent - consciemment ou non - des rouages de pensées héritant des mêmes qualités. Les langues contemporaines, Français, Anglais, Espagnol,... ne possèdent qu'une infime part de cette structuration - parlée il y a 3000 ans !

Plus tard les démarches de sophistes, et la logique des syllogismes cherchent à construire une connaissance du monde sur une démarche systématique, mais celle-ci ne s'appuie toujours que sur le langage naturel. Elle sont donc victimes de toutes ses limitations : séquentialité, imprécisions, homonymies, synonymes, catégorisations approximatives....

Aujourd'hui encore, une bonne part de la connaissance du monde se construit et se transmet via le langage naturel. Le texte que vous lisez est écrit en langage naturel. Le médecin explique à son patient les rouages du corps et de la maladie par des mots, ceux là-mêmes qu'il a entendus lorsqu'il était étudiant.

   Note. C'est une caractéristique de la médecine. Le savoir médical s'organise, se construit, se transmet, se développe pour une part majeure en langage naturel. C'est pour cela peut-être que la médecine accède laborieusement au statut de science, et reste le plus souvent un art.

La pensée verbale peut être extrêmement élégante, diversifiée, féconde, L'enseignement du Latin et du Grec dans les écoles occidentales étaient précieux, et sa disparition coûte bien plus cher que ne le supposent les responsables de l'enseignement. La pensée verbale (et écrite) de ces deux langues mortes sont particulièrement structurantes. Les rouages qu'elles activent dans les cerveaux de ceux qui les apprennent deviennent puissant à force d'entraînement, et leur champs d'application sont bien plus diversifiés que ne le supposent ceux qui ne les ont pas essayé (et ceci n'a évidement rien à voir avec l'utilité très naïve que constitue la connaissance des racines des mots des langues occidentales et des noms scientifiques). Pensée structurante formelle

Comment décrire la trajectoire d'un astre ou d'une flèche ?

Comment décrire la forme d'une goutte d'eau ou d'une bulle de savon ?

Comment décrire l'évolution d'une population vivante ?

Ici le langage naturel est d'un faible secours : "courbe", "ellipse", "parabole", "solide de révolution", "exponentielle", "matrice" ne sont que des mots, et ils ne révèlent pas en tant que tels la richesse des concepts qu'ils abritent.

Il faut donc inventer d'autres langages pour représenter tout cela, pour en construire les définitions, les caractéristiques, les propriétés.

Pour décrire une ellipse, l'équation mathématique en dit mille fois davantage que le mot ellipse. Les caractéristiques et propriétés jaillissent au sein du nouveau langage.

Copernic, Newton, Paracelse, Mendeleïev, Mendel sont obligés d'inventer et de développer de nouveaux langages pour donner corps à leurs théories. Ces langages sont multiples:

   * le principal mais non le seul : le langage mathématique général
   * le langage chimique
   * le langage logique
   * le langage mathématique matriciel
   * le langage mathématique différentiel et intégral
   * etc...

Comme les langages naturels, ils sont prononçables et visualisables. Mais leur puissance s'exprime toujours à l'intérieur d'eux-mêmes: une démonstration d'algèbre existe par elle-même et dans le langage mathématique, indépendamment du fait qu'elle soit prononcée ou vue.

Dans le domaine scientifique, la fécondité de la pensée structurante formelle est omniprésente. La pensée formelle verbale n'yest plus qu'un ancêtre oublié, ou un serviteur occasionnel. Langages Informatiques

Mais l'histoire des langages a connu d'autres rebondissement, et effets boomerang !

L'invention des machines à calculer, puis des ordinateurs a permis de résoudre des problèmes pratiques innombrables. Les ordinateurs sont aujourd'hui plus nombreux que les humains sur notre planète ! Et à présent, les téléphones, les téléviseurs, les voitures, les appareils ménagers sont de plus en plus des ordinateurs spécialisés et dotés d'organes moteurs et récepteurs.

Mais comment se fait le dialogue entre le prescripteur (l'homme programmeur) et l'ordinateur (l'exécutant programmé) ? Il faut un langage. Les textes produits dans ce langage s'appellent programmes. Le langage des programmes informatiques doit posséder quelques propriétés vitales

   * Il doit être complet et précis. Il doit permettre d'exécuter toutes les instructions souhaitables.
   * Il ne doit tolérer aucune ambiguïté. En aucun cas l'exécutant de dispose de choix.
   * Il doit être lisible par l'exécutant, et de préférence par plusieurs exécutants. Au début de l'informatiqiue chaque type d'ordinateur avait son langage propre; ensuite les ordinateurs ont été conçus pour pouvoir tous comprendre et exécuter des programmes écrits dans des langages indépendants des ordinateurs). C'est le problème de la portabilité, qui n'est toujours pas résolu de manière satisfaisante.
   * Il doit être compréhensible par le prescripteur, et par ses successeurs en charge des mêmes programmes.

Ce dernier point paraît évident et naïf. IL N'EN EST RIEN. En effet, encore maintenant:

   * La plupart des programmes ne sont compréhensibles QUE par celui qui l'a écrit.
   * La plupart des programmes complexes ne sont même plus compréhensibles par les programmeurs qui les ont produits
   * La plupart des programmes actifs contiennent des problèmes (bugs) connus, répertoriés et acceptés.
   * La plupart des programmes actifs ne sont plus gérés par leurs auteurs.
   * La plupart des bugs ne sont pas corrigés, mais ils sont contournés.
   * Bien souvent, la résolution d'un bug induit l'insertion d'un ou plusieurs nouveaux bugs.

Le problème central des langages informatiques

Le problème majeur de l'informatique est donc devenu celui de la compréhensibilité des programmes. Ce problème s'articule autour de trois axes.

La complexité croissante des problèmes traités

La lisibilité des programmes par les auteurs et leurs successeurs

Le dialogue entre les informaticiens programmeurs et les humains qui, en amont des programmeurs, rédigent des spécifications de programmes.

A la lueur de ce qui précède, et à ce stade de l'article. Il est intéressant de classer le langage informatique et ses ambitions.

Le langage informatique est un hybride formel-verbal.

   *  Il se rapproche du langage formel par les propriétés suivantes : précis, complet, non ambigu
   *  Il se rapproche du langage naturel par ses formes, par son caractère séquentiel, par sa visibilité et sa prononçabilité.
   si (voiture.moteur.puissance > taxe.puissanceminimale) alors voiture.conducteur.payerTaxe()
   * Il bute sur des formes compréhensibilité, de réutilisabilité.
   * Il ne permet pas encore un dialogue efficace entre spécificateur et programmeur.

Pour progresser sur les deux derniers points supra, les spécialistes de l'informatique ont mis au point entre 1970 et actuellement les langages orientés objets. Langages orientés objets

Les langages orientés objets (OO) visent à rendre l'exercice de programmation plus productif.

Pour ce qui concerne les résultats, les langages orientés objets ont obtenu de facto un véritable triomphe.

   * 99% des programmes développés actuellement sont écrits en langage OO (qui se souvient de l'assembleur, du Fortran , du Cobol... ?)
   * la complexité des problèmes traités par les langages OO est infiniment supérieure à la complexité des programmes écrits précédemment
   * les programmes OO sont à peine inférieurs à leurs prédécesseurs en termes de performances (vitesse,...)
   * les programmes OO sont supérieurs à leurs prédécesseurs en termes de stabilité (résistance aux défaillances de programmation)

On peut dire que les langages OO relèvent de la pensée structurante, et qu'ils occupent une place intermédiaire entre pensée structurante verbale et pensée structurante formelle. D'un certaine manière les langages OO constitueraient la synthèse et le point de rencontre entre le verbal et le formel. Mais ils restent un langage trop limités à des spécialistes. Plus loin ce point sera rediscuté.

Dans les langages OO, l'accent est mis sur

   *
         o la lisibilité (ce que fait un programme doit être compréhensible en parcourant le programme)
         o la portabilité (un programme OO doit pouvoir tourner sans changement sur des ordinateurs divers, avec des systèmes opératoires (Windows, Linux, Solaris...) distincts)
         o la scalabilité (le même programme doit pouvoir tourner sur des machines de taille totalement différentes, depuis la montre jusqu'à la fusée spatiale).
         o la réutilisabilité (un objet bien défini dans un langage OO doit pouvoir ensuite être réutilisé dans d'autres programmes OO).

Cependant la limite reste la suivante : LE DIALOGUE ENTRE SPECIFICATEUR ET PROGRAMMEUR. Ce dialogue reste maladroit, ambigu, chargé d'imprécisions. Les spécificateurs se plaignent de n'être pas compris par les programmeurs. Les programmeurs se plaignent de voir dans les spécifications reçues des impossibilités, des confusions, des incohérences.

Le programmeur parle et comprend le langage OO. L'approche OO est puissante, universelle, féconde. Elle reprend et dépasse plusieurs points forts des meilleures pensées structurantes.

Comment la sortir du cadre des spécialistes programmeurs ? Pensée Orientée Objet

Pour développer leurs programmes OO, les programmeurs ont implicitement développé un mode de pensée OO, qui existe indépendemment des langages OO, qui est à la fois plus accessible, plus ordinaire et plus échangeable.

Cette pensée est moins contraignante et moins rigoureuse que l'utilisation des langages OO.

Mais

   * elle est accessible à tous
   * elle permettrait de grandement améliorer le dialogue entre programmeurs et spécificateurs. Elle constitue un pont entre langage OO et langage naturel.
   * elle offreen tant que pensée structurante une puissance incomparable
   * elle se prête à l'enseignement

Voici donc pour suivre les rudiments de la pensée structurante OO Concepts généraux de la pensée OO Objet

L'objet est l'entité basique. Ta voiture smart est un objet. Ma voiture audi a6 est un objet. Ce sont deux objets distincts. Il y a d'innombrables autre objets. Il faut imaginer un objet comme une entité concrète, mais ceci devra être nuancé. Attribut

Ta voiture smart a une couleur : grise.

Ma voiture audi a6 a une couleur : noire.

Ta voiture possède d'autres attributs (on pourrait dire "caractéristiques" ou "propriétés"). On pourrait mentionner:

   * attribut propriétaire : Hélène Gonze
   * attribut moteur : moteur Diesel 1100cc
   * attribut nombre-de-place : 2
   * attribut nombre-de-roues : 4
   * attribut constructeur : Smart
   * attribut année-de-construction : 1999
   * attribut type-de-boite : automatique
   * attribut longueur : 0.184m
   * attribut possède-GPS : faux
   * ...

Formellement, on dit "La valeur de l'attribut <longueur en m> pour l'objet smart-d'Hélène est l'objet <0.184>".

On voit que les attributs peuvent être très nombreux.

La valeur d'un attribut est toujours un autre objet. "0.184" est un objet. "2" est un objet. "automatique" est un objet. "moteur Diesel 1100cc" est un objet. "Hélène Gonze" est un objet (eh oui !).

L'objet "moteur Diesel 1100cc dans ta voiture smart" est encore un objet. Imaginons ses attributs:

   * attribut année-de-construction : 1999
   * attribut cylindrée en cc : 1100
   * attribut puissance en CV Fiscaux: 8
   * ...

Je te laisse deviner une liste d'attribut de l'objet "Hélène Gonze". Classe

Ta voiture smart et ma voiture a6 ont beaucoup en commun.

Ces deux objets appartiennent à la même classe.

La classe auxquels ils appartiennent est "voiture".

"Hélène Gonze" appartient à la classe "personne humaine".

Il y a d'innombrables classes d'objets.

La base de pensée OO est ici : un objet appartient à une classe ; une classe réunit un certain nombre d'objets qui lui appartiennent. Instance

En fait on le dit aussi différemment: "TaSmart" est une instance de la classe "voiture".

"Mon-audi-a6" est aussi une instance de la classe "voiture".

"Hélène Gonze" est une instance de la classe "personne humaine".

Une classe reflète une généralité, une abstraction. Ses instances sont concrètes. Cette distinction hérite de celle formulée par platon entre abstraction et concrétion. Retour aux attributs

Ici nous devons bien distinguer:

Une classe possède des attributs

   la classe "voiture" possède l'attribut "moteur" la classe "voiture" possède l'attribut "propriétaire"
   la classe "personne humaine" possède l'attribut "nom" 

L'instance d'une classe possède pour un attribut une valeur, qui est un objet

   l'instance "ta-smart" de la classe "voiture" possède pour l'attribut "propriétaire", la valeur "Hélène Gonze", qui est bien un objet.

Références et langage réservé

Pour faire référence à des objets on leur donne un nom.

Nous avons appellé un certain objet "TaSmart", mais nous eussions pu l'appeler "la petite bagnole d'Hélène" ou "Arthur" ou encore "Le microbe routier de Lillois". Le choix des références (c'est à dire des noms) est libre, donc arbitraire. Mais il est commode d'utiliser des noms qui gardent un sens dans le langage naturel. Par exemple, donner à ta voiture le nom "SarahGonze" n'est pas interdit, mais cela ouvre la voie à de stupides confusions.

Et puis il y a quelque mots qui ont un sens très précis: ce sont "objet", "classe", "instance", "attribut",... (il y en a d'autres). Ceux là doivent être utilisés avec beaucoup de discipline.

Et puis il y a des conventions d'écriture. Pour référencer l'objet qui est la valeur de l'attribut d'un autre objet, on utilise la jonction "." (point).

Par exemple: TaSmart.propriétaire est une référence à l'objet qui est l'attribut propriétaire de l'objet "TaSmart". Il s'agit donc d'une autre référence à l'objet "HélèneGonze".

Tu devines alors ce que signifie : TaSmart.moteur.puissanceCC

En pensée OO, on manipule des objets et des attributs de cette manière.

Bien définir des classes et des attributs semble être un exercice évident. Il va de soi que l'on peut définir des classes en fonction du type de problème que l'on gère. Pour une université, "HélèneGonze" est enregistrée avec tous ses attributs dans la classe "étudiant". Par contre pour Apple, "HélèneGonze" est enregistrée avec de tout autres attributs dans la classe "consommateur".

Dans bien des cas, l'organisation des classes et attributs demande un profonde réflexion, et la nature même des choses y est reflétée. Bien comprendre la nature des choses revient à pouvoir en faire un bon modèle en pensée OO ! Héritage, sous-classe, sur-classe

"TaSmart" est une instance de "voiture".

Mais "TaSmart" est aussi une instance de "véhicule".

"VélodeCyril" aussi est une instance de véhicule. Et "MotoDeGeneviève" aussi est une instance de véhicule.

Il faut y mettre de l'ordre. Nous allons dire:

"Véhicule" est une classe d'objet (tout ce qui permet de se déplacer).

"Voiture" est une sous-classe de la classe véhicule".

"Bicycle" est une sous-classe de la classe "véhicule".

"Moto" et "Vélo" sont deux sous-classes de la classe "Bicycle".

Bien entendu, on pourrait ajouter, avion, planeur, train, voilier,... Comme on le devine, l'ensemble des sous-classes d'une classe donnée s'organise comme un arbre.

Bon. La classe véhicule possède un attribut "nombre-maximum-de-passager". Et ses sous-classes ("voiture", "moto", "train",....) ? Oui : les sous-classes d'une classe possèdent toujours tous les attributs de leur sur-classe. Un vélo possède bien l'attribut "nombre-maximum-de-passager", et le train aussi.

Voici comment résumer ce concept. On exprime:

   * "train" est une sous-classe de "véhicule".
   * "train" hérite de "véhicule" (ce qui signifie que la classe "train" reçoit en héritage tous les attributs de la classe "véhicule".
   * "véhicule" est une sur-classe de "train".

Mais maintenant, les choses peuvent devenir plus subtiles: la propriété "nombre-de-roues" est-elle une propriété de la classe véhicule, de la classe voiture ou de la classe vélo ???

Ici l'effort de modélisation prend forme. On voit qu'il serait utile de créer une classe intermédiaire "véhicule-roulant". "véhicule-roulant" est une sous-classe de "véhicule". "voiture", "camion", "vélo" et "moto" semblent des sous-classes de "véhicule-roulant", avec peut-être des classes intermédiaires...

L'effort de pensée OO, l'effort de modélisation consiste à définir de manière satisfaisante une famille de classes et leurs propriétés respectives, en prenant bien en compte le mécanisme d'héritage des propriétés. Classe finale

Une classe final est une classe qui ne peut plus avoir de sous-classe. Il s'agit en général d'objets simples, qui ne nécessitent pas pour leur description l'intervention de propriétés complexes.

Par exemple "nombre-entier" est une classe finale. Classe ancestrale

Il y a une et une seule classe qui est la sur-classe de toutes les autres. C'est la classe "objet". Elle ne possède aucun attribut particulier (sauf aux yeux pervers des informaticiens). Classe abstraite

Toutes les classes peuvent donner lieu à des instances... ?

Toutes sauf les classes abstraites. Une classe abstraite n'est pas instanciable.

Ainsi, nous pouvons considérer que "vélo" et "moto" sont deux sous-classes d'une classe "véhicule-bi-cycle". La classe "vélo" et la classe "moto" sont instanciables : il existe des vélos et des motos. Quant à la classe "véhicule-bi-cycle", elle possède de fait des attributs (telles que "taille-du-guidon", ou "diamètre des roues"...), mais elle n'est pas instanciable. En effet ses instances ne peuvent être que des motos ou des vélos, c'est à dire en fait des instances des deux sous-classes. Méthodes

Tout ce qui précède est descriptif et statique. Cependant dans la réalité, les modèles O-O doivent permettre (1) d'obtenir des informations sur les objets et (2) de modifier le comportement des objets.

Ceci se fait au moyen de méthodes passives et actives.

Voyons toujours l'objet "TaSmart"... Voici quelques méthodes passives, qui s'intéressent à l'état instantané de ta voiture.

   * TaSmart.vitesse()
   * TaSmart.latitude()
   * TaSmart.longitude()
   * TaSmart.contenuDuRéservoir()

Ces méthodes passives (informatives) sont définies comme caractéristiques non pas d'un objet instancié ("TaSmart"), mais bien de la classe "voiture". Si l'on fait appel à ces méthodes informatives à différents moments, elles renvoient des résultats différents (par exemple TaSmart.vitesse()). Dans les exemples ci-dessus les méthodes informatives renvoient comme résultats des nombres, c'est à dire des objets simples. Mais on peu en imaginer de plus subtiles:

   * TaSmart.dateDuDernierLavage()
   * TaSmart.voitureQuiPrécède()

Ces deux méthodes informatives-ci renvoient respectivement un objet de classe "date" et un objet de classe "voiture".

On voit que la pensée OO mène à un formalisme sympathique

   Si TaSmart.vitesse() > TaSmart.rueVisitée().vitesseAutorisée ....

A coté des méthodes passives (informatives), il y a les méthodes actives. En voici quelques unes, telles que définies au niveau d'une classe:

   * voiture.accélérer()
   * voiture.freiner()
   * vélo.guidon.pencher()
   * moto.frein.appuyer()

Ces méthodes-ci ont pour effet de changer l'état ou le comportement de l'objet ciblé.

Les mécanismes d'héritage définis pour les attributs sont également valables pour les méthodes passives et actives. Dans une sous-classe on dispose de toutes les méthodes définies dans ses sur.classes. Ainsi, si "vitesse()" et "accélérer()" sont des méthode de la classe "véhicule" alors elles sont utilisables dans toutes les sous-classes définies sous "véhicule". Conclusion

Ce qui précède n'est qu'une brève introduction aux principaux concepts de la pensée OO, mais il doit permettre d'en deviner la saveur. La pensée OO est un paradigme omniprésent pour les techniciens de l'informatique et des sciences. Mais elle peut être rendue accessible à tous, et sa fécondité touche à tous les domaines de réflexion, de business et d'action.

C'est aussi une paradigme qui constitue à la fois un intermédiaire et un dépassement de la pensée structurante verbale et de la pensée structurante formelle.

A ce titre elle deviendra un must pour les esprits éclairés du XXIème siècle. Et peut être même pour mes enfants..

Juillet 2008- Philippe Gonze

[Les notes qui suivent sont destinées à alimenter un cours particulier donné à ma fille Hélène.] Contexte

La pensée orientée objet est à ce jour et selon mon expérience la plus puissante et la plus féconde pour

   * énoncer
   * traiter

une vaste catégorie de problèmes

   * scientifiques
   * opérationnels
   * business

Comme elle ne fait pas l'objet d'une formation structurée, il m'a paru utile de te la présenter, de la comparer à ses "compétiteurs", d'en appréhender la puissance et les limites. La pensée humaine

Sans entrer dans de vastes allées philosophiques, la pensée humaine peut être au plus niveau classée en trois groupes.

  1. La pensée émotionnelle est résolument subjective et peuple notre cerveau dans une partie majeure de notre vie. La pensée émotionnelle est ancrée dans notre animalité. Elle gère la compétition, les formes de stress, les formes de désir et de plaisir, la reproduction, l'alimentation et tout ce qui peut caractériser le comportement basique de notre espèce. Par ailleurs si une forme de pensée pouvait être prêtée à d'autres espèces, ce serait la pensée émotionnelle.
  2. Lapensée fusionnelle et religieuse se construite sur des évidences d'autant plus fortes qu'elles sont indémontrables, et donc aussi subjectives qu'incontestables. La pensée fusionnelle est importante chez l'homme primitif. Elle guide ses choix et donne à sa vie le sens qui est souvent difficile à y déceler.
  3. La pensée structurante se veut objective. Elle souhaite traiter des connaissances incontestables. Elle se veut dynamique et incrémentale : ses résultats alimentent de nouvelles pistes de développements. Son contenu et ses résultats apportent la compréhension et la connaissance, mais rarement le sens.

C'est bien sûr à la catégorie de la pensée structurante qu'appartient le pensée orientée objet, mais elle n'est pas seule dans cette catégorie. La pensée structurante

La pensée structurante est probablement liée historiquement au "miracle grec". Il y eut certainement d'autres émergences de pensées structurantes en d'autres lieux et d'autres temps, mais pour nous occidentaux, les racines de la pensée structurante sont grecques.

A la pensée structurante il faut lier la démarche de modélisation. La démarche de modélisation consiste notamment à mettre deux espaces en perspectives. Le premier espace contient une réalité plus ou moins complexe, mais trop complexe pour être appréhendée immédiatement par notre intelligence. Le second espace contient un modèle, c'est à dire une projection de la réalité du premier espace. Le modèle présente l'avantage d'être plus facile à manipuler, à tester, à décrire.

Toutes les sciences sont construites comme des suites de modèles destinés à appréhender la réalité scientifique objective. L'optique, la mécanique newtonienne, la chimie moléculaire, la génétique, la mécanique quantique, la relativité,... tous sont des modèles. Mais des modèles sont aussi construits pour des aspects beaucoup plus spécialisés et anecdotiques de la réalité: on peut construire un modèle des marées lunaires, des mouvements du coude, de l'évolution des taux de change,... Dès qu'une réalité complexe est réduite par projection à un dispositif plus simple et plus intelligible, on parle d'un modèle.

   Note. Je suis ingénieur en mathématiques appliquées, mais au vu de mes productions, le titre d'"ingénieur en modèles" aurait été plus approprié. C'est une pensée que ne renierait pas mon estimé professeur J. Lefèvre, qui m'a donnée le goût de la modélisation et m'a formé à cette démarche... 
   Note.  Dans le mythe de la caverne, de Platon, les ombres de la réalité sont projetées devant les yeux faibles des enchaînés, qui n'ont du monde que ce modèle très limité. Il s'agit peut-être du plus bel ancêtre de toutes les démarches de modélisation.

La qualité de la pensée structurante (ou la qualité d'un modèle) se mesure à sa fécondité. Est déclarée féconde une pensée structurante (un modèle) qui permet de mieux comprendre la réalité approximée, et par exemple d'en prédire le comportement.

   Note. La trajectoire de Mercure est l'exemple historique de ce succès. Le modèle Newtonien en donnait une prédiction. Puis le modèle relativiste en donna une autre, significativement différente. Enfin l'expérience - le retour dans l'espace de la réalité - donna raison au second modèle. En construisant un modèle performant en terme de prédictions, Einstein assura le succès de son modèle, et les expériences concernant Mercure lui offrirent subitement une large notoriété.

Les deux pôles de la pensée structurante

Dans la pensée structurante, il y a de très nombreuses familles.

Elles sont organisées autour de deux pôles : le pôle verbal et le pôle formel.

Le pôle verbal relève du langage naturel.

Le pôle formel est lié à l'usage des langages formels. Pensée structurante verbale

Au départ la pensée structurante s'est développée de manière verbale. La connaissance du monde s'exprime au moyen des mots du langage naturel. C'est souvent laborieux et imprécis, mais pendant fort longtemps, c'était le seul matériel disponible.

Les philosophes grecs qui construisent leurs modèles de la nature sont les premiers champions de la modélisation, et ils ne peuvent s'appuyer que sur le pôle verbal.

   Note. Le succès du miracle grec s'appuie sur la puissance de la langue grecque. La puissance, la concision, la subtilité, et la forte structuration de cette langue morte demandent des efforts d'apprentissage particuliers, mais procurent - consciemment ou non - des rouages de pensées héritant des mêmes qualités. Les langues contemporaines, Français, Anglais, Espagnol,... ne possèdent qu'une infime part de cette structuration - parlée il y a 3000 ans !

Plus tard les démarches de sophistes, et la logique des syllogismes cherchent à construire une connaissance du monde sur une démarche systématique, mais celle-ci ne s'appuie toujours que sur le langage naturel. Elle sont donc victimes de toutes ses limitations : séquentialité, imprécisions, homonymies, synonymes, catégorisations approximatives....

Aujourd'hui encore, une bonne part de la connaissance du monde se construit et se transmet via le langage naturel. Le texte que vous lisez est écrit en langage naturel. Le médecin explique à son patient les rouages du corps et de la maladie par des mots, ceux là-mêmes qu'il a entendus lorsqu'il était étudiant.

   Note. C'est une caractéristique de la médecine. Le savoir médical s'organise, se construit, se transmet, se développe pour une part majeure en langage naturel. C'est pour cela peut-être que la médecine accède laborieusement au statut de science, et reste le plus souvent un art.

La pensée verbale peut être extrêmement élégante, diversifiée, féconde, L'enseignement du Latin et du Grec dans les écoles occidentales étaient précieux, et sa disparition coûte bien plus cher que ne le supposent les responsables de l'enseignement. La pensée verbale (et écrite) de ces deux langues mortes sont particulièrement structurantes. Les rouages qu'elles activent dans les cerveaux de ceux qui les apprennent deviennent puissant à force d'entraînement, et leur champs d'application sont bien plus diversifiés que ne le supposent ceux qui ne les ont pas essayé (et ceci n'a évidement rien à voir avec l'utilité très naïve que constitue la connaissance des racines des mots des langues occidentales et des noms scientifiques). Pensée structurante formelle

Comment décrire la trajectoire d'un astre ou d'une flèche ?

Comment décrire la forme d'une goutte d'eau ou d'une bulle de savon ?

Comment décrire l'évolution d'une population vivante ?

Ici le langage naturel est d'un faible secours : "courbe", "ellipse", "parabole", "solide de révolution", "exponentielle", "matrice" ne sont que des mots, et ils ne révèlent pas en tant que tels la richesse des concepts qu'ils abritent.

Il faut donc inventer d'autres langages pour représenter tout cela, pour en construire les définitions, les caractéristiques, les propriétés.

Pour décrire une ellipse, l'équation mathématique en dit mille fois davantage que le mot ellipse. Les caractéristiques et propriétés jaillissent au sein du nouveau langage.

Copernic, Newton, Paracelse, Mendeleïev, Mendel sont obligés d'inventer et de développer de nouveaux langages pour donner corps à leurs théories. Ces langages sont multiples:

   * le principal mais non le seul : le langage mathématique général
   * le langage chimique
   * le langage logique
   * le langage mathématique matriciel
   * le langage mathématique différentiel et intégral
   * etc...

Comme les langages naturels, ils sont prononçables et visualisables. Mais leur puissance s'exprime toujours à l'intérieur d'eux-mêmes: une démonstration d'algèbre existe par elle-même et dans le langage mathématique, indépendamment du fait qu'elle soit prononcée ou vue.

Dans le domaine scientifique, la fécondité de la pensée structurante formelle est omniprésente. La pensée formelle verbale n'yest plus qu'un ancêtre oublié, ou un serviteur occasionnel. Langages Informatiques

Mais l'histoire des langages a connu d'autres rebondissement, et effets boomerang !

L'invention des machines à calculer, puis des ordinateurs a permis de résoudre des problèmes pratiques innombrables. Les ordinateurs sont aujourd'hui plus nombreux que les humains sur notre planète ! Et à présent, les téléphones, les téléviseurs, les voitures, les appareils ménagers sont de plus en plus des ordinateurs spécialisés et dotés d'organes moteurs et récepteurs.

Mais comment se fait le dialogue entre le prescripteur (l'homme programmeur) et l'ordinateur (l'exécutant programmé) ? Il faut un langage. Les textes produits dans ce langage s'appellent programmes. Le langage des programmes informatiques doit posséder quelques propriétés vitales

   * Il doit être complet et précis. Il doit permettre d'exécuter toutes les instructions souhaitables.
   * Il ne doit tolérer aucune ambiguïté. En aucun cas l'exécutant de dispose de choix.
   * Il doit être lisible par l'exécutant, et de préférence par plusieurs exécutants. Au début de l'informatiqiue chaque type d'ordinateur avait son langage propre; ensuite les ordinateurs ont été conçus pour pouvoir tous comprendre et exécuter des programmes écrits dans des langages indépendants des ordinateurs). C'est le problème de la portabilité, qui n'est toujours pas résolu de manière satisfaisante.
   * Il doit être compréhensible par le prescripteur, et par ses successeurs en charge des mêmes programmes.

Ce dernier point paraît évident et naïf. IL N'EN EST RIEN. En effet, encore maintenant:

   * La plupart des programmes ne sont compréhensibles QUE par celui qui l'a écrit.
   * La plupart des programmes complexes ne sont même plus compréhensibles par les programmeurs qui les ont produits
   * La plupart des programmes actifs contiennent des problèmes (bugs) connus, répertoriés et acceptés.
   * La plupart des programmes actifs ne sont plus gérés par leurs auteurs.
   * La plupart des bugs ne sont pas corrigés, mais ils sont contournés.
   * Bien souvent, la résolution d'un bug induit l'insertion d'un ou plusieurs nouveaux bugs.

Le problème central des langages informatiques

Le problème majeur de l'informatique est donc devenu celui de la compréhensibilité des programmes. Ce problème s'articule autour de trois axes.

La complexité croissante des problèmes traités

La lisibilité des programmes par les auteurs et leurs successeurs

Le dialogue entre les informaticiens programmeurs et les humains qui, en amont des programmeurs, rédigent des spécifications de programmes.

A la lueur de ce qui précède, et à ce stade de l'article. Il est intéressant de classer le langage informatique et ses ambitions.

Le langage informatique est un hybride formel-verbal.

   *  Il se rapproche du langage formel par les propriétés suivantes : précis, complet, non ambigu
   *  Il se rapproche du langage naturel par ses formes, par son caractère séquentiel, par sa visibilité et sa prononçabilité.
   si (voiture.moteur.puissance > taxe.puissanceminimale) alors voiture.conducteur.payerTaxe()
   * Il bute sur des formes compréhensibilité, de réutilisabilité.
   * Il ne permet pas encore un dialogue efficace entre spécificateur et programmeur.

Pour progresser sur les deux derniers points supra, les spécialistes de l'informatique ont mis au point entre 1970 et actuellement les langages orientés objets. Langages orientés objets

Les langages orientés objets (OO) visent à rendre l'exercice de programmation plus productif.

Pour ce qui concerne les résultats, les langages orientés objets ont obtenu de facto un véritable triomphe.

   * 99% des programmes développés actuellement sont écrits en langage OO (qui se souvient de l'assembleur, du Fortran , du Cobol... ?)
   * la complexité des problèmes traités par les langages OO est infiniment supérieure à la complexité des programmes écrits précédemment
   * les programmes OO sont à peine inférieurs à leurs prédécesseurs en termes de performances (vitesse,...)
   * les programmes OO sont supérieurs à leurs prédécesseurs en termes de stabilité (résistance aux défaillances de programmation)

On peut dire que les langages OO relèvent de la pensée structurante, et qu'ils occupent une place intermédiaire entre pensée structurante verbale et pensée structurante formelle. D'un certaine manière les langages OO constitueraient la synthèse et le point de rencontre entre le verbal et le formel. Mais ils restent un langage trop limités à des spécialistes. Plus loin ce point sera rediscuté.

Dans les langages OO, l'accent est mis sur

   *
         o la lisibilité (ce que fait un programme doit être compréhensible en parcourant le programme)
         o la portabilité (un programme OO doit pouvoir tourner sans changement sur des ordinateurs divers, avec des systèmes opératoires (Windows, Linux, Solaris...) distincts)
         o la scalabilité (le même programme doit pouvoir tourner sur des machines de taille totalement différentes, depuis la montre jusqu'à la fusée spatiale).
         o la réutilisabilité (un objet bien défini dans un langage OO doit pouvoir ensuite être réutilisé dans d'autres programmes OO).

Cependant la limite reste la suivante : LE DIALOGUE ENTRE SPECIFICATEUR ET PROGRAMMEUR. Ce dialogue reste maladroit, ambigu, chargé d'imprécisions. Les spécificateurs se plaignent de n'être pas compris par les programmeurs. Les programmeurs se plaignent de voir dans les spécifications reçues des impossibilités, des confusions, des incohérences.

Le programmeur parle et comprend le langage OO. L'approche OO est puissante, universelle, féconde. Elle reprend et dépasse plusieurs points forts des meilleures pensées structurantes.

Comment la sortir du cadre des spécialistes programmeurs ? Pensée Orientée Objet

Pour développer leurs programmes OO, les programmeurs ont implicitement développé un mode de pensée OO, qui existe indépendemment des langages OO, qui est à la fois plus accessible, plus ordinaire et plus échangeable.

Cette pensée est moins contraignante et moins rigoureuse que l'utilisation des langages OO.

Mais

   * elle est accessible à tous
   * elle permettrait de grandement améliorer le dialogue entre programmeurs et spécificateurs. Elle constitue un pont entre langage OO et langage naturel.
   * elle offreen tant que pensée structurante une puissance incomparable
   * elle se prête à l'enseignement

Voici donc pour suivre les rudiments de la pensée structurante OO Concepts généraux de la pensée OO Objet

L'objet est l'entité basique. Ta voiture smart est un objet. Ma voiture audi a6 est un objet. Ce sont deux objets distincts. Il y a d'innombrables autre objets. Il faut imaginer un objet comme une entité concrète, mais ceci devra être nuancé. Attribut

Ta voiture smart a une couleur : grise.

Ma voiture audi a6 a une couleur : noire.

Ta voiture possède d'autres attributs (on pourrait dire "caractéristiques" ou "propriétés"). On pourrait mentionner:

   * attribut propriétaire : Hélène Gonze
   * attribut moteur : moteur Diesel 1100cc
   * attribut nombre-de-place : 2
   * attribut nombre-de-roues : 4
   * attribut constructeur : Smart
   * attribut année-de-construction : 1999
   * attribut type-de-boite : automatique
   * attribut longueur : 0.184m
   * attribut possède-GPS : faux
   * ...

Formellement, on dit "La valeur de l'attribut <longueur en m> pour l'objet smart-d'Hélène est l'objet <0.184>".

On voit que les attributs peuvent être très nombreux.

La valeur d'un attribut est toujours un autre objet. "0.184" est un objet. "2" est un objet. "automatique" est un objet. "moteur Diesel 1100cc" est un objet. "Hélène Gonze" est un objet (eh oui !).

L'objet "moteur Diesel 1100cc dans ta voiture smart" est encore un objet. Imaginons ses attributs:

   * attribut année-de-construction : 1999
   * attribut cylindrée en cc : 1100
   * attribut puissance en CV Fiscaux: 8
   * ...

Je te laisse deviner une liste d'attribut de l'objet "Hélène Gonze". Classe

Ta voiture smart et ma voiture a6 ont beaucoup en commun.

Ces deux objets appartiennent à la même classe.

La classe auxquels ils appartiennent est "voiture".

"Hélène Gonze" appartient à la classe "personne humaine".

Il y a d'innombrables classes d'objets.

La base de pensée OO est ici : un objet appartient à une classe ; une classe réunit un certain nombre d'objets qui lui appartiennent. Instance

En fait on le dit aussi différemment: "TaSmart" est une instance de la classe "voiture".

"Mon-audi-a6" est aussi une instance de la classe "voiture".

"Hélène Gonze" est une instance de la classe "personne humaine".

Une classe reflète une généralité, une abstraction. Ses instances sont concrètes. Cette distinction hérite de celle formulée par platon entre abstraction et concrétion. Retour aux attributs

Ici nous devons bien distinguer:

Une classe possède des attributs

   la classe "voiture" possède l'attribut "moteur" la classe "voiture" possède l'attribut "propriétaire"
   la classe "personne humaine" possède l'attribut "nom" 

L'instance d'une classe possède pour un attribut une valeur, qui est un objet

   l'instance "ta-smart" de la classe "voiture" possède pour l'attribut "propriétaire", la valeur "Hélène Gonze", qui est bien un objet.

Références et langage réservé

Pour faire référence à des objets on leur donne un nom.

Nous avons appellé un certain objet "TaSmart", mais nous eussions pu l'appeler "la petite bagnole d'Hélène" ou "Arthur" ou encore "Le microbe routier de Lillois". Le choix des références (c'est à dire des noms) est libre, donc arbitraire. Mais il est commode d'utiliser des noms qui gardent un sens dans le langage naturel. Par exemple, donner à ta voiture le nom "SarahGonze" n'est pas interdit, mais cela ouvre la voie à de stupides confusions.

Et puis il y a quelque mots qui ont un sens très précis: ce sont "objet", "classe", "instance", "attribut",... (il y en a d'autres). Ceux là doivent être utilisés avec beaucoup de discipline.

Et puis il y a des conventions d'écriture. Pour référencer l'objet qui est la valeur de l'attribut d'un autre objet, on utilise la jonction "." (point).

Par exemple: TaSmart.propriétaire est une référence à l'objet qui est l'attribut propriétaire de l'objet "TaSmart". Il s'agit donc d'une autre référence à l'objet "HélèneGonze".

Tu devines alors ce que signifie : TaSmart.moteur.puissanceCC

En pensée OO, on manipule des objets et des attributs de cette manière.

Bien définir des classes et des attributs semble être un exercice évident. Il va de soi que l'on peut définir des classes en fonction du type de problème que l'on gère. Pour une université, "HélèneGonze" est enregistrée avec tous ses attributs dans la classe "étudiant". Par contre pour Apple, "HélèneGonze" est enregistrée avec de tout autres attributs dans la classe "consommateur".

Dans bien des cas, l'organisation des classes et attributs demande un profonde réflexion, et la nature même des choses y est reflétée. Bien comprendre la nature des choses revient à pouvoir en faire un bon modèle en pensée OO ! Héritage, sous-classe, sur-classe

"TaSmart" est une instance de "voiture".

Mais "TaSmart" est aussi une instance de "véhicule".

"VélodeCyril" aussi est une instance de véhicule. Et "MotoDeGeneviève" aussi est une instance de véhicule.

Il faut y mettre de l'ordre. Nous allons dire:

"Véhicule" est une classe d'objet (tout ce qui permet de se déplacer).

"Voiture" est une sous-classe de la classe véhicule".

"Bicycle" est une sous-classe de la classe "véhicule".

"Moto" et "Vélo" sont deux sous-classes de la classe "Bicycle".

Bien entendu, on pourrait ajouter, avion, planeur, train, voilier,... Comme on le devine, l'ensemble des sous-classes d'une classe donnée s'organise comme un arbre.

Bon. La classe véhicule possède un attribut "nombre-maximum-de-passager". Et ses sous-classes ("voiture", "moto", "train",....) ? Oui : les sous-classes d'une classe possèdent toujours tous les attributs de leur sur-classe. Un vélo possède bien l'attribut "nombre-maximum-de-passager", et le train aussi.

Voici comment résumer ce concept. On exprime:

   * "train" est une sous-classe de "véhicule".
   * "train" hérite de "véhicule" (ce qui signifie que la classe "train" reçoit en héritage tous les attributs de la classe "véhicule".
   * "véhicule" est une sur-classe de "train".

Mais maintenant, les choses peuvent devenir plus subtiles: la propriété "nombre-de-roues" est-elle une propriété de la classe véhicule, de la classe voiture ou de la classe vélo ???

Ici l'effort de modélisation prend forme. On voit qu'il serait utile de créer une classe intermédiaire "véhicule-roulant". "véhicule-roulant" est une sous-classe de "véhicule". "voiture", "camion", "vélo" et "moto" semblent des sous-classes de "véhicule-roulant", avec peut-être des classes intermédiaires...

L'effort de pensée OO, l'effort de modélisation consiste à définir de manière satisfaisante une famille de classes et leurs propriétés respectives, en prenant bien en compte le mécanisme d'héritage des propriétés. Classe finale

Une classe final est une classe qui ne peut plus avoir de sous-classe. Il s'agit en général d'objets simples, qui ne nécessitent pas pour leur description l'intervention de propriétés complexes.

Par exemple "nombre-entier" est une classe finale. Classe ancestrale

Il y a une et une seule classe qui est la sur-classe de toutes les autres. C'est la classe "objet". Elle ne possède aucun attribut particulier (sauf aux yeux pervers des informaticiens). Classe abstraite

Toutes les classes peuvent donner lieu à des instances... ?

Toutes sauf les classes abstraites. Une classe abstraite n'est pas instanciable.

Ainsi, nous pouvons considérer que "vélo" et "moto" sont deux sous-classes d'une classe "véhicule-bi-cycle". La classe "vélo" et la classe "moto" sont instanciables : il existe des vélos et des motos. Quant à la classe "véhicule-bi-cycle", elle possède de fait des attributs (telles que "taille-du-guidon", ou "diamètre des roues"...), mais elle n'est pas instanciable. En effet ses instances ne peuvent être que des motos ou des vélos, c'est à dire en fait des instances des deux sous-classes. Méthodes

Tout ce qui précède est descriptif et statique. Cependant dans la réalité, les modèles O-O doivent permettre (1) d'obtenir des informations sur les objets et (2) de modifier le comportement des objets.

Ceci se fait au moyen de méthodes passives et actives.

Voyons toujours l'objet "TaSmart"... Voici quelques méthodes passives, qui s'intéressent à l'état instantané de ta voiture.

   * TaSmart.vitesse()
   * TaSmart.latitude()
   * TaSmart.longitude()
   * TaSmart.contenuDuRéservoir()

Ces méthodes passives (informatives) sont définies comme caractéristiques non pas d'un objet instancié ("TaSmart"), mais bien de la classe "voiture". Si l'on fait appel à ces méthodes informatives à différents moments, elles renvoient des résultats différents (par exemple TaSmart.vitesse()). Dans les exemples ci-dessus les méthodes informatives renvoient comme résultats des nombres, c'est à dire des objets simples. Mais on peu en imaginer de plus subtiles:

   * TaSmart.dateDuDernierLavage()
   * TaSmart.voitureQuiPrécède()

Ces deux méthodes informatives-ci renvoient respectivement un objet de classe "date" et un objet de classe "voiture".

On voit que la pensée OO mène à un formalisme sympathique

   Si TaSmart.vitesse() > TaSmart.rueVisitée().vitesseAutorisée ....

A coté des méthodes passives (informatives), il y a les méthodes actives. En voici quelques unes, telles que définies au niveau d'une classe:

   * voiture.accélérer()
   * voiture.freiner()
   * vélo.guidon.pencher()
   * moto.frein.appuyer()

Ces méthodes-ci ont pour effet de changer l'état ou le comportement de l'objet ciblé.

Les mécanismes d'héritage définis pour les attributs sont également valables pour les méthodes passives et actives. Dans une sous-classe on dispose de toutes les méthodes définies dans ses sur.classes. Ainsi, si "vitesse()" et "accélérer()" sont des méthode de la classe "véhicule" alors elles sont utilisables dans toutes les sous-classes définies sous "véhicule". Conclusion

Ce qui précède n'est qu'une brève introduction aux principaux concepts de la pensée OO, mais il doit permettre d'en deviner la saveur. La pensée OO est un paradigme omniprésent pour les techniciens de l'informatique et des sciences. Mais elle peut être rendue accessible à tous, et sa fécondité touche à tous les domaines de réflexion, de business et d'action.

C'est aussi une paradigme qui constitue à la fois un intermédiaire et un dépassement de la pensée structurante verbale et de la pensée structurante formelle.

A ce titre elle deviendra un must pour les esprits éclairés du XXIème siècle. Et peut être même pour mes enfants...

Modèle:XT