Cours-Iterations
6 pages
Français
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres
6 pages
Français
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres

Description

1 2Plan du cours CMO 2001 Chapitre 0: Mise au pointConception et Modélisation Objet Chapitre I: Les blocs, égalités, les conditionnelles et la copieChapitre II: Les collectionsSmallTalk: Blocs, Conditionnelles,SmallTalk: A. Les classe Array, CollectionCollections & Itérations B. Les sous-classes de Collection: Set, Bag, DictionaryC. Convertir des collectionsJean-Daniel.Zucker@lip6.fr D. Choisir un type de collectionhttp://www-poleia.lip6.fr/~zucker Chapitre III: ItérationsA. Itérations conditionnelles: repeat, whileTrue: et whileFalse:B. Itérations numériques: timesRepeat, to:do: et to:by:do:C. Itérations de collections: do:, select:, reject:, detect: et collect:Chapitre IV: Retour sur l'organisation Instance/Classe/Méta-Classe© J-D. ZUCKER LIP6 © J-D. ZUCKER LIP63 4Chapitre 0: Mise au point Ecrire du code à la volée1) Les extensions (parcels): | code |load parcel refactoringBroser code:= 'Window openNewIn: (Rectangle origin: 15@125 corner: 100@300)'.• Browser graphique beaucoup plus pratique Compiler evaluate: code.• Permet de faire des sortes de Runtime• Permet de générer les méthodes d’accès (CodingAssistant)| reponse code |2) 2) ProblèmesProblèmes de compatibilités VisualWorks ??code:= 'Dialog warn: '.Non !Non !reponse := Dialog request: 'Que voulez-vous comme warning dans le code ?'3) Sauvegarde (filein, fileout, changes): initialAnswer: 'ca marche !'.Voir le forum sur ma page. code := code, reponse ...

Informations

Publié par
Nombre de lectures 34
Langue Français

Extrait

