1 / 100

Tour de Smalltalk en 100 diapos.

Noury Bouraqadi http://csl.ensm-douai.fr/noury Ecole des Mines de Douai. Tour de Smalltalk en 100 diapos. 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

baylee
Télécharger la présentation

Tour de Smalltalk en 100 diapos.

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Noury Bouraqadi http://csl.ensm-douai.fr/noury Ecole des Mines de Douai Tour de Smalltalk en 100 diapos.

  2. 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 libre en 1997 • Open source depuis son origine

  3. Un langage simple à apprendre - 1 • Syntaxe simple • proche du langage naturel (anglais) • 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

  4. Un langage simple à apprendre - 2 • 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 visibles uniquement pour leur propriétaire • Uniformité (sans exception) • Tout est objet • nombres, outils, compilateur, … • 1 action = 1 message • y compris la création d'objets

  5. Un langage très puissant - 1 • Bibliothèque riche copiée • collections, streams, … • Langage ouvert : multiples 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 des éléments et concept du langage disponible • Possibilité de le modifier/étendre

  6. Un langage très puissant – 2Quelques outils usuels de Smalltalk • Navigation/Codage • Browsers: System, Hierarchy, Class, Category, Refactoring, … • Method Implementors, Method Finder, Message Senders, … • Test et Débogue • Debugger, Inspector, … • Test Runner (SUnit), Workspace, … • Gestion de code • Project, Change Set, Change Sorter, … • Gestion de version automatique • fileIn/fileOut, FileList • …

  7. La suite … • Prise de contact • Eléments de base • Un peu plus loin avec Smalltalk • Test & Debug • Programmation web avec Seaside • Conclusion

  8. Prise de contact

  9. 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

  10. 4 fichiers fondamentaux • Machine virtuelle (.exe) • Unique fichier spécifique à la plateforme (Mac, Linux, Windows, …) • Fichier sources de base • Lecture seule • 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 des changements effectués (.change) • 1 fichier .change par fichier image (même nom) • Enregistrement automatique + Lecture à la demande • Sauvegarde de toutes les opérations réalisées !! • Récupération manuelle en cas d'arrêt intempestif

  11. Packaging et install. d’applications • Packaging • Lancez l'interface de votre application • Agencez/initialisez comme elle doit être pour le client • Supprimez (ou masquez) les classes inutiles • Outils de développement et leurs menus • Sauvegardez l'image et quittez Smalltalk • Préparez votre lanceur (script, icône) • Gravez votre CD • 3 fichiers fondamentaux : Lanceur, VM, Image • Installation • Copiez les fichiers de votre CD • Lancez votre application

  12. Squeak 3.7 au premier démarrage

  13. Accès aux outils

  14. Menu "World"

  15. Browser - 1

  16. 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"

  17. 2 1 3 Exemple de création d'une classe - 1

  18. Exemple de création d'une classe - 2 Object subclass: #BankAccount instanceVariableNames: 'number balance' classVariableNames: 'CreatedAccounts' poolDictionaries: '' category: 'Examples'

  19. 2 4 1 3 5 Exemple de définition d'une méthode - 1

  20. Exemple de définition d'une méthode - 2 deposit: amount "Ajoute un montant positif uniquement" amount > 0 ifFalse: [ ^self notify: 'Amount should be positive']. balance := balance + amount

  21. Exemple de messages Smalltalk |myAccount yourAccount| "creates a new account" yourAccount := BankAccount new. yourAccount deposit: 2000. myAccount := BankAccount new. yourAccount transfer: 1500 to: myAccount.

  22. Transcript = "Console"

  23. Workspace : exécuter, afficher, inspecter…

  24. Inspecteur & explorateur • Donne accès à la structure d'un objet • Ouverture par • message • menu Zones de travail

  25. File List : Gestionnaire de fichier

  26. Télécharger des projets depuis et vers le web via SqueakMap/Monticello

  27. Eléments de base

  28. Mots et caractères réservés • 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 '

  29. Conditionnelle (le "if") • Booléens = objets true et false • Conditionnels = messages destinés aux booléens • 3 formes = 3 méthodes • (expressionBooléenne) ifTrue: ["bloc de code"] • (expressionBooléenne) ifFalse: ["bloc de code"] • (expressionBooléenne) ifTrue: ["bloc de code"] ifFalse: ["bloc alternatif"]

  30. Boucles • Boucles = Messages • "for" • 1 to: 10 do: [ :i | "traitement boucle"] • 15 timesRepeatDo: ["bloc de code répété"] • "while" • ["expression booléenne"] whileTrue: ["bloc de code"] • ["expression booléenne"] whileFalse: ["bloc de code"]

  31. Collections • Collection • Notion plus générale que "tableau" • Objet qui référence un nombre arbitraire d'objets • Ces objets sont appelés éléments de de la collection • Différents classes de collections • Collections ordonnées ou pas • Nombre d'éléments extensible ou fixe • Différentes façons d'accéder aux éléments • Par indice • Avec une clé (dictionnaires) • Par parcours seulement (ensembles)

  32. Quelques classes de collections • Collections ordonnées • Taille fixe : Array, … • Taille variable : • OrderedCollection, • SortedCollection (éléments triés automatiquement) • Collections non-ordonnées (taille variable) • Ensembles • Set (Deux éléments ne peuvent pas être égaux) • IdentitySet (Un élément apparaît une seule fois) • Dictionnaires (table de correspondance clé-valeur) • Dictionary (Deux clés ne peuvent pas être égales) • IdentityDictionary (Une clé est utilisée une seule fois)

  33. Accès aux collections à taille variable(ordonnées ou non) • add: unObjet • Ajoute unObjet à la collection • addAll: autreCollection • Ajoute tous les éléments appartenant à autreCollection • remove: unObjet ifAbsent: ["traitements"] • Retire unObjet de la collection • Exécute le bloc de traitements si unObjet est absent • remove: unObjet • Erreur si unObjet n'appartient pas à la collection • removeAll: autreCollection • Retire tous les éléments appartenant à autreCollection

  34. Accès aux collections ordonnées(de taille fixe ou variable) • first • Retourne le premier élément • last • Retourne le dernier élément • at: indice • Retourne l'élément dont la position correspond à indice • Erreur si indice est hors des limites de la collection • premier indice = 1 • dernier indice = taille de la collection • at: indice put: unObjet • Stocke unObjet à la cellule dont le numéro est indice

  35. Parcours des collections (boucles) - 1 • do: [:element| "traitements"] • element = variable qui référence successivement les différents éléments de la collection • Les traitements définis dans le bloc sont exécutés successivement pour chaque élément de la collection. • select: [:element| "expression booléenne"] • Retourne les éléments pour lesquels l'expression booléenne est vraie (true) • reject: [:element| "expression booléenne " ] • inverse de select

  36. Parcours des collections (boucles) - 2 • collect: [:element| "traitements"] • Retourne une collection du même type que celle parcourue • avec les résultats des traitements pour chaque élément • detect: [:element | "expression booléenne"] ifNone: ["traitements alternatifs"] • Retourne le 1er élément pour lequel l'expression booléenne est vraie • Exécute le bloc de traitements alternatifs si l'expression booléenne est fausse pour tous les éléments • detect: [:element | "expression booléenne"] • Provoque une erreur si aucun élément n'est trouvé (expression booléen est toujours fausse)

  37. Exemple de parcours d'une collection |notes total moyenne notesCorrectes noteEliminatoire | notes := Set new. notes add: 12. notes add: 6.5. notes add: 15. total = 0 notes do: [:uneNote| total := total + uneNote]. moyenne := total / (notes size). notesCorrectes := notes select: [:uneNote| uneNote >= 12]. noteEliminatoire := notes detect: [:uneNote| uneNote < 8] ifNone: [nil].

  38. Manipulation des dictionnaires • at: clé put: valeur • valeur référence un objet quelconque • clé référence n'importe quel objet • associe valeur à clé • Si la clé est déjà utilisée, l'ancienne valeur est remplacée • at: clé • retourne la valeur (l'élément) associé à la clé • at: clé ifAbsent: ["traitements"] • Exécute les traitements du bloc si la clé n'est pas utilisée • removeKey: clé • retire la clé et la valeur correspondante

  39. Parcours des dictionnaires (boucles) • keysAndValuesDo: [:clé :valeur| "traitements"] • parcourt le dictionnaire • exécute les traitements pour chaque couple clé-valeur • keysDo: [:clé | "traitements"] • Exécute les traitements pour chaque clé • do: [:valeur| "traitements"] • Exécute les traitements pour chaque valeur • collect: [:valeur| "traitements"] • Retourne un ensemble (Set) avec les résultats des traitements pour chaque valeur

  40. Dictionnaires - Exemple |notesPromo| notesPromo := Dictionnaire new. notesPromo at: 'Marie' put: 14. notesPromo at: 'Rémy' put: 12. notePromo at: 'Didier' put: 16. notesPromo keysAndValuesDo: [:nom :note| Transcript cr. Transcript show: nom. Transcript tab. trascript show: (note printString)]

  41. Collections - Autres messages utiles • Taille • size • isEmpty • Conversion • asArray • asOrderedCollection • asSet • Copie • copyWith: unObjet • Retourne une collection du même type avec tous les éléments + unObjet • copyWithout: unObjet • Retourne une collection du même type avec tous les éléments sauf unObjet

  42. Envoi de message • Receveur = destinataire d'un message • Toute méthode retourne un résultat • Par défaut c'est l'objet lui-même (self) • Si la méthode ne se termine pas par un retour • le compilateur insère ^self automatiquement • Cascade de message • Plusieurs messages destinés au même receveur • Receveur écrit une seule fois • Messages séparés par des point-virgules • compte deposit: 200; deposit: 50; withdraw: 100

  43. Méthodes et messages - 1 • Différents types • Unaire • message sans argument • uneCollection size • Binaire • le sélecteur inclus un symbole non-alpha-numérique • 1 + 2 • Avec (1 ou plusieurs) mot-clés • Set new: 100 • votreCompte transferer: 50 vers: monCompte

  44. Méthodes et messages - 2 • Précédence : • de gauche à droite • messages unaires, puis binaires et enfin à mot-clé • Sélecteur • identifiant unique • instance de la classe Symbol • Exemple de sélecteurs • size • + • new: • transferer:vers:

  45. Un peu plus loin avec Smalltalk

  46. Héritage • Héritage simple • Interdiction de redéfinir les champs hérités • Possibilité de redéfinir les méthodes des superclasses • Appel par envoi de message à super • Classe racine : Object • définit les méthodes communes à tous les objets • Liaison (message-methode) dynamique • la méthode à évaluer en réponse à un message est recherché à l’exécution dans la classe et les superclasses • Si absente exécution de la méthode doesNotUnderstand: • 1 paramètre = message réifié • implantation par défaut : levée d’exception

  47. Exemple d’héritageHiérarchie de classes Personne nomPrenom dateNaissance nomPrenom nomPrenom: uneChaine dateNaissance: uneDate age Prof matieresEnseignees ajouteMatiere: nomMatiere enseigneMatiere: nomMatiere Eleve notes note: unReel matiere: nomMatiere note: nomMatiere moyenne

  48. Exemple d’héritageDéfinition de la super-classe Personne Object subclass: #Personne instanceVariableNames: 'nomPrenomdateNaissance' classVariableNames: '' poolDictionaries: '' category: 'Exemple'

  49. Exemple d’héritageDéfinition des sous-classes Prof et Eleve • Personne subclass: #Prof instanceVariableNames: 'matieresEnseignees' classVariableNames: '' poolDictionaries: '' category: 'Exemple' • Personne subclass: #Eleve instanceVariableNames: 'notes' classVariableNames: '' poolDictionaries: '' category: 'Exemple'

  50. Variables d'instance, de classe, de pool • Variables d'instance • champs spécifiques à chaque instance • Variables de classe • partagées entre les instances de la classe et… • avec les instances des sous-classes (héritables !) • Variables de pool • partagées entre des instances de classes différentes • organisés en dictionnaires

More Related