1k likes | 1.12k Views
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
E N D
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 • Outils de développement en équipe • depuis les années 80 • Première version libre en 1997 • Open source depuis son origine
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
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
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
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 • …
La suite … • Prise de contact • Eléments de base • Un peu plus loin avec Smalltalk • Test & Debug • Programmation web avec Seaside • Conclusion
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) • 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
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
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'
2 4 1 3 5 Exemple de définition d'une méthode - 1
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
Exemple de messages Smalltalk |myAccount yourAccount| "creates a new account" yourAccount := BankAccount new. yourAccount deposit: 2000. myAccount := BankAccount new. yourAccount transfer: 1500 to: myAccount.
Inspecteur & explorateur • Donne accès à la structure d'un objet • Ouverture par • message • menu Zones de travail
Télécharger des projets depuis et vers le web via SqueakMap/Monticello
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 '
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"]
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"]
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)
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)
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
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
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
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)
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].
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
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
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)]
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
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
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
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:
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
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
Exemple d’héritageDéfinition de la super-classe Personne Object subclass: #Personne instanceVariableNames: 'nomPrenomdateNaissance' classVariableNames: '' poolDictionaries: '' category: 'Exemple'
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'
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