Jusqu’ici, les programmes que vous avez écrits ont été réalisés en programmation impérative : ils étaient constitués d'instructions qui se succédaient les unes après les autres, dans l'ordre où vous les aviez placées dans le code.
Une variante de la programmation impérative, et que vous avez aussi utilisée, est la programmation procédurale : chaque programme a été décomposé en plusieurs fonctions réalisant des tâches simples.
En programmation procédurale, ce sont les fonctions qui sont au coeur du programme ; elles s'appliquent à modifier des données.
Lorsque plusieurs programmeurs travaillent simultanément sur un gros projet, pour éviter les conflits entre les fonctions codées par chacuns, à partir des années 60, on a imaginé une programmation orientée objet, la POO.
En programmation orientée objet, ce sont les données qui sont au coeur du programme : celles-ci vont désormais être protégées et c'est le développeur qui décide comment elles seront créees, accessibles, modifiées, ...
Le premier langage de programmation initiant une forme de programmation orientée objet fut Simula, créé à partir de 1962. Ce langage servait à faciliter la programmation de logiciels de simulation. Le premier langage de programmation réellement fondé sur la programmation orientée objet fut Smalltalk 71, créé au début des années 70.
De très nombreux langages actuels fournissent les concepts de la POO, mais n'obligent cependant pas à l'utiliser; c'est le cas de Python par exemple.
La POO n'est pas un nouveau "langage" de programmation à apprendre; c'est une autre façon d'aborder la conception d'un programme et de le coder, on parle d'un paradigme de programmation.
En appliquant la POO, vous allez pouvoir désormais définir vos propres objets informatiques en précisant leurs types, leurs propriétés et les fonctionnalités agissant dessus....
Comme M.Jourdain faisait de la prose sans le savoir, vous avez déjà utilisé l'an passé la programmation objet.
Regardons par exemple comment est programmée la fonction randint()
de la bibliothèque random
:
import random
import inspect
print(inspect.getsource(random.randint))
Excepté la présence d'un self surprenant (randint n'ayant besoin que de 2 paramètres a et b), rien de nouveau, on voit la définition d'une fonction très courte...
Inspectons maintenant tout le code de la bibliothèque random, on constate la présence de mots-clés comme class, une fonction init et si vous chercher bien on y retrouve la fonction randint... mais inclue dans la définition de la classe...
Cette façon d'organiser du code appartient à la POO !
Alors en Python tout serait objet ?
print(inspect.getsource(random))
Lire et faire les activités de la page La programmation orientée objet proposée par David ROCHE en insérant des cellules de code ci-dessous, puis répondre aux questions suivantes :
class Personnage:
pass
gollum = personnage()
bilbo = personnage()
# ...
- les nouveaux types (structures) de données que l'on définit : ...
- les représentants de ces nouveaux types : ...
- les variables (caractéristiques) liées à ces nouveaux types : ...
- les fonctions (comportement) propres à ces nouveaux types : ...
- l'encapsulation :
- un constructeur :
- un accesseur :
- un mutateur :
Le but est de définir une classe CompteBancaire qui permette :
Ces objets "compte" auront deux attributs : nom (= titulaire du compte) et solde (= argent sur le compte) ;
de connaître le nom du titulaire d'un compte, ainsi que la somme présente sur ce compte ;
de gérer les transferts d'argent sur le compte en "sécurité" et même de créer une méthode "protégée" pour pirater un compte.
Créez la classe CompteBancaire.
Créez le constructeur de cette classe en faisant en sorte qu'un nouveau compte s'ouvre par défaut avec 0 euro dessus.
Créez les accesseurs à chacun des deux attributs des objets de la classe.
Créez un mutateur privé qui permet de faire évoluer la somme placée sur un compte de variation euros.
Rajoutez à ce mutateur un test qui permet d'afficher un message si le compte est à découvert à l'issue de la modification.
Créez une méthode depot qui utilise le mutateur privé précédent pour ajouter une certaine somme sur un compte bancaire.
Créez une méthode retrait qui utilise le mutateur privé précédent pour retirer une certaine somme sur un compte bancaire.
Testez cette méthode retrait de sorte qu'un compte passe dans le négatif. Est-ce que l'affichage prévu dans le mutateur privé gérant l'attribut solde s'affiche lors de l'utilisation de cette méthode publique ?
Créez une méthode afficher qui affiche le nom du titualire et le solde de son compte.
Créez un mutateur privé qui permette de changer le nom du titulaire.
Créez une méthode protégée _pirater qui utilise le mutateur précédent et qui permet de changer le nom du titulaire d'un compte bancaire.
Utilisez cette méthode _pirater pour vous attribuer un compte bancaire.
Utiliser l'instruction help(CompteBancaire) afin de visualiser l'ensemble des méthodes visibles facilement par l'utilisateur du code.
Un client peut-il facilement être au courant de la présence de cette méthode protégée _pirater ?
Contenus | Capacités attendues | Commentaires |
---|---|---|
Vocabulaire de la programmation objet : classes, attributs, méthodes, objets. | Écrire la définition d’une classe. Accéder aux attributs et méthodes d’une classe. |
On n’aborde pas ici tous les aspects de la programmation objet comme le polymorphisme et l’héritage. |
Contenus | Capacités attendues | Commentaires |
---|---|---|
Paradigmes de programmation. | Distinguer sur des exemples les paradigmes impératif, fonctionnel et objet. Choisir le paradigme de programmation selon le champ d’application d’un programme. |
Avec un même langage de programmation, on peut utiliser des paradigmes différents. Dans un même programme, on peut utiliser des paradigmes différents. |
Ce document, basé sur le travail de David ROCHE et d'autres ressources listées plus haut, est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
Pour toute question, suggestion ou commentaire : eric.madec@ecmorlaix.fr