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. Noury Bouraqadi Ecole des Mines de Douai

Embed Size (px)

Citation preview

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