1
oncep one o saon e SmallTalk:Blocs, Conditionnelles, Collections & ItÈrations Jean-Daniel.Zucker@lip6.fr http://www-poleia.lip6.fr/~zucker
Chapitre 0: Mise au point
© J-D. ZUCKER LIP6
3
1)Les extensions (parcels): load parcel refactoringBroser ¥Browser graphique beaucoup plus pratique ¥Permet de faire des sortes de Runtime ¥Permet de gÈnÈrer les mÈthodes dÕaccËCso(dingAssistant)
2)ProblËmesde compatibilitÈsVisualWorks ? Non !
3)Sauvegarde(filein, fileout, changes): Voir le forum sur ma page.
4)Code ‡ la volÈe
Chapitre I: A) Les blocs
© -JD.ZUCKERLIP6
5
Un bloc est une extension dont lÕÈvaluation est diffÈrÈe.
Le texte de lÕexpression est entre crochets.
[Transcript show: ÔcoucouÕ]. [10]. B := [N := N + 1. Transcript show: N). leBlocNul := [].
Les blocs sont des instances de la classeBlockContexte.
© -JD.ZUCKERLIP6
Page 1
2 Plan du cours CMO 2001 Chapitre 0: Mise au point Chapitre I: Lesblocs,ÈgalitÈs,lesconditionnelleset lacopie Chapitre II: Lescollections A. Les classeArray, Collection B. Les sous-classes de CollectionS:et, Bag, Dictionary C. Convertir des collections D. Choisir un type de collection Chapitre III:ItÈrations A. ItÈrationsconditionnellesr:epeat,whileTrue:etwhileFalse: B. ItÈrations numÈriques:timesRepeat,to:do:etto:by:do: C. ItÈrations de collections:do:, select:, reject:, detecte:tcollect: Chapitre IV:Retour sur l'organisationInstance/Classe/MÈta-Classe © J-D. ZUCKER LIP6
Ecrire du code ‡ la volÈe
|code| code:= 'WindowopenNewIn: (Rectangle origin: 15@125 corner: 100@300)'. Compiler evaluate:code.
4
|reponsecode| code:= 'Dialog warn: '. reponse:= Dialog request: 'Que voulez-vous comme warning dans le code ?' initialAnswer: 'ca marche !'. code:=code,reponseprintString. Compiler evaluate:code.
Evaluation dÕun bloc
Le messagevalue
[Transcript show: ÔcoucouÕ] value. [10]. B := [N := N + 1. Transcript show: N]. B value
La valeur retournÈe par un bloc est celle de saderniËre expression
N := 10. B := [N := N+ 1]. B value --> 11. B value --> 12.
© -JD.ZUCKERLIP6
6
© J-D. ZUCKER LIP6
Les blocs avec arguments
Des paramËtres peuvent Ítre dÈclarÈes en tÍtedu bloc prÈcÈdÈs de :(:i) La dÈclaration est suivie dÕune barre vertical|eet du corps du bloc
voir := [ :expr | Transcript show: (expr printString)].
LÕÈvaluation et le transfert des arguments sont effectuÈs par les messages : value:unArguement value:arg1value:arg2value:arg3value:arg4
voir value: 12.
C) Conditionnelles
Messages ayant pour receveur un boolÈen et pour argument un bloc. Ils sont implÈmentÈs dans les classes : Boolean, TrueetFalse ifTrue: unBloc ifFalse: unBloc ifTrue: b1 ifFalse: b2 ifFalse: b1 ifTrue: b2
N = 0 ifTrue : [ÔouiÕ]. N = 0 ifTrue : [ÔouiÕ] ifFalse: [ÔnonÕ].
Exemple: Ecrire un bloc qui calcule la valeur absolue dÕun nombre.
D) Copier un objet (si simpleÉ)
7
© J-D. ZUCKER LIP6
9
© -JD.ZUCKERLIP6
11
La classe objet implÈmente la mÈthode copy : copy "Answer another instance just like the receiver. Subclasses normally override the postCopy message, but some objects should not be copied override copy." ^self shallowCopy postCopy
Ô 232 Õ copy #(1 34 55) copy C:= Compteur new. C copy
(Symbol la redÈfinit car ses instances sont uniques :-) shallowCopy "Answer the receiver because Symbols are unique." ^self © J-D. ZUCKER LIP6
Page 2
B) EgalitÈ et IdentitÈ
Distinguer entre:  =qui reprÈsentelÕÈgalitsÈtructurelle, et == quireprÈsentelÕidentit(ÈÈgalitÈ physique) ~= quireprÈsente liÕnÈgalitÈ structurelle ~~ quireprÈsente liÕnÈgalitÈ physique
ÔegalÕ = ÔegalÕ---> true mais ÔegalÕ == ÔegalÕ---> false
ÔegalÕ et ÔegalÕ sont de vrais jumeaux : ils ont la mÍme structure et le mÍme comportement mais ce sont deux entitÈs physiquement distinctes (leur adresse mÈmoire est diffÈrentes)
#egal == #egal ---> true(les symboles sont uniquesÉ) Ô #egal Õ ~= Ô #egalÕ ---> fa(lesechaines ne sont pas inÈgale structurellement)
Evaluation dÕune conditionnelle
N = 0 ifTrue : [Transcript show: Ôla valeur est nÈgativeÕ].
true
false
 instancede True False
