La naissance de la programmation orientée objet
Les débuts de la programmation
Aux tout débuts de l’informatique, le fonctionnement interne des processeurs imposait la manière de programmer un ordinateur. La mise au point d’algorithmes complexes a obligé les informaticiens à effectuer un premier saut dans l’abstraction, en inventant un style de langage dit « procédural » (comme le C, ou le Python). Les codes écrits dans ces langages sont devenus indépendants des instructions élémentaires propres à chaque type de processeur. Il est cependant nécessaire d’employer une opération de traduction, dite de compilation, pour transformer le programme écrit dans ces langages en des instructions élémentaires comprises par le processeur.
Le programmeur se trouve ainsi libéré des détails d’implémentation en code machine et peut se concentrer sur la logique du problème. Cette première étape dans l’abstraction montre deux avantages :
- Une facilité d’écriture et de résolution algorithmique.
- Une indépendance par rapport aux différents types de processeurs.
Avec le temps, les problèmes à affronter gagnaient en complexité. Il est alors devenu vital d’inventer des mécanismes simples à mettre en œuvre pour réduire cette complexité et rapprocher encore plus des manières humaines de poser et résoudre les problèmes. Tout cela mis ensemble (la distanciation par rapport au fonctionnement du processeur, le rapprochement la programmation du mode humain de résolution de problème, le découpage des problèmes en sous problème comme méthode de simplification des systèmes) conduisit graduellement à un deuxième type de langages de programmation: les langages orientés objets (C++, C#, Java, Python, …)
L’aube de l’orienté objet
Un programme écrit dans un langage objet répartit l’effort de la résolution de problèmes sur un ensemble d’objets. Chaque objet se décrit par un ensemble d’attributs (partie statique) et de méthodes portant sur ces attributs (partie dynamique). Certains de ces attributs peuvent être l’adresse des objets avec lesquels ils coopèrent. Il leur est alors possible de déléguer certaines des tâches à leurs collaborateurs.
En POO (programmation orienté objet), les opérations respectent le principe de distribution des responsabilités. Chaque objet s’occupe de ses propres attributs. Lorsqu’un objet souhaite modifier les attributs d’un autre, il demande à cet autre objet d’effectuer cette tâche. En effet, chaque objet expose à ses interlocuteurs un mode d’emploi limité aux seuls services qu’il est apte à assurer.
Cette méthode de programmation est fortement modulaire. Si l’on respecte ses principes de confinement, cette méthode favorise la stabilité des développements. En effet, elle limite au maximum les conséquences de modifications apportées au code au cours du temps. C’est-à-dire que seuls les objets concernés sont modifiés. Leurs interlocuteurs ne sont donc pas impactées, même si le comportement de ces derniers dépend des fonctionnalités affectées.
Les problèmes du quotidien de l’industrie du logiciel ont permis d’enrichir la syntaxe de ces nouveaux langages. La complexité accrue des logiciels ont ainsi fait apparaitre de nouveaux concepts. Par exemple, la programmation orientée objet permet de concevoir l’organisation des programmes sous une forme d’une hiérarchie. L’objet le plus haut dans la hiérarchie est le plus générique possible, alors que celui tout en bas est le plus spécialisé. Cette organisation modulaire assure par conséquent la simplification de la programmation d’une part, grâce à l’une économie d’écriture et de l’autre à la création de zones de code aux modifications confinées.
Dans un programme imposant, l’OO aide à tracer les pointillés que les ciseaux doivent suivre là où il semble le plus naturel de les tracer : au niveau du cou, des épaules ou de la ceinture, et non pas au niveau des sourcils, des biceps ou des mollets. Cette pratique de la POO incite à cette découpe suivant deux dimensions :
- horizontalement : les classes se déléguant mutuellement un ensemble de services
- verticalement : les classes héritant entre elles d’attributs et de méthodes installés à différents niveaux d’une hiérarchie.
Écrire de l’objet
Il faut savoir que toute la programmation des parties active des classes (les méthodes) reste totalement soumis aux mécanismes des langages classiques. On y rencontre des variables, des arguments, des conditions, des boucles, … L’OO vient plutôt compléter le procédural, en lui superposant un système de découpe.
L’effet de cette couche additionnelle ne se limite pas à quelques structures de données supplémentaires afin de mieux organiser les informations manipulées par le programme. Il va bien au-delà. C’est toute une manière de concevoir un programme et la répartition de ses parties fonctionnelles qui est en jeu. Les fonctions et les données ne sont plus d’un seul et gros programme, mais éclatées en un ensemble de modules reprenant chacun une sous-partie de ces données et les seules fonctions qui les manipulent.
Ainsi, il faut alors réapprendre à programmer en s’essayant au développement d’une succession de petit programme au couplage faible, mais avec une cohésion forte. En découpant 1 000 lignes de code en 10 modules de 100 lignes, le gain est bien plus que linéaire, car il est beaucoup plus simple de programmer 100 lignes plutôt que 1 000.
Ces dernières années l’orienté objet s’est trouvé à l’origine d’une explosion de technologies différentes, mais toutes intégrant à leur manière ses mécanismes de base : classes, objets, envois de messages, héritage, encapsulation, polymorphisme… Ainsi sont apparus de nombreux langages de programmation proposant des syntaxes dont les différences sont soit purement cosmétiques, soit plus subtiles.
L’OO a également conduit à repenser les bases les plus importantes de l’informatique de ces deux dernières décennies :
- Le développement d’une méthode de modélisation standardisée (UML)
- Les applications informatiques distribuées (RPC)
- Le stockage des données (DAO, LinQ, …)
À chaque fois, c’est plus qu’un changement de vocabulaire, c’est un changement de mentalité et de culture qui s’impose.