Développement et Conception objet - Licence 2, Université de Brest. Bernard Pottier Christophe Gouyen Alexandre Levieux

La page est créée Patrice Benard
 
CONTINUER À LIRE
Développement et Conception objet - Licence 2, Université de Brest. Bernard Pottier Christophe Gouyen Alexandre Levieux
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