Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai.

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

Transcript of Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai.

Page 1: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Tour de Smalltalk en 100 diapos.

Noury Bouraqadi

http://csl.ensm-douai.fr/noury

Ecole des Mines de Douai

Page 2: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  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

Page 3: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 4: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 5: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 6: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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• …

Page 7: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

7

La suite …

Prise de contact

Eléments de base

Un peu plus loin avec Smalltalk

Test & Debug

Programmation web avec Seaside

Conclusion

Page 8: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Prise de contact

Page 9: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 10: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 11: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 12: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

12Squeak 3.7 au premier démarrage

Page 13: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

13Accès aux outils

Page 14: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

14Menu "World"

Page 15: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

15

Browser - 1

Page 16: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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"

Page 17: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

17

Exemple de création d'une classe - 1

1

2

3

Page 18: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

18

Exemple de création d'une classe - 2

Object subclass: #BankAccount

instanceVariableNames: 'number balance'

classVariableNames: 'CreatedAccounts'

poolDictionaries: ''

category: 'Examples'

Page 19: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

19

Exemple de définition d'une méthode - 1

1

2

5

3

4

Page 20: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 21: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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.

Page 22: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

22

Transcript = "Console"

Page 23: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

23Workspace : exécuter, afficher,

inspecter…

Page 24: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

24

Inspecteur & explorateur

Donne accès à la structure d'un objet

Ouverture par • message• menu

Zones de travail

Page 25: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

25

File List : Gestionnaire de fichier

Page 26: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

26Télécharger des projets depuis et vers le

web via SqueakMap/Monticello

Page 27: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Eléments de base

Page 28: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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 '

Page 29: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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"]

Page 30: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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"]

Page 31: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 32: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 33: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 34: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 35: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 36: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 37: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 38: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 39: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 40: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)]

Page 41: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 42: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 43: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 44: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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:

Page 45: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Un peu plus loin avec Smalltalk

Page 46: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 47: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

47Exemple d’héritage

Hiérarchie de classes

PersonnenomPrenomdateNaissancenomPrenomnomPrenom: uneChainedateNaissance: uneDateage

ProfmatieresEnseigneesajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Elevenotesnote: unReel matiere: nomMatierenote: nomMatieremoyenne

Page 48: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

48Exemple d’héritage

Définition de la super-classe Personne Object subclass: #Personne

instanceVariableNames: 'nomPrenom dateNaissance'

classVariableNames: ''

poolDictionaries: ''

category: 'Exemple'

Page 49: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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'

Page 50: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 51: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

51Variables d'instance, de classe, de pool

Exemple de déclaration

Object subclass: #CompteBancaireinstanceVariableNames: 'solde numero'

classVariableNames: 'NombreComptesCrees'

poolDictionaries: 'TauxChange'

category: 'Exemple'

Page 52: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 53: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 54: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 55: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

55

Browser en mode instance

Page 56: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

56

Browser en mode class

Page 57: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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}

Page 58: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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!'

Page 59: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 60: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 61: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 62: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 63: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 64: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 65: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 66: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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"]

Page 67: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

• …

Page 68: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Test et debug

Page 69: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

69Débogueur

Point d'arrêt = self hal

Page 70: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

70

Débogueur– Ouverture

Page 71: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

71Le Débogueur !

Page 72: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 73: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 74: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 75: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 76: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

76

Outil d'exécution de test : TestRunner

Page 77: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 78: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 79: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 80: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 81: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Applications Web Dynamique avec Seaside

http://www.beta4.com/seaside2/

http://swiki.squeakfoundation.org/sea/60

Page 82: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 83: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

83Exemple du compteur :

Code - 1 WAComponent subclass: #Compteur

instanceVariableNames: 'valeur' …

incrementvaleur := valeur + 1

decrementvaleur := valuer - 1

initializesuper initialize.valeur := 0

Page 84: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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'. ]

Page 85: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

85Exemple du compteur :

Résultat

Page 86: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 87: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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]

Page 88: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

88Créer des pages par imbrication

Exemple de liste de compteur - 3

Page 89: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 90: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

90

Installer/Configurer une application

Page 91: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

91

Tester/Déboguer une application

Page 92: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

92

Inspecter l'objet courant

Page 93: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

93

Consulter/Modifier le code

Page 94: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

94

Evaluer les performances

Page 95: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

Conclusion

Page 96: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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, …

Page 97: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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)

Page 98: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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 !

Page 99: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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

Page 100: Tour de Smalltalk en 100 diapos. Noury Bouraqadi  Ecole des Mines de Douai.

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