1.19k likes | 1.33k Views
Introduction à la Programmation par Objets avec Smalltalk. Noury Bouraqadi http://csl.ensm-douai.fr/noury Option ISIC – 1ère année Ecole des Mines de Douai. Concepts fondamentaux. Objet Encapsulation Messages Polymorphisme Identité / égalité Classes Instances
E N D
Introduction à laProgrammation par Objetsavec Smalltalk Noury Bouraqadi http://csl.ensm-douai.fr/noury Option ISIC – 1ère année Ecole des Mines de Douai
Concepts fondamentaux • Objet • Encapsulation • Messages • Polymorphisme • Identité / égalité • Classes • Instances • Création et initialisation d'objets • Champs • Méthodes • Héritage • Sous-classe / Super-classe • Redéfinition • Liaison dynamique • Exceptions
Objet • Objet = représentation informatique d'une entité du monde • Pas de fossé entre réalité et programme • Programme à base d'objet = simulation de la réalité • Exemples : • Une lampe • Un feu tricolore • Une voiture • Un nombre • Un caractère • Un tableau d'entiers • Une couleur
L'ensemble des message acceptés par un objet est fini Utiliser un objet = lui envoyer un message 1) Message 2) Traitement 3) Résultat
allumer l'heure? éteindre Exemple de messages
remplacer couleur par : vert allumer Messages avec 0, 1 ou plusieurs arguments
déclaration de variables temporaires envois de messages affectation commentaires Variables et références d'objets • Variables stockent des référencent d'objets • Les références sont analogues aux pointeurs du langage C • Affectation = obtention d'une référence sur le même objet • Exemple : | x y | "affection à x de la référence d'un objet lampe" x allumer. "la lampe s'allume" y := x. y eteindre. "la lampe s'éteint"
|x y| • Toute variable nouvellement déclarée est • initialisée avec la référence de l'objet nil. • nil ne sais répondre à quasiment aucun • message = erreur si utilisation nil
allumer x allumer nil
éteindre y éteindre
éteindre y éteindre
Un objet possède une mémoire • Qu'est-ce que la mémoire d'un objet ? • Une suite de variables appelées champs • Qu'est ce qui est mémorisé ? • des données = références vers d'autres objets • Qui a accès à la mémoire d'un objet ? • L'objet lui-même uniquement • Les données sont privées (Encapsulation) • Quand a lieu l'accès à la mémoire ? • Lors des traitements des messages
remplacer couleur par : vert Accès à la mémoire d'un objet
remplacer couleur par : vert Accès à la mémoire d'un objet
remplacer couleur par : vert OK Accès à la mémoire d'un objet
couleur ? vert Accès à la mémoire d'un objet
Traitements effectués par un objet • Traitements en réponse à un message uniquement • Méthodes : Analogie avec les fonctions • Types de traitements possibles : • Modifier le contenu de la mémoire • Lire le contenu de la mémoire • Créer de nouveaux objets • Envoyer des messages à d'autres objets • Messages envoyés lors des traitements • arguments des messages • valeurs temporaires • extraits de la mémoire de l'objet (champs)
allumer lampe suivante Exemple de traitements
éteindre lampe courante • déterminer lampe suivante • mémoriser nouvelle lampe courante • allumer nouvelle lampe courante allumer lampe suivante Exemple de traitements
Pseudo-Variable. Référence l'objet qui exécute le traitement Traitements en réponse au messageallumerLampeSuivante "1. éteindre la lampe courante" lampeCourante eteindre. "2. déterminer la lampe suivante (message envoyé à self)" "3. mémoriser la nouvelle lampe courante (affectation)" lampeCourante := self trouverLampeSuivante. "allumer la nouvelle lampe courante" lampeCourante allumer.
allumer lampe suivante éteindre lampeCourante eteindre
allumer lampe suivante éteindre lampeCourante eteindre
allumer lampe suivante self trouverLampeSuivante trouver lampe suivante
allumer lampe suivante lampeCourante := self trouverLampeSuivante
allumer lampe suivante allumer lampeCourante allumer
allumer lampe suivante allumer lampeCourante allumer
Récapitulatif sur la notion objet • Un objet possède une référence • Stockée dans les variables et les champs • Un objet possède des champs • Mémoire privée (encapsulation) • Seul l'objet peut accéder à sa propre mémoire • Les champs contiennent des références d'autres objets • Un objet sait répondre à un ensemble de messages • Réponse à message = exécution d'une méthode • Retour du résultat de l'exécution de la méthode
Objets de la même famille • Même famille = des points commun • Savent répondre au même ensemble de messages • Mêmes traitements en réponse aux mêmes message • Même structure de leur mémoires respectives • Risque de duplication des descriptions • Nécessité de factoriser pour éviter la duplication de code • Factorisation à l'aide du concept de Classe
Classe • Fabrique d'objets • Responsable de la création des objets • Les objets créés par une classe = instance de cette classe • Moule d'objets • Description de la structure mémoire de ses instances • Liste des champs (généralement nommés) • Analogie avec les structures du langage C • Description des traitements réalisés par ses instances • Méthodes : Analogie avec fonctions du langage C • Description des messages valides pour ses instances • Signatures des méthodes (nom, types…)
couleur: uneCouleur eteindre allumer estAllumee := true • couleur • estAllumee Classe Lampe Exemple de classe Déclarations des champs Définitions des méthodes | r v | r := Lampe new. r couleur: (Color red). r allumer. v := Lampe new. v couleur: (Color green). v allumer. instance de
couleur: uneCouleur canal: unCanal eteindre eteindre allumer estAllumee := true allumer "démarrer ampli" volume := … • couleur • estAllumee Classe Lampe • canal • frequence • volume Classe Radio Polymorphisme • Une lampe et une radio • savent répondre aux 2 messages : • allumer • éteindre • Mais traitements (et structures) différents • lampe et radio sont instances de 2 classes différentes
Premiers pas en SmalltalkIllustration avec Squeak (Un Smalltalk libre) "Smalltalk is dangerous. It is a drug. My advice to you would be don't try it. It could ruin your life." Andy Bower
Historique • Naissance au prestigieux Xerox PARC • Un langage rôdé • première version en 1972 • bases définitives en 1980 • Premier langage à objets moderne • Utilisation industrielle • Outils de développement en équipe • (depuis les années 80) • Première version open-source en 1997
Un langage simple à apprendre - 1 • Syntaxe simple • proche du langage naturel • mots et caractères spéciaux = 1 transparent • permet de focaliser sur les concepts et la conception • Typage dynamique • pas de type à saisir • contrôle de type à l'exécution • Tous les sources sont disponibles • y compris les bibliothèques de base
Un langage simple à apprendre - 2 • Très peu de concepts • Objet, Classe, Message, Variable • Toute méthode retourne une valeur • Règles de visibilité fixes • Classes et Méthodes accessibles par tout le monde • Champs accessibles uniquement par leur propriétaire • Uniformité (sans exception) • Tout est objet • nombres, outils de dév., le compilateur, … • 1 action = 1 message • y compris la création d'objet
Un langage très puissant - 1 • Bibliothèque riche copiée • collections, streams, … • Langage ouvert (capacités réflexives) • Nombreux éléments/concepts du langage accessibles • Langage : Classe, méthode, … • Exécution : Pile d'exécution, Contrôle de type, … • Outils : Compilateur, Débugger, … • Extensible • Code éléments du langage disponible • Possibilité de le modifier/étendre
Un langage très puissant – 2Quelques outils usuels de Smalltalk • Navigation/Codage • Browsers: System, Hierarchy, Class, Category, Refactoring, … • method Implementors, Method Finder • message Senders • Débogue • Debugger • Inspector • Test Runner (SUnit) • Workspace • Gestion de code • Project • Change Set, Change Sorter • Gestion de version automatique • fileIn/fileOut, FileList • …
Syntaxe Smalltalk • Mots réservés • nil objet indéfini (valeur par défaut des champs et variables) • true, false objets booléens • self (l'objet lui-même) super (l'objet dans le contexte de la superclasse) • thisContext partie de la pile d'exécution représentant la méthode courante • Caractères réservés • := (ou) affectation • ^ (ou ) = return • | varTemp1 varTemp2 varTemp3 | • $caractère • # littéral • . termine toute expression • ; cascade de messages • ( ) précédence • [ ] bloc de code • " commentaire" • ' chaîne de caractère '
Modèle d'exécution Smalltalk • 4 fichiers fondamentaux • Machine virtuelle (.exe) • Image mémoire (.image) • changements effectués (.change) • code source des bibliothèques de base (.source) • Gestion automatique de la mémoire • Garbage collector • Tout se passe à l'exécution • Développement incrémental • Sauvegarde automatique des changements (.change) • Perte de code quasi-impossible
4 fichiers fondamentaux • Machine virtuelle (.exe) • Change suivante les plateformes (Mac, Linux, Windows, Palm) • Les autres fichiers sont portables • Fichier image mémoire (.image) • Lecture automatique + enregistrement à la demande • "Photographie" de la mémoire à l'instant de la sauvegarde • Possibilité d'avoir plusieurs fichiers images • Fichier avec le code source des changements effectués (.change) • 1 fichier .change par fichier image (même nom) • Enregistrement automatique • Sauvegarde de toutes les opérations réalisées !! • Lecture à la demande • Récupération manuelle en cas d'arrêt intempestif • Fichier sources standards • Lecture seule
Browser - 2 • Découpage logique • Catégories de classes • Catégories de méthodes • Compilation • Transparente à la volée • Incrémentale • versions des méthodes • Utilisation du menu "accept"
2 1 3 Exemple de création d'une classe - 1
Exemple de création d'une classe - 2 Object subclass: #BankAccount instanceVariableNames: 'number balance' classVariableNames: 'CreatedAccounts' poolDictionaries: '' category: 'Examples'