Le butineur, outils de programmation et d'investigation dans le code de Smalltalk.

La partie supérieure comprend : la liste des catégories, la liste de classes d'une catégorie, sous la liste de classe, la sélection de 'instance' ou 'classe', puis la liste des protocoles et enfin la liste des messages d'un protocole.
La partie inférieure est une zone de texte dont le contenu varie selon les sélections.



On crée une nouvelle catégorie, (appel du menu avec le bouton du milieu de la souris).



On saisi le nom de la nouvelle catégorie (Une catégorie regroupe un ensemble de classes).


NameOfSuperclass subclass: #NameOfClass
	instanceVariableNames: 'instVarName1 instVarName2'
	classVariableNames: 'ClassVarName1 ClassVarName2'
	poolDictionaries: ''
	category: 'VL-Repartitions'
Quand la nouvelle catégorie est sélectionnée dans le butineur, un modèle pour la création de classe apparaît (ci-contre). On remplace alors les 'trous' par des mots bien choisis pour représenter ce que l'on veut.


Object subclass: #VLIndividu
	instanceVariableNames: 'nom amities '
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Repartitions'
Ici, une classe d'individus nommés et pouvant être (ou ne pas être) amis entre-eux.
Chaque individu saura s'il est ami, indifférent ou pas amis avec un autre, grâce à un dictionnaire associant 1 0 ou -1 à chaque alter ego.

Pour créer un individu, il faudra spécifier son nom:
VLIndividu class [instance creation]
nom: unNom
	^self new nom: unNom amities: (IdentityDictionary new)

Au moment de la création le nouvel individu mémorise son nom, et le dictionnaire d'amitiés donné en paramètre.
VLIndividu [initialization]
nom: unNom amities: unDictionnaire
	nom := unNom.
	amities := unDictionnaire


Pour imprimer un individu, on veut voir son nom.
VLIndividu [printing]
printOn: aStream
	aStream nextPutAll: '(individu ', nom, ')'


Pour écrire une nouvelle méthode, ou remplace le modèle suivant par des mots judicieusement choisis:
message selector and argument names
	"comment stating purpose of message"

	| temporary variable names |
	statements
Trois méthodes pour gérer l'amitié :
VLIndividu [amitie]
aime: unIndividu
	"pour dire que le récepteur aime l'argument"
	amities at: unIndividu put: 1
amitie: unIndividu
	"pour savoir si le récepteur aime l'argument"
	^amities at: unIndividu ifAbsent: [ 0 ]
nAimePas: unIndividu
	"pour dire que le récepteur n'aime pas l'argument"
	amities at: unIndividu put: -1

Maintenant créons des groupes d'individus où les relations serons connues entre tous les individus du groupe.
Object subclass: #VLGroupIndividu
	instanceVariableNames: 'individus'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Repartitions'
A la création d'un groupe, on initialise la variable 'individus' avec un ensemble vide.
VLGroupIndividu class [instance creation]
new
	^super new initialize
VLGroupIndividu [initialization]
initialize
	individus := IdentitySet new
Pour ajouter un individu à un groupe, demandons lui s'il aime ou pas chacun des individus du groupe, puis à chaque individu du groupe s'il aime ou pas la nouvelle recrue.
VLGroupIndividu [individus]
ajoute: unIndividu
	"pose les questions à l'utilisateur"
	| reponse |
	individus do: [:qqun |
		reponse := Dialog request: 'Est ce que ', unIndividu nom, ' aime ', qqun nom, ' ?'
			initialAnswer: 'oui / non / bof'.
		reponse = 'oui' ifTrue: [ unIndividu aime: qqun ].
		reponse = 'non' ifTrue: [ unIndividu nAimePas: qqun ] ].
	individus do: [:qqun |
		reponse := Dialog request: 'Est ce que ', qqun nom, ' aime ', unIndividu nom, ' ?'
			initialAnswer: 'oui / non / bof'.
		reponse = 'oui' ifTrue: [ qqun aime: unIndividu ].
		reponse = 'non' ifTrue: [ qqun nAimePas: unIndividu ] ].
	individus add: unIndividu

VLIndividu [accessing]

nom
	"les individus doivent donner leur nom"
	^nom


Le code source... à télécharger et à compiler dans Smalltalk (VisualWorks 2.5).
m a i l t o : v i @ a i . u n i v - p a r i s 8 . f r
Date de création: Vendredi 12 mars 1999.
Température extérieure: 10°.