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 Levieux
CM1 ❖ Introduction: IHM, plan et support du cours ❖ Stream : création, accès simples !2
A) Organisation des cours !3
Supports documentaires : Moodle http://wsn.univ-brest.fr/moodle • Planches de cours, au fil des semaines • Fiches de TD/TP • Corrigés • Documents d’appuis !4
Support rédigé http://wsn.univ-brest.fr/DevCOO/reference.pdf (200 pages) !5
Plateforme de développement http://cincomsmalltalk.com (Linux/MacOS/Win), ISO 400Mo !6
Documentation sur la plateforme export VISUALWORKS /usr/local/vw83 … doc Références professionnelles pour les professionnels !7
On lit la documentation, on apprend !8
On étudie les exemples, on s’en sert !9
B) Contenus des cours !10
Programmation objet assistée ❖ Pratique d’un environnement objet moderne supportant des librairies à jour Paquetages Classes Eclairage syntaxique Vérifications et aide à la programmation !11
Un 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) !12
Outils 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 !13
Plan 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 !14
Session 1 : les Streams en Ecriture en Lecture s nextPut: obj obj := s next avancée avancée !15
Streams : 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” !16
Cré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. … !17
Contenus 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. !18
Lecture ❖ 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 !19
Lecture 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 !20
Ecriture 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. !21
Test 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. !22
Ré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 !23
CM2 ❖ Random et usages aléatoires pour les simulations ❖ Filename, accès aux fichiers portable. !24
1) 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)" !25
Exemple : 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' !26
Exemple : 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 !27
Code (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 ? !28
2) 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" !29
Fichiers: 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] !30
Pré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]. !31
Fichiers: 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 ]. !32
Fichiers: analyse de texte (b) !33
Fichiers: 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 ]. !34
Vous pouvez aussi lire