On aborde ici la manière standard d'initialiser les objets. Dans les exemples précédents, on a définit une classe Counter avec ses accesseurs et les méthodes Counter » increment
et Counter » decrement
.
Lors de cette première approche, on a initialisé la valeur d'instance via l'accesseur.
| aCounter | aCounter := Counter new. aCounter setCounter: 33. aCounter getCounter.
Cependant si on tente d'exécuter le code ci-dessous, on obtient une erreur:
"Ce extrait provoque une erreur" | aCounter | aCounter := Counter new. aCounter increment.
On essaie ici d'incrémenter la variable d'instance sans avoir utilisé auparavant l'accesseur (le setter). La variable d'instance n'est pas initialisée et Pharo lui donne par défaut la valeur nil
. Ce comportement par défaut ne nous intéresse pas vraiment ici et on voudrait par exemple avoir un compteur à zéro lors de l'instanciation.
Commençons par créer le test:
"CounterTest >> testInitialize"
testInitialize
"Create a Counter instance and verify counter default value"
| aCounter |
aCounter := Counter new.
self assert: aCounter getCounter equals: 0.
Si on exécute directement le test on obtient un échec du test avec le message “Got nil insted of 0”. On va pouvoir modifier notre classe Counter
pour satisfaire cette nouvelle exigence.
On va créer une méthode initialize
. Une bonne pratique consiste à commencer par envoyer le message initialise
à la classe parent.
"Counter >> initialize" initialize "set default value 0 for counter" super initialize. count := 0.
Après l'ajout de la méthode, le test réussi, la variable d'instance est correctement initialisée et le code proposé en introduction en générera plus d'erreur.
" Ces expressions sont maintenant valides, le compteur vaudra 1" | aCounter | aCounter := Counter new. aCounter increment.
Si à présent on souhaite créer un compteur avec une valeur par défaut que l'on choisit. On peut faire cela en créant une méthode de classe
On écrit la méthode de test
"CounterTest >> testStartingAtFive"
testStartingAtFive
|c|
c := Counter startingAt: 5.
self assert: c getCounter equals: 5.
On peut à présent créer la méthode de classe. Depuis la classe Counter
on sélectionne bien le bouton radio Class side
puis on clique sur l'onglet Class side method
"Counter >> startingAt:"
startingAt: anInteger
" Create a new counter object with initial value"
^ self new setCounter: anInteger.
Pour résumé on a introduit ici comment initialiser des objets et comment utiliser des méthodes de classe pour créer des objets avec des valeurs choisies.