Un bref historique
-
- Simula
- Créé en 1962 par Ole-Johan Dahl et Kristen Nygaard
- Langage de simulation
- Basé sur Algol60, un langage procédural utilisé dans les années 1960
- L’invention du concept objet par accident
- L’objectif du langage était de simuler des objets de la vie réelle.
- Même s’il s’agit du premier langage objet, son implémentation objet est chaotique et mal structurée.
- Smalltalk
- Créé en 1972 par Alan Kay, Dan Ingals, Ted Kaehler, Adele Goldberg
- L’objectif du langage est la transmission de message entre instances d’objet.
- Basé sur Simula
- Langage par prototype.
- Alan Kay est souvent considéré comme un des pères de la programmation orientée objet 2.
- C++
- Créé en 1983 par Bjarne Stroustrup
- Évolution orientée objet du langage C
- Structure objet puissante, mais mal structurée.
- Certains programmeurs C++ se réfugient dans les « template » C++ pour éviter les problèmes que peut poser la structure objet C++.
- Certains programmeurs évitent d’utiliser certains concepts objet C++ (par exemple, l’héritage multiple) afin d’éviter les problèmes que peut poser la structure objet C++
- Eiffel
- Créer en 1986 par Bertrand Meyer
- les langages orientés objet de l’époque étaient souvent mal structurés et malgré que beaucoup de bonnes idées ressortaient, le domaine était pour le moins, chaotique.
- Bertrand Meyer, un chercheur en développement logiciel, écrivit un livre sur le développement de langage orienté objet:
- Object-Oriented Software Construction
- Aucun langage à l’époque ne permettait de gérer tous les concepts objets présentés dans le livre;
- Bretrand Meyer a donc inventé un langage théorique (à l’époque) qui lui permettrait de donner les démonstration et exemple nécessaire dans son livre.
- Bertrand Meyer est également considéré comme un des pères de la programmation orientée objet.
- Java:
- Créé en 1996 par Sun Microsystem.
- L’objectif était de créer des programmes orientés objet pour le Web
- Contrairement aux langages orientés objet de l’époque (C++, Ada, Pascal, etc.), Java obligeait l’utilisation de l’orientée objet dans la création de code.
- Malgré qu’il n’a apporté aucune évolution aux mécaniques objets, java a grandement participé à l’intérêt des développeurs pour les technologies objet.
- Simula
Quelques définitions
-
- On appelle instance la représentation en mémoire d’un ensemble de donnée;
- On appelle instanciation le fait réserver un espace mémoire et d’y copier des données.
- On appelle routine, un mécanisme de programmation qui encapsule une portion de code qui effectue un traitement spécifique.
- On nomme appel le fait d’exécuter une routine;
- Lors d’un appel de routine, la routine appelante est la routine ayant lancé l’exécution d’une autre routine;
- Lors d’un appel de routine, la routine appelée est la routine doit être exécutée;
- On appelle variable locale les données uniquement accessibles à l’intérieur d’une routine;
- On dit qu’on a un effet de bord lorsque durant l’exécution d’une routine, l’état du système a été modifié. Cela arrive lorsqu’une routine effectue une entrée/sortit ou modifie une variable non locale et ne replace pas le résultat de cette modification à son état initial.
- Une fonction est une routine qui a pour travail de retourner une valeur à la routine appelante;
- En général, une fonction devrait éviter de causer des effets de bord;
- On appelle fonction pure, une fonction ne faisant pas d’effet de bord;
- Une procédure est une routine qui ne retourne aucune valeur de retour. Ce type de routine sert à modifier l’état du système par effet de bord.
- On appelle instance la représentation en mémoire d’un ensemble de donnée;
Un objet
Un objet est une représentation abstraite d’une instance mémoire permettant de regrouper des informations reliées entre elles par des liens logiques et des mécanismes permettant la manipulation de ces informations.
Comparaison avec la programmation procédurale
Comme on peut le constater dans la définition, la programmation orientée objet met de l’avant les informations avant les mécanismes. Il s’agit du changement de paradigme majeur par rapport à la programmation procédurale.
Les différents types de langages objet
Il existe deux (2) grandes catégories de langage objet:
-
- Les langages orientés objet par classes:
- En général, les langages procéduraux ont évolué en langage orientée objet par classe.
- Parmi ces langages, on retrouve:
- Java
- C#
- Eiffel
- Pascal Objet
- Python
- PHP
- etc.
- Les langages orientés objet par prototype:
- En général, ce sont les langages fonctionnels qui ont évolué en langage par prototype.
- Parmi ces langages, on retrouve:
- Javascript
- LISP
- Scheme
- Haskell
- Ocaml
- Smalltalk
- etc.
- Les langages orientés objet par classes:
Les langages objet par prototypes
Dans le cadre du cours, nous travaillerons avec des langages par classes. J’aimerais donc prendre un moment pour parler des langages objet par prototype. Dans ce type de langages:
-
- Les objets sont entièrement créés par clonage (copie intégrale d’autres objets);
- Les prototypes sont créés en clonant un objet de base du langage (un objet sans méthodes ni attributs);
- Pour créer les instances différentes d’un type d’objet (par exemple, client, facture, etc.), on clone le prototype;
- L’héritage est créé en générant un nouveau prototype, en clonant le prototype ancêtre;
- Ce type de langage utilise généralement le « Duck Typing », ce qui permet d’une certaine manière, le polymorphisme sans utiliser de méthode abstraite.
- Le « Duck Typing » est une mécanique de langage permettant de valider l’utilisation d’une méthode ou d’un attribut, sans avoir à typer la variable;
- L’idée est que l’interpréteur de langage regarde si l’objet contient la méthode, à l’exécution, et si ce n’est pas le cas, lance une exception;
- L’utilisation du « Duck typing » est généralement réservée aux langages interprétés.
Voici un exemple de code objet écrit en Javascript qui utilise la mécanique de prototype:
function Personne(aNom, aAge) {
this.nom = aNom;
this.age = aAge;
}
Personne.prototype.bonjour = function() {
alert("Bonjour. Mon nom est " + this.nom + " et mon age est " +
this.age +" ans.");
}
function Enseignant(aNom, aAge, aCours) {
Personne.call(this, aNom, aAge);
this.cours = aCours;
}
Enseignant.prototype = Object.create(Personne.prototype);
Enseignant.prototype.constructor = Enseignant;
Enseignant.prototype.bonjour = function() {
alert("Bonjour. Mon nom est " + this.nom + " et mon age est " +
this.age + " ans.\n Je suis enseignant du cours de " +
this.cours + ".");
}
chuck = new Personne("Chuck", 40);
chuck.bonjour();
louis = new Enseignant("Louis", 30, "Programmation orientée objet 2");
louis.bonjour();
Il est à noter que des mécaniques de programmation orientée objet par classe ont été ajoutées dans les versions récentes de Javascript.
Auteur: Louis Marchand
Sauf pour les sections spécifiées autrement, ce travail est sous licence Creative Commons Attribution 4.0 International.