tour de smalltalk en 100 diapos
Post on 18-Jan-2016
25 Views
Preview:
DESCRIPTION
TRANSCRIPT
Tour de Smalltalk en 100 diapos.
Noury Bouraqadi
http://csl.ensm-douai.fr/noury
Ecole des Mines de Douai
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 équipedepuis 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 messagey 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
accessiblesLangage : Classe, méthode, … Exécution : Pile d'exécution, Contrôle de type, …Outils : Compilateur, Débugger, …
• ExtensibleCode des éléments et concept du langage disponiblePossibilité 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
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
Packaging1. Lancez l'interface de votre application
Agencez/initialisez comme elle doit être pour le client
2. Supprimez (ou masquez) les classes inutiles Outils de développement et leurs menus
3. Sauvegardez l'image et quittez Smalltalk4. Préparez votre lanceur (script, icône)5. Gravez votre CD
3 fichiers fondamentaux : Lanceur, VM, Image
Installation1. Copiez les fichiers de votre CD2. Lancez votre application
12Squeak 3.7 au premier démarrage
13Accès aux outils
14Menu "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
Exemple de création d'une classe - 1
1
2
3
18
Exemple de création d'une classe - 2
Object subclass: #BankAccount
instanceVariableNames: 'number balance'
classVariableNames: 'CreatedAccounts'
poolDictionaries: ''
category: 'Examples'
19
Exemple de définition d'une méthode - 1
1
2
5
3
4
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"
23Workspace : 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
26Télécharger des projets depuis et vers le
web via SqueakMap/Monticello
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 indiceAvec 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)
33Accè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
34Accè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 = 1dernier 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 argumentuneCollection size
• Binairele sélecteur inclus un symbole non-alpha-numérique1 + 2
• Avec (1 ou plusieurs) mot-clésSet new: 100votreCompte 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:
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
47Exemple d’héritage
Hiérarchie de classes
PersonnenomPrenomdateNaissancenomPrenomnomPrenom: uneChainedateNaissance: uneDateage
ProfmatieresEnseigneesajouteMatiere: nomMatiereenseigneMatiere: nomMatiere
Elevenotesnote: unReel matiere: nomMatierenote: nomMatieremoyenne
48Exemple d’héritage
Définition de la super-classe Personne Object subclass: #Personne
instanceVariableNames: 'nomPrenom dateNaissance'
classVariableNames: ''
poolDictionaries: ''
category: 'Exemple'
49Exemple d’héritage
Dé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
51Variables d'instance, de classe, de pool
Exemple de déclaration
Object subclass: #CompteBancaireinstanceVariableNames: 'solde numero'
classVariableNames: 'NombreComptesCrees'
poolDictionaries: 'TauxChange'
category: 'Exemple'
52
Quelques méthodes fondamentales
Représentation textuelle• printOn: aStream (A redéfinitir)• printString (Ne pas redéfinir. Utiliser seulement)
Comparaison • ==
Teste l'identité. Ne pas redéfinir.
• =Teste l'égalité. A redéfinir.besoin de redéfinir aussi la méthode hash
Copie• shallowCopy (A redéfinir)• deepCopy (A redéfinir)
53
Représentation textuelle des profs
printString|str|str := Stream…self printOn: str.…
printOn: aStreamaStream nextPutAll:
self nomPrenom.
printOn: aStreamsuper printOn: aStream.aStream nextPutAll: ', Prof'
Object
printOn: aStreamprintString
PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…
ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere
54
Méthodes de classe
Les classes sont des objets• Peuvent recevoir des messages
Méthodes de classe :• sont exécutées suite aux envois de messages à à la classe• sont définies en mode "class" du browser• respectent les mêmes règles que les méthodes d'instance
Masquage, redéfinition, …
Exemples :• new
méthode de création d'instances
• subclass:instanceVariableNames:…méthode de création des sous-classes
55
Browser en mode instance
56
Browser en mode class
57
Création d'instances - 1
Objets littéraux : écriture = création• Nombres : 2 , 3.14 , …
• Lettres $a , $z , …
• Chaînes de caractères : 'Hello' 'l''oiseau'
– double apostrophe = une apostrophe dans la chaîne de caractères
• Symboles : #toto #abcd , …
• tableaux de littéraux (instances de Array): #(2 $a 'Hello' #bidule)
Tableau d’objets quelconques• {expression1. expression2. expression3}
58
Création d'instances - 2
Autres objets = Par envoi de message aux classes• Les classes sont des objets
Message à la classe• Point new• OrderedCollection with: 2 with: $a with: 'Hello'
Crée une collection ordonnée avec les éléments :– 2– $a– 'Hello'
Message à d'autres objets• 640 @ 480
Crée une instance de Point d'abscisse 640 et d'ordonnée 480
•'Hello' , ' World!'
Concaténation = Crée la chaîne de cractères : 'Hello World!'
59
La méthode de classe new
Crée une nouvelle instance
Retourne un nouvel objet initialisé• envoi du message initialize au nouvel objet• Object dispose de la méthode initialize
méthode vide
• Redéfinition de initialize dans les sous-classesLes champs non-initialisés référencent nil
Exemple : Lampe>>initializesuper initialize.self estAllumee: false.self couleur: (Color yellow)
60
Méthodes de création spécifiques
Quand la redéfinition de new ne suffit pas• Besoin d’avoir différentes méthodes de création
• Besoin de fournir des paramètres d’initialisation
Solution :• Définir une méthode d'instance qui fait l'initialisation
Prend des paramètres si nécessaire
• Définir une méthode de classe quicrée une nouvelle instance (utilisation de new par ex.)envoie le message d'initialisation à la nouvelle instance retourne la nouvelle instance
61
Création d'instances initialisées
Tous les champs d'un nouvel objet référencent nil• Besoin de leur donner une valeur par défaut
Solution : • Définir une méthode d'instance pour chaque valeur par
défautPossibilité de redéfinition dans les sous-classes
• Définir une méthode d'instance qui fait l'initialisationEnvoi de message pour obtenir les valeur par défaut
• Définir une méthode de classe quicrée une nouvelle instanceenvoie le message d'initialisation à la nouvelle instance retourne la nouvelle instance
62Création d’instances initialisées
Exemple - classe et méthodes d’instance
Object subclass: #Compte
instanceVariableNames: ‘numero solde’
classVariableNames: ‘DernierNumero’
poolDictionaries: ‘’
category: #‘Application Bancaire’
Compte>>numero: unNumero solde: soldeInitialnumero := unNumero.
solde := soldeInitiale
63Création d’instances initialisées
Exemple - méthodes de classe
Compte class>>nouveauCompte: soldInit |nouveauCompte nouveauNum|nouveauNum := DernierNumero + 1.DernierNumero := nouveauNum.nouveauCompte := self new.nouveauCompte numero: nouveauNum solde: soldInit.^nouveauCompte
Compte class>>initialize"Compte initialize"DernierNumero := 0
64
Initialisation paresseuse
Intérêt : un champ n'est initialisé que s'il est utilisé
Initialisation réalisée dans les méthodes d'accès en lecture aux champs
Exemple :• Lampe>>couleurcouleur ifNil: [self couleur: (Color yellow)].^couleur
• Lampe>>estAllumeeestAllumee ifNil: [self estAllumee: false].^estAllumee
65
Blocs de code
Un bloc est un objet• peut être référencé dans une variable • ou transmis comme argument ou valeur de retour• Analogie avec Lambda-expression des langages fonctionnels
Peuvent avoir des paramètres• [:p1 :p2| "plusieurs lignes de code"]
Evaluation retardée• value • value:• value:ifError:• valueWithArguments:
Très utiles• Boucles, Conditionnelles, Exceptions, Concurrence
66
Exceptions
Sous-classes de Exception
Levée d'exception : • signal et signal: texteException
Capture d'exception• A l'aide des blocs• bloc on: classException do: [:ex| "traitement exception"]• bloc ensure: ["A executer toujours"]
67
Réflexion
Tout est objet instance de classes modifiables• Classes, méthodes, blocs, processus, "scheduler", nombres…
• Compilateur, arbres syntaxiques, outils de développement …
Contrôle de l'exécution• Pile d'exécution
Objet accessible via la pseudo-variable thisContext
• Echange de références d'objetsMéthodes become: et becomeForward:
• Contrôle de type : Méthode doesNotUnderstand:Dictionnaires des méthodes des classes
• …
Test et debug
69Débogueur
Point d'arrêt = self hal
70
Débogueur– Ouverture
71Le Débogueur !
72
eXtreme Programing (XP)
Méthode "agile" de gestion de projets informatiques• Indépendante du langage (objet ou pas d'ailleurs)• Objectifs : Tenir les délais & Garantir la qualité
Quelques Règles :• scénarios client
Identifier les priorités du clientEstimation des délais
• Travail en équipeProgrammation en binôme (changeant)Tout le monde partage le code
• Tests réutilisables et automatisables (framework xUnit)• Itérations planification-codage (2 à 3 semaines)
Plus sur http://www.extremeprogramming.org
73
Des Tests Réutilisables et Automatiques
Exprimer le "cahier des charges"• Vérifier que le contrat est rempli
• Mesurer l'avancement du projet
• Ecrire le code le plus simple
Qualité croissante• Eviter la répétition d'un bug
• Permettre l'amélioration "fiable" du code
Simplifier l'intégration• Intégration quotidienne
• Identifier les bugs introduits par l'intégration
74
Un cas à tester dans SUnit
Une sous-classe de TestCase• champs avec données initiale de test• 2 méthodes de gestion des ressources
initialisation : setUp libération : tearDow
• "n" méthodes de test : nom commençant par "test" Sans paramètres
Exécution de tests• pour chaque méthode de test testX: 3 messages envoyés
àsur une instance de la classe1. setUp2. testQuelqueChose3. tearDown
75
Support à l'écriture de méthodes de test
Utilisation de méthodes de TestCase : • assert: expressionBooléenne
vérifie que l'expressionBoolèenne == true
• deny: expressionBooléennevérifie que l'expressionBoolèenne == false
• should: bloc raise: classeExceptionvérifie que l'exécution du bloc de code lève une exception du type
que représente classeException
• shouldnt: bloc raise: classeExceptionvérifie que l'exécution du bloc de code ne lève pas une exception du
type que représente classeException
76
Outil d'exécution de test : TestRunner
77
Réalisation d'une classe testée - 1
1) Poser les spécifications• Ensemble
• Quatre propriétés1. Un élément ajouté appartient à l'ensemble
2. Un élément ajouté plusieurs fois apparaît une seule fois
3. Un élément supprimé n'appartient plus à l'ensemble
4. Pas d'erreur si suppression d'un élément inexistant
2) Créer une sous-classe de TestCase• Un champ = ensemble
• la méthode d'initialisation (setUp) : crée l'ensemble
• 4 méthodes de test
78
Réalisation d'une classe testée - 2
3) Concevoir et Implanter la classe demandée• Ensemble
4) Exécuter les tests• automatique avec TestRunner
5) Modifiez votre code• Relancer les tests• Recommencez jusqu'au succès de tous les tests
79
Exemple de test - 1
TestCase subclass: #TestEnsembleinstanceVariableNames: 'ensemble'classVariableNames: ''poolDictionaries: ''category: 'Exemple-Test'
setUpensemble := Ensemble new
testAjoutensemble ajouter: 123.self assert: (ensemble contient: 123)
80
Exemple de test - 2
testAjoutRepeteensemble ajouter: 123.ensemble ajouter: 123.self assert: (ensemble taille == 1)
testSuppressionensemble ajouter: 123.ensemble supprimer: 123.self deny: (ensemble contient: 123)
testSuppressionElementInexistantself shouldnt: [ensemble supprimer: 123]
raise: Exception
Applications Web Dynamique avec Seaside
http://www.beta4.com/seaside2/
http://swiki.squeakfoundation.org/sea/60
82
Présentation
Masque au maximum le code html• Description des pages html générées en Smalltalk
Découple les traitements de l'interface html• Méthode spécifique pour produire l'html (renderOn:)
Simplifie la construction de pages• Imbrication d'éléments
Support automatique des sessions
Outils de test/déboguage en ligne
83Exemple du compteur :
Code - 1 WAComponent subclass: #Compteur
instanceVariableNames: 'valeur' …
incrementvaleur := valeur + 1
decrementvaleur := valuer - 1
initializesuper initialize.valeur := 0
84Exemple du compteur :
Code - 2
renderOn: html"html est une instance de WAHtmlRenderer""Afficher la valeur en grand"html heading: valeur.html form: [
"Bouton pour incrémenter"html submitButtonWithAction: [self increment] text: 'Incrémenter'. "Bouton pour décrémenter"html submitButtonWithAction: [self
decrement] text: 'Décrémenter'. ]
85Exemple du compteur :
Résultat
86Créer des pages par imbrication
Exemple de liste de compteur - 1
WAComponent subclass: ListeCompteurs
instanceVariableNames: 'compteurs'…
initializesuper initialize.
compteurs := OrderedCollection new
addCompteurcompteurs add: (Compteur parent: self)
87Créer des pages par imbrication
Exemple de liste de compteur - 2
renderOn: html|titre|titre := 'Nbre de compteurs ', compteurs size printString.html heading: titre.
html form: [html submitButtonWithAction: [self addCompteur]ext: 'Ajouter un compteur']].
html horizontalRule.
compteurs do: [:compt|html horizontalRule.compt renderOn: html]
88Créer des pages par imbrication
Exemple de liste de compteur - 3
89
Une application Seaside
Un nom• Casse prise en compte
Une classe de démarrage• sous-classe de WAComponent• Instanciée à chaque session
Une configuration (possible en ligne)• Type de session (simple, avec authentification, …)• Afficher/Masquer les outils de déboguage
90
Installer/Configurer une application
91
Tester/Déboguer une application
92
Inspecter l'objet courant
93
Consulter/Modifier le code
94
Evaluer les performances
Conclusion
96
Smalltalk c'est…
Un langage à objets de référence• Classes• Héritage simple• Typage dynamique• Machine Virtuelle• Allocation dynamique de la mémoire
Ramasse-miette
Support d'applications "entreprise"• Concurrence, SGBD, Distribution, Web, …• Utilisé dans de grands projets :
MMA, Thalès, AMD, JP Morgan, …
97
Quelques inconvénients
Syntaxe non conventionnelle• Proche langage naturel (anglais)
Différents dialectes (commerciaux ou libres)• IDE différents
• Mais noyaux identiques
N'est pas leader du marché, mais des passerelles vers • C et C++,
• Microsoft .Net : Connexion VM Smalltalk .NetCompilateur Smalltalk .Net CL
• Java : Techno. d'une Startup Française (Bird Technology)
98
De nombreux atouts
Simplicité du langage• Syntaxe restreinte et uniforme
• Modèle uniforme : Peu de concepts appliqués partout
• Typage dynamique
• Déploiement simpleConcept d'image mémoire
Un langage très puissant• Ecrit en lui-même
• Accès à tous les sources
• Capacités réflexives très poussées
Notion d'image : pas de problème de fichier et chemin Toujours en avance par rapport aux autres langages !
99
Biblio/Webo-graphie
Livres• Squeak – X. Briffault et S. Ducasse (en français !) • Smalltalk, Objects and Design – C. Liu• Smalltalk with Style – S. Skublics• Smalltalk Best Practice Patterns – K. Beck
Sites Web• European Smalltalk Users Group http://www.esug.org • http://www.squeak.org• Why Smalltalk http://www.whysmalltalk.com/• Communauté Smalltalk francophone
http://www.iutc3.unicaen.fr/smalltalkfr/pmwiki.php• Smalltalk Industry Coucil http://www.stic.org/• http://csl.ensm-douai.fr/noury/10#smalltalk
100Attention DANGER !!!
"Smalltalk is dangerous. It is a drug.
My advice to you would be don't try it.
It could ruin your life."
Andy Bower OO Expert
top related