Développement et Conception objet - Licence 2, Université de Brest. Bernard Pottier Christophe Gouyen Alexandre Levieux
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Licence 2, Université de Brest.
Développement Bernard Pottier
Christophe Gouyen
et Conception objet Alexandre LevieuxCM1
❖ Introduction: IHM, plan et support du cours
❖ Stream : création, accès simples
!2A) Organisation des cours
!3Supports documentaires : Moodle
http://wsn.univ-brest.fr/moodle
• Planches de cours, au
fil des semaines
• Fiches de TD/TP
• Corrigés
• Documents d’appuis
!4Support rédigé
http://wsn.univ-brest.fr/DevCOO/reference.pdf (200 pages)
!5Plateforme de développement
http://cincomsmalltalk.com (Linux/MacOS/Win), ISO 400Mo
!6Documentation sur la plateforme
export VISUALWORKS
/usr/local/vw83 … doc
Références professionnelles
pour les professionnels
!7On lit la documentation, on apprend
!8On étudie les exemples, on s’en sert
!9B) Contenus des cours
!10Programmation objet assistée
❖ Pratique d’un environnement objet moderne supportant des
librairies à jour
Paquetages
Classes
Eclairage syntaxique
Vérifications et aide
à la programmation
!11Un environnement ouvert
❖ Très efficace en
programmation Interface
Homme Machines
❖ Librairies : bases de
données, web, ftp,
réseaux…
❖ Flexibilité : serveurs et
clients web, processus avec
ou sans interface, accès au
système hôte (Unix)
!12Outils de développement « pros »
❖ Dévermineur,
mise au point du Store Paquetages
code
❖ Profiler,
observation des
algorithmes
❖ Reconstruction
d’images,
déploiements
❖ Gestionnaire de
versions Store
!13Plan et contenus
❖ Programmation structurée, flux d’entrée-sorties, fichiers
❖ Classes, mécanisme d’héritage, variables Exercices
❖ Rappels sur les structures de données
❖ Assemblage des composants, dépendances, ValueHolders
Projets
❖ Conception des interfaces standards, widgets
❖ Model Vue Controller, interfaces graphiques libres
❖ Outils : debugger, profiler, packager, gestion de versions
!14Session 1 : les Streams
en Ecriture en Lecture
s nextPut: obj obj := s next
avancée avancée
!15Streams : interfaces
❖ Définition : mécanismes | texte readStream ch1 str2 str3 |
texte := '1 + 2 + 3 * 4 font combien ?'.
readStream := texte readStream.
d’accès séquentiels opérant ch1 := readStream next.
str2 := readStream upTo: $+.
sur des collections, ou des str3 := readStream upTo: $+.
str4 := readStream upToEnd.
flots de données externes ^Array with: ch1 with: str3 with: str4
#($1 ' 2 ' ' 3 * 4 font combien ?')
❖ Usage : classes héritant de la
3 mots de vocabulaire:
classe abstraite Stream.
texte readStream “creation”
readStream next “lit 1 élément”
❖ Créations, puis opérations readStream upTo: $+ “lit n éléments”
!16Créations et usages simples
❖ Sollicitation à un | texte readStream writeStream str1 |
objet séquenceable texte := '1 + 2 + 3 * 4 font combien ?'.
readStream := texte readStream.
❖ Message “on:” à writeStream := String new writeStream. “puis”
str1 := readStream upTo: $*.
une sous-classe writeStream nextPutAll: str1.
^Array with: str1 with: writeStream contents
de Stream. #('1 + 2 + 3 ' '1 + 2 + 3 ')
| texte readStream writeStream str1 |
texte := '1 + 2 + 3 * 4 font combien ?'.
readStream := ReadStream on: texte.
writeStream := WriteStream on: String new.
…
!17Contenus et Fermetures
❖ Message close, | texte readStream writeStream str1
pour les streams contenu |
texte := '1 + 2 + 3 * 4 font combien ?'.
externes. readStream := texte readStream.
writeStream := String new writeStream.
str1 := readStream upTo: $*.
❖ Message contents writeStream nextPutAll: str1.
retourne le contenu := writeStream contents.
writeStream close.
contenu du ^Array with: str1 with: contenu
#('1 + 2 + 3 ' '1 + 2 + 3 ')
stream.
!18Lecture
❖ Message next, pour | texte readStream writeStream str1 str2
str3 |
lire un élément. texte := '1 + 2 + 3 * 4 font combien ?'.
readStream := texte readStream.
❖ Message str1 := readStream nextAvailable: 4.
str2 := readStream nextAvailable: 4.
nextAvailable: n, str3 := readStream nextAvailable: 4.
^Array with: str1 with: str2 with: str3
pour lire n #('1 + ' '2 + ' '3 * ')
éléments
!19Lecture sur condition
❖ upToEnd jusque la | texte readStream writeStream str1
ch2 str3 |
fin texte := '1 + 2 + 3 * 4 font
combien ?'.
❖ upTo: element readStream := texte readStream.
jusque, sans inclure str1 := readStream upTo: $+ .
ch2 := readStream next.
element str3 := readStream through: $*.
^Array with: str1 with: ch2 with: str3
❖ through: element #('1 ' Core.Character space '2 + 3
*')
jusque, en
retournant element
!20Ecriture simple et multiple
| texte writeStream |
❖ nextPut: element, écrit writeStream := String new writeStream.
élément writeStream nextPut: $1; space.
writeStream nextPutAll: 'ligne 1'.
❖ nextPutAll: elements écrit writeStream cr ; tab ; nextPut: $2.
une collection d’éléments writeStream nextPutAll: 'ligne 2'.
^writeStream contents
❖ cr écrit une retour de '1 ligne 1
chariot 2ligne 2'
❖ tab , space, lf écrit les
caractères non
imprimables.
!21Test et controle
❖ atEnd, sommes
nous à la fin ?
| texte readStream writeStream str1 ch2 str3 |
texte := ' 1 + 2 + 3 * 4 font combien ?'.
❖ setToEnd allons à writeStream := String new writeStream.
readStream := texte readStream.
la fin 1 to: 3 do: [:i| readStream position:(i*4) -1.
ch := readStream next.
writeStream nextPut: ch].
❖ position quelle est [ readStream atEnd] whileFalse: [ readStream next].
^Array with: writeStream contents
l’index courant with: readStream position
#('++*' 29)
❖ position: n allons à
la position n.
!22Résumé
❖ Créations: rs := coll readStream. rs := coll writeStream
❖ Lectures: o:= rs next. coll := nextAvailable: n. rws contents.
❖ coll := rs upTo: o. coll := rs through: o. rs upToEnd.
❖ Ecritures: ws nextPut: o. ws nextPutAll: coll.
❖ ws cr ; tab; space; lf. « caractères spéciaux »
❖ Contrôle: ws atEnd. ws close. i:= ws position.
❖ ws position:10
!23CM2
❖ Random et usages aléatoires pour les simulations
❖ Filename, accès aux fichiers portable.
!241) Générateur aléatoire : Random
| alea x |
❖ Random: classe alea := Random new.
proposant un Stream en x := alea next.
x « 0.18026235242386d »
lecture sur une séquence ————————————————-
de réels aléatoires, double | alea x |
alea := Random new.
précision, de [0,1[ (1 to:5) collect: [:i | ( alea next *2) truncated =1 ]
" #(false false true false true)"
❖ Après, on peut adapter le ————————————————
| alea numbers|
résultat du tirage à la alea := Random new.
classe souhaitée : Boolean, numbers := Set new.
10000 timesRepeat:
Integer, ColorValue… [ numbers add: (alea next * 10) truncated ].
numbers asSortedCollection asArray.
"#(0 1 2 3 4 5 6 7 8 9)"
!25Exemple : génération texte aléatoire
| length char ws alea code index|
ws := WriteStream on: String new.
❖ But: générer une alea := Random new.
chaine de caractères length := 20 + ( alea next * 20) truncated.
length timesRepeat: [
de longueur aléatoire index :=alea next * ($z asInteger - $a asInteger).
contenant des lettres code:= index truncated + $a asInteger.
char := Character value: code.
aléatoires. ws nextPut: char.].
^ ws contents
'cdeklluxenjhwjrkffqqmiycwdxgm'
!26Exemple : dessin aléatoire
❖ But: construire une Indication 1 : cadre du dessin
collection de 5 bounds := Rectangle origin: 1@1 corner: 200@200.
LineSegment aléatoires Indication 2 : un exemple de segment
ls := LineSegment from: 1@1 to: 20@20.
❖ Les segment sont inscrits
Indication pour Afficher : Geometric example
dans un rectangle bounds Voir référence ci-dessous
!27Code (Browser) et exécution (doIt)
| win g1 g2 comp |
win := ScheduledWindow model: nil label:
( 'drawing') minimumSize: 300@300.
g1 := (0 @ 0 extent: 100 @ 100) asFiller.
g2 := (100 @ 100 extent: 100 @ 100) asStroker.
comp := CompositePart new.
comp add: g1.
comp add: g2.
enPlein (asFiller)
win component: (BoundedWrapper on: comp).
win open
enCreux (asStroker)
Votre solution ?
!282) Fichiers portables: Filename
❖ Filename: classe pour
un nom de fichier
portable (Mac/Linux/Win) | fileName |
fileName := 'fichier1.txt' asFilename.
❖ fourni explicitement fileName exists . " false"
—————————————————————
❖ ou, saisi par dialogue fileNameString := Dialog requestFileName:
'name?'.
fileNameString isEmpty ifFalse: [
fileName := fileNameString asFilename.
^ fileName exists .]
"true"
!29Fichiers: Filename et Streams
« Etape 1 : Ecriture »
❖ Filename: répond aux | fileName ws rs texte |
messages readStream et fileName := 'fichier1.txt' asFilename.
ws := fileName writeStream.
writeStream par des ws nextPutAll: Date today printString ; cr ; close.
streams appropriés
« Etape 2 : Relecture »
fileNameString := Dialog requestFileName:
'name?'.
fileNameString isEmpty ifFalse: [
fileName := fileNameString asFilename.
rs := fileName readStream.
texte := rs upToEnd. rs close.
Dialog warn: texte]
!30Prédicats sur Filename
❖ Filename: supporte des
tests et des utilitaires.
« Statuts : Existe, peut écriture, peut lire ? »
Consulter cette classe, | fileName ws rs texte exists peutLire peutEcrire|
catégorie testing, fileName := 'fichier1.txt' asFilename.
fileName isEmpty ifFalse: [
instances
exists := fileName exists.
peutLire := fileName isReadable.
peutEcrire := fileName isWritable].
!31Fichiers: analyse de texte (a)
❖ Filename: l’exercice est « Write »
| fileName ws texte |
courant, analyser un fileName := 'fichier1.txt' asFilename.
texte := ‘Les sanglots longs
fichier de texte des violons
de l’automne
blessent mon coeur
d’une langueur monotone'.
❖ exemple : compter les ws := fileName writeStream.
ws nextPutAll: texte ; cr ; close.
lignes « Read »
fileNameString := Dialog requestFileName: 'name?'.
nbLigne := 0.
fileNameString isEmpty ifFalse: [ fileName := fileNameString
asFilename.
rs := fileName readStream.
[ rs atEnd ] whileFalse: [
line := rs upTo: Character cr.
nbLigne := nbLigne+1].
rs close.
Dialog warn: nbLigne printString ].
!32Fichiers: analyse de texte (b)
!33Fichiers: analyse imbriquée
Automate avec 2 boucles
imbriquées | fileName ws texte nbspaces spaces |
fileName := 'fichier1.txt' asFilename.
texte := '.. as above'.
❖ exemple : trouver le plus ws := fileName writeStream.
ws nextPutAll: texte ; cr ; close.
grand nombre de blancs
fileNameString := Dialog requestFileName: 'name?'.
sur une ligne. nbLigne := 0.
spaces := SortedCollection new.
fileNameString isEmpty ifFalse: [
❖ On casse le texte en lignes fileName := fileNameString asFilename.
rs := fileName readStream.
[ rs atEnd ] whileFalse: [
❖ On casse les lignes sur les line := rs upTo: Character cr.
nbLigne := nbLigne+1.
blancs rsLine := line readStream.
nbspaces := 0.
rsLine mots/blancs [ rsLine atEnd ] whileFalse: [
mot := rsLine upTo: Character space.
rs mot isEmpty ifFalse: [ nbspaces := nbspaces + 1]].
spaces add: nbspaces.].
line Dialog warn: spaces last printString ].
!34Vous pouvez aussi lire