ifTrue: aBlock ^aBlock value
Chapitre II: Les collections
Types de donnÈes ¥Tableaux ¥ChaÓnes ¥Ensembles ¥Listes (vectors) ¥Listes triÈs ¥Dictionnaires ¥Intervalles ¥Palettes de couleurs ¥Streams ¥...
ifFalse: aBlock ^nil
Classes SmallTalk Array String, Symbol Set, Bag LinkedList, OrderedCollection SortedCollection Dictionary Interval ColorPalette Stream
8
© J-D. ZUCKER LIP6
10
© J-D. ZUCKER LIP6
12
© J-D. ZUCKER LIP6
La classe Arrayc:rÈer des instances
¥Taille fixe dÈfinie au moment de la crÈation
¥CrÈation d'instances:new with:with:with: ... new:withAll: |unTableau| unTableau := Array new: 10. $#(nil nil nil nil nil nil nil nil nil nil)le tableau unTableau:= Array with: 33 with: 01 with 4. $le tableau#(33 1 4) unTableau:=Array new: 10 withAll: 2 $le tableau #(2 2 2 2 2 2 2 2 2 2) ¥On peut aussi directement Ècrire un tableau avec # |unTableau| unTableau := #(32 'flair' 333).
Classe Array: mÈthodes ÈvoluÈes
¥indexOf: #(1 2 3 'a' 'b' 'a') indexOf: 'a' ¥indexOfSubCollection:starttingAt: ¥lastIndexOf: ¥replaceAll:with: #(1 2 3 'a' 'b' 'a') replaceAll: 'a'with: 'A' la virgule "," est l'opÈrateur de concatÈnation #(a b), #(c d)
Les itÈrateurs: do:, reverseDo: etc. voir la suite.
Class Collection ¥Taille dynamique
$4
13
© J-D. ZUCKER LIP6
15
$#(1 2 3 'A' 'b' 'A')
$#(#a #b #c #d)
¥CrÈation d'instances:new with:with:with: ... withAll: |uneColl| uneColl := OrderedCollection new size. $0 ¥add:ajout : |uneColl| uneColl := OrderedCollection new add: 33. ¥suppression :remove: si l'objet n'est pas trouvÈ l'objet s'envoit notFoundError. ¥inclusion includes:
© J-D. ZUCKER LIP6
17
© J-D. ZUCKER LIP6
Page 3
La classe Array:accÈder et modifier
¥On peut mettre plusieurs objets de n'importe quel type
¥MÈthodeat: #('bon' 33 'jour') at: 3 $'jour' ¥MÈthode at:put: |unTableau| unTableau:=Array new: 10 withAll: 2. unTableau at: 4 put: 6666 $#(2 2 2 6666 2 2 2 2 2 2) ¥Les autres mÈthodesl:aatAll:put:st first atAllPut: et ((Array new:10) atAllPut: 'titi' ) atAll: #(26 10) put: 'toto' $#('titi' 'toto' 'titi' 'titi' 'titi' 'toto' 'titi' 'titi' 'titi' 'toto')
Classe Interval
¥CrÈÈr un intervalle: |unIntervalle| unIntervalle := 1 to: 1
Ô to: Õ mÈthode de
Classe Number to: stop ^Interval from: self to: stop by: 1
Class OrderedCollection et SortedCollection Comme Array mais avec la possibilitÈ de supprimer et ajouter ¥add: ¥addFirst: ¥addLast: ¥add:after:
14
© -JD.ZUCKERLIP6
16
© J-D. ZUCKER LIP6
18
SortedCollection, conserve l'ordre dans lequel les ÈlÈmens sont ajoutÈs par dÈfaut tri ascendant pour des nombres
|sc| sc:= SortedCollection new.
sc add: 4; add: 3; add: 1; add: 10.
$: SortedCollection (1 3 4 10)
|sc| sc:= SortedCollection sortBlock: [:x :y | (x credit) > (y credit)].
sc add: (Compte new); add: (Compte new); add: (Compte new).
© J-D. ZUCKER LIP6
Chapitre I C) Convertir des collections
¥conversion:asSet asArray asOrderedCollection asString ¥Receveur: unecollection ‡ convertir Exemple:
#(3 4 11 5 7 9 11 4) asSet $une instance de Set #(3 4 11 5 7 9)
#(3 4 11 5 7 9 11 4) asSet asArray retirre les doublons
Chapitre III. ItÈrations
¥ItÈrations conditionnelles:whileTrue: whileFalse: ¥Argument: un bloc (instance de BlockClosure) ¥Receveur:un bloc dont l'Èvaluation est un boolÈen Exemple:
19
© -JD.ZUCKERLIP6
21
|unTableau somdex| unTableau := #(8 16 32 64 256). somme := 0. index := 1. [index <= unTableau size] whileTrue:[ somme := somme + (unTableau at: index).  index:= index + 1]. somme. 383 © -JD.ZUCKERLIP6
23 Chapitre II. ItÈrations ¥ItÈrations conditionnelles:whileTrue: whileFalse: whileFalse whileTrue repeat ¥ImplÈmenteur:un bloc (instance de BlockClosure) ¥DÈfinition des mÈthodes whileTrue:unBlocwhileFalse:unBloc ^self value^self value ifTrue: [unBloc value.ifFalse: [unBloc value.  [selfvalue] whileTrue: unBloc][self value] whileTrue: unBloc]
Pour les itÈrations de la forrmepeatUntil
whileTrue ^[self value] whileTrue: []
whileTrue ^[self value] whileTrue: []
repeat ^self value  [selfvalue] repeat.
© J-D. ZUCKER LIP6
Page 4
20 Chapitre I: D) Un arbre de dÈcision pour choisir le type de collection accËs par clÈ externe ? oui non
clÈ entier ? non oui
duplication possible ? oui non
ajouts possibles Dictionary BagSet oui non Array fonction de tri ? oui non OrderedCollection SortedCollection LinkedList
ItÈrations (suite)
¥ItÈrations conditionnelles:whileTrue whileFalse repeat ¥Receveur:un bloc dont l'Èvaluation est un boolÈen. Exemples:
|n f| f:=1. n:=4. [f:= f * n. n := n - 1. n=1]whileFalse. ... [f:= f * n. n := n - 1. n>1]whileTrue. ... [n>1]whileTrue:[f:= f * n. n := n - 1.]. ... [n=1]whileFalse:[f:= f * n. n := n - 1.]. ... [ f:= f * n. n := n - 1. n = 1 ifTrue:[^f]]repeat.
Chapitre II. ItÈrations
¥ItÈrations numÈriques:timesRepeat: ¥Argument: un bloc quelconque ‡ exÈcuter ¥nombre de fois ‡ exÈcuter le bloc receveurReceveur: le Exemple:
10timesRepeat:[Transcript show: 'Test]. "ExÈcute le bloc 10 fois"
|n f| f:=1. n:=4. k:=n. ntimesRepeat:[ f:= f * k. k := k - 1.].
© J-D. ZUCKER LIP6
22
© -JD.ZUCKERLIP6
24
© -JD.ZUCKERLIP6
Chapitre II. ItÈrations ¥ItÈrations numÈriques:to:by:do: ¥Argument to:l'entier fin de l'intervalle de valeur ¥Argument by:l'incrÈment de l'intervalle ¥un bloc quelconqueArgument do: ¥Receveur: lepremier entier de l'intervalle de rÈpÈtition Exemple: parcourt les valeurs de l'intervalle
10 to: 65 by: 5 do: [:element | Transcript show: element printString; show: '---']
Le rÈsultat sera dans la fenÍtre du Transcript: 10---15---20---25---30---35---40---45---50---55---60---65
Pour un incrÈment Ègal ‡ 1, on utilise la mÈthode to:do:
Chapitre II. ItÈrations
¥ItÈrations numÈriques:timesRepeat to:by:do:to:do: ¥ImplÈmenteur:un nombre ¥DÈfinition des mÈthodes timesRepeat:b (self=0) ifTrue: [^nil]. b value. ^(self - 1) timesRepeat: b.
to:stopdo:aBlock (Interval from: self to: stop by: 1) do: aBlock
to:stopby:stepdo:aBlock (Interval from: self to: stop by: step) do: aBlock
Exemple plus complexe: la mÈthode shallowCopy
25
© -JD.ZUCKERLIP6
27
© -JD.ZUCKERLIP6
29
shallowCopy "Answer a copy of the receiver which  shares the receiver's instance variables."  <primitive: 532>  | class newObject index |  class := self class.  class isVariable" teste si lÕobjet est indexableª ifTrue: [newObject:= class basicNew: (index := self basicSize).  1to: index do:  [:i| newObject basicAt: i put: (self basicAt: i)]] ifFalse:[newObject := class basicNew].  1to: class instSize do:  [:i| newObject instVarAt: i put:(self instVarAt: i)].  ^newObject©P6KEUCLIR-J.DZ
Page 5
Chapitre II. ItÈrations ¥ItÈrations numÈriques:to:do: ¥l'entier fin de l'intervalle de valeurArgument to: ¥Argument do:un bloc quelconque ¥premier entier de l'intervalle de rÈpÈtitionReceveur: le Exemple:
65 to: 122 do: [:codeAscii |  Transcript show: codeAscii asCharacter printString]
|somme i| somme :=0. 1 to: 100 do: [ :i | somme := somme + i]. somme 5050
ItÈrations ¥ItÈrations de collections:do: (boucle simple) ¥Argument: un bloc (instance de BlockClosure) ¥Receveur:une collection Exemple:
Pour ÈnumÈrer la collection
'abcd'do:  [:element| Transcript show: (unElement printString); cr]
| somme | #(10 20 40) do: [:c | somme:= somme + c]. somme
26
© J-D. ZUCKER LIP6
28
© J-D. ZUCKER LIP6
30 ItÈrations ¥ItÈrations de collections:reject:select: (resp.p)our filtrer (resp. rejeter) ¥Argument: un bloc (instance de BlockClosure) ¥Receveur:une collection Exemple: Les ÈlÈments pour lesquels le bloc est ÈvaluÈ ‡ true (resp. false) sont stockÈs dans une nouvelle collection qui sera retournÈe en valeur
'Salut les gars' select: [:car | car ~= (Character space)] $'Salutlesgars'
#(1 2 3 24 45) select: [:i | i > 15] $#(24 45) |a tab |
a:=0. tab:= #(1 2 15 18 20). (tab select: [:i | i > 15]) do: [:c | a := a +c]
© -JD.ZUCKERLIP6
ItÈrations ¥ItÈrations de collections:detect:etcollect: ¥Argument: un bloc (instance de BlockClosure) ¥Receveur:une collection Exemple: retourne le premier ÈlÈment qui vÈrifie les conditions du bloc #(#(1 2) #(1 2 4) #(2 4 6))detect: [:element | (element size) = 3] $#(1 2 4) listeDesComptes detect: [:c | (c credit) > 1000 ] Retourne la collection contenant chaque Èvaluation sur chaque ÈlÈment.
'salut les gars' collect: [:car | car asUppercase] $'SALUT LES GARS'
31
© J-D. ZUCKER LIP6
33 ItÈrations ¥ItÈrations de collections:inject:into: ¥une valeur (initialisation du premier argument)Argument 1: ¥Argument 2:un bloc ‡ 2 arguments ¥Receveur:une collection Exemple: (1 to: 4) inject: 1 into: [:f :suivant | f * suivant ] $24 f est initialisÈe ‡ 1 (argument de inject:) et multipliÈ par les valeurs successives de suivant qui parcourt l'intervalle [1 4].
Evite les variables locales Pas de rÈfÈrences ‡ des variables extÈrieures au bloc. Gain de performances.
© J-D. ZUCKER LIP6
35 Chapitre III. Retour sur Instance/Classe/MÈta-classe (2/2) Object
Compte
Compte class
Behavior
ClassDescription
Class
Object class
Behavior class
ClassDescription class
Class class
Metaclass
Metaclass class
© J-D. ZUCKER LIP6
Page 6
32 Un exemple dÕutilisatiodnetectfort utile pour les Ètourdi(e)s...:
Dans la mÈthode de la classe Class: subclass: tinstanceVariableNames: fclassVariableNames: dpoolDictionaries: scategory: cat ´ On met au dÈbut ce qui suit ª blocktest := [:sc | sc printString = t asString]. test := (self allSubclasses detect: blocktest ifNone: [nil]) isNil. errmsg := [^Dialog warn: 'La classe ' , self printString , ' possËde dÈj‡ une sous-classe ' , t asString]. test ifFalse: errmsg.
© J-D. ZUCKER LIP6
34 Chapitre III. Retour sur Instance/Classe/MÈta-classe (1/2)
Object
Compte
CompteDevise
NÕoubliez-pas !!!
Metaclass class
Object class
Compte class
CompteDevise class
Metaclass
© J-D. ZUCKER LIP6
36
Mardi 28/11/2000:Exam CMO‡ 8h30 en lieu et place du cours
© -JD.ZUCKERLIP6
  • Univers Univers
  • Ebooks Ebooks
  • Livres audio Livres audio
  • Presse Presse
  • Podcasts Podcasts
  • BD BD
  • Documents Documents