P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ ENTER ANY 11-DIGIT PRIME NUMBER TO CONTINUE... Articles | Connexion
 
~Les collections en Squeak

Précédent  
  Squeak  
  Suivant
 Présentation

Les collections représentent des structures de données garantissant la gestion d'agrégats d'objets. Ces collections ont une importance capitale lors du développement d'applications. Squeak propose heureusement de nombreuses manières de les gérer.
 Sommaire


 Introduction

Le langage Squeak offre un ensemble extrêmement riche de collections. Une telle diversité est justifiée par toutes les considérations applicables aux collections : les éléments possèdent-ils une clé associée, les doublons sont-ils acceptés, l'accès est-il séquentiel. A chacune de ces questions, Squeak apporte une solution.

Les collections de Squeak se trouvent réparties entre huit catégories distinctes. Vous trouverez la liste des catégories suivantes dans le "System Browser" :
  • Collection-Abstract : les classes abstraites définissant les méthodes communes à toutes les autres collections
  • Collection-Unordered : contient les collections non ordonnées (comme les dictionnaires)
  • Collection-Sequenceable : contient les collections ordonnées (listes chaînées, listes triées.)
  • Collection-Text : accueille les collections dont les éléments sont des caractères, la classe String appartient à cette catégorie
  • Collection-Arrayed : les collections de taille fixe se trouvent dans cette catégorie (les tableaux par exemple)
  • Collection-Streams : les flux de parcours des collections
  • Collection-Weak : recèle le pendant "faible" de certaines autres collections. Les éléments de ces collections peuvent se voir éliminés par le garbage-collector
  • Collection-Support : la dernière catégorie ne contient que des classes d'aide à l'implémentation des collections

Chaque collection implémentée au cour de Squeak hérite de la classe abstraite Collection. Pour découvrir les généralités relatives aux collections nous prendrons pour exemple les collections Bag et Array. La première décrit une collection non ordonnée autorisant les doublons et la seconde de simples tableaux. Au cours de notre introduction à Squeak, nous avions appris à déclarer un tableau sous forme littérale : #('hello' 1 Squeak).


 Méthodes d'ajout

La création d'une nouvelle collection implique nécessairement l'ajout ultérieur d'éléments en son sein. Deux méthodes existent pour y parvenir. La première consiste à remplir la collection dès sa création. Ce système restreint l'ajout à six éléments au maximum et s'emploie de la sorte :

Bag with: 'who': with 'grep blonde': with 'date'.
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Le second système, plus classique, consiste à créer la collection dans un premier temps puis à appeler des méthodes d'ajout d'éléments. Par exemple :

a := Bag new.
a add: 'cd ~'; add: 'unzip'; add: 'touch'; add: 'finger'.
       
      
JextCopier dans Jext
Le message add: désigne le message d'ajout le plus simple. Trois autres messages sont à votre disposition : addAll: pour ajouter une collection complète, add:withOccurences: pour ajouter n fois l'élément et addIfNotPresent: qui ajoute l'élément si et seulement s'il n'existe pas déjà dans l'agrégat. Ces méthodes ne s'appliquent évidemment pas aux tableaux (qui possèdent une taille fixe).


 Méthodes de suppression

Afin de retirer des éléments depuis une collection, Squeak propose cinq messages répartis dans le protocole "removing" de la classe Collection. Le premier de ces messages, remove:, supprime l'élément passé en paramètre. Si ce dernier n'est pas trouvé, une erreur se voit générée. Nous pouvons éviter cet écueil grâce au message remove:ifAbsent: qui interprète le bloc d'exécution en second argument en cas d'échec :

a := Bag with: 1 with: 3 with: 5.
a remove: 2 ifAbsent: [Transcript show: 'Élément introuvable'].
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Similaire au premier message, removeAll: ôte de la collection tous les éléments précisés. Pour ne pas générer d'erreur, removeAllFoundIn: ne supprime que les éléments présents dans la collection. Enfin, le message removeAllSuchThat: retire tous les éléments pour lesquels l'évaluation du bloc d'exécution renvoie vrai. Ainsi si vous souhaitez retirer tous les éléments pairs d'une suite de nombres :

a := Bag with: 1 with: 2 with: 3 with: 4 with: 5 with: 6.
a removeAllSuchThat: [:e | e even].
       
      
JextCopier dans Jext

 Enumération des collections

Le protocole "enumerating" propose vingt-trois méthodes d'énumération. Ces méthodes comptent parmi les plus importantes dans la gestion des collections. Celles-ci servent en effet à parcourir les collections, mais aussi à appliquer des traitements sur les éléments. La méthode d'énumération la plus simple s'intitule do: dont en voici un exemple :

a := Bag new.
#(1 2 3 4 5 6) do: [: e | e odd ifTrue: [a add: e]].
Transcript show: a.
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Ces quelques lignes insèrent dans la collection "a" les éléments impairs du tableau énuméré. Le message do: possède deux cousins appelés do:separatedBy: et do:without:. Le premier exécute le bloc argument de separatedBy:: entre deux éléments énumérés. Le second message énumère la collection en sautant les éléments correspondant à l'argument without:. Squeak contient des messages de sélection, employés pour filtrer les listes. Par exemple, le message select: octroie l'opportunité de ne conserver que les éléments de la collection satisfaisant à la condition précisée :

#(1 2 3 4 5 6) select: [:e | e odd].
       
      
JextCopier dans Jext
Cette ligne ne conserve que les éléments impairs de la collection. L'instruction inverse de select: s'intitule reject: et se programme de la même façon. Équivalant à de la fonction map() en Python, le message collect: applique un bloc d'exécution à chaque élément de la collection. C'est pour cela que la ligne suivante donne le cosinus de chaque nombre :

#(1 2 3 4 5 6) collect: [:e | e cos].
       
      
JextCopier dans Jext
Lors de la manipulation de chaînes de caractères, les programmeurs recherchent souvent l'indice d'un élément donné. Squeak permet ceci de manière plus générique par l'entremise du message detect: qui renvoie le premier élément permettant l'évaluation à vrai du bloc argument (ici nous obtiendrons 2) :

#(1 2 3 4 5 6) detect: [:e | e even].
       
      
JextCopier dans Jext
Lorsque aucun élément ne peut satisfaire le bloc d'exécution, Squeak renvoie un message d'erreur. A l'instar de remove:ifAbsent: nous pouvons éviter l'erreur en invoquant la méthode detect:ifNone:. La manipulation des collections en Squeak se voit grandement simplifiée par la présence de nombreuses méthodes triviales mais salvatrices en terme de temps de développement. Citons ainsi detectMin:, pour capturer le plus petit élément d'une collection, detectMax:, detectSum:, anySatsify: pour savoir si au moins un élément de la liste se soumet à la condition précisée, allSatisfy: pour s'assurer que tous les éléments se plient à une condition, difference: et union: réalisent quant à elles des opérations ensemblistes.


 Collections détaillées

Lors de notre prochaine étape au cour de Squeak, nous découvrirons plus précisément quelques-uns unes des collections les plus utiles telles que les dictionnaires, les listes chaînées ou encore les listes triées. Leur étude nous sera grandement simplifiée par l'utilisation des connaissances acquises ce mois-ci.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006


Précédent  
  Squeak  
  Suivant

 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE