XII. Méthodes de recherche▲
XII-A. Introduction▲
Au chapitre précédent, nous avons appris les méthodes. Nous avons écrit nous-même (le corps de) deux méthodes, mais nous en avons également utilisé une fournie par Apple. setIntValue: était la méthode pour afficher la valeur d'un entier dans l'objet champ de texte. Comment avez-vous découvert les méthodes appropriées ?
Souvenez-vous, pour toute méthode qui a été créée par Apple, vous n'avez aucun code à écrire vous-même. Mieux, il a plus de chance d'être exempt de bogue. Aussi, ça vaut toujours la peine de prendre le temps de vérifier si les méthodes appropriées sont disponibles avant de programmer les vôtres.
XII-B. Exercice▲
Dans Interface Builder, si vous laissez le curseur sur un objet de la fenêtre de palettes, un petit label apparaît. Si vous laissez le curseur au-dessus de l'icône du bouton, vous verrez "NSButton". Si vous le laissez au-dessus du texte indiquant "System Font Text", vous verrez "NSTextField". Chacun de ces noms est un nom de classe. Examinons la classe NSTextField pour voir quelles méthodes sont appropriées.
Allez dans Xcode, et, dans le menu, sélectionnez Help (Aide) ? Documentation. Dans le cadre de gauche, sélectionnez Cocoa, puis tapez "NSTextField" dans le champ de recherche (assurez-vous que le mode de recherche API (Application Programming Interface = Interface de programmation) est sélectionné ; voir la capture d'écran ci-dessous). Au fur et à mesure de votre frappe, la liste des résultats se réduit de façon significative et vous verrez bientôt apparaître NSTextField au sommet.
Cliquez sur la ligne NSTextField (du type Class) pour obtenir des informations sur la classe NSTextField, affichées dans le cadre du dessous.
Naviguer dans la documentation Cocoa avec Xcode
La première chose que vous devrez remarquer est que cette classe hérite d'une série d'autres classes. La dernière de la liste est celle qui commande, la reine NSObject. Un peu plus bas (faites défiler), il y a la rubrique :
Method Types (types de méthodes)
C'est là que nous allons commencer notre recherche. Un rapide coup d'œil aux sous-rubriques nous apprendra que nous n'allons pas trouver ici la méthode dont nous avons besoin pour afficher une valeur dans l'objet champ de texte. En raison du principe de l'héritage, nous devons aller voir la super classe immédiate de la classe NSTextField, qui est NSControlNSControlNSControl (et si nous échouons, nous devons examiner minutieusement sa super classe NSView, etc.). Puisque toute la documentation est en HTML, tout ce que nous avons à faire est de cliquer sur le mot (dans la liste Inherits From (Hérite de), comme indiqué ci-dessus). Ceci nous amène aux informations de la classe :
NSControl
Hérite de NSView : NSResponder : NSObject
Vous pouvez voir que nous nous sommes déplacés d'une classe au-dessus (avant, on avait NSControl : NSView : NSResponder : NSObject). Dans la liste de méthodes, on remarque une sous-rubrique (la 5°) :
Setting the control's value (régler la valeur de contrôle)
C'est ce que nous voulons, nous voulons définir une valeur. En dessous de cette sous-rubrique, on trouve :
- setIntValue:
Cela semble prometteur, aussi nous consultons la description de cette méthode en cliquant sur le lien setIntValue:.
setIntValue:
- (void)setIntValue:(int)unEnt
Définit la valeur de la cellule destinataire (ou cellule sélectionnée) à l'entier unEnt. Si la cellule est en cours d'édition, il avorte toute édition avant de définir la valeur ; si la cellule n'hérite pas de NSActionCell, il marque l'intérieur de la cellule comme devant être réaffichée (NSActionCell effectue sa propre mise à jour des cellules).
Dans notre application, notre objet NSTextField est le destinataire, et nous devons lui fournir un entier. Nous pouvons aussi voir ça depuis la signature de la méthode :
-
(
void
)setIntValue:(
int
)unEnt
En Objective-C, le signe moins marque le début d'une déclaration de méthode d'instance (par opposition à une déclaration de méthode de classe, dont nous parlerons plus tard). void indique que rien n'est retourné à l'invoqueur de la méthode. C'est à dire que lorsque nous envoyons un message setIntValue: à textField, notre objet MAFoo ne reçoit pas une valeur en retour de l'objet champ de texte. On est d'accord. Après le deux-points, (int) indique que la variable unEnt doit être un entier. Dans notre exemple, nous envoyons une valeur de 5 ou 0, qui sont des entiers, donc ça va.
Parfois, il est un peu plus difficile de découvrir la méthode appropriée à utiliser. Vous vous améliorerez en vous familiarisant avec la documentation, donc entraînez-vous.
Que faire si vous voulez lire la valeur de notre objet champ de texte textField ? Vous vous souvenez du point important concernant les fonctions, à savoir que toutes les variables à l'intérieur étaient protégées ? Il en va de même pour les méthodes. Cependant, les objets ont souvent une paire de méthodes connexes, dites "Accessors (Accesseurs)", une pour lire la valeur, et une pour définir la valeur. Nous connaissons déjà la dernière, c'est la méthode setIntValue:. La première ressemble à ça :
//[1]
-
(
int
) intValue
Comme vous pouvez le voir, cette méthode retourne un entier. Donc, si nous voulons lire la valeur de l'entier associée à notre objet textfield, nous devons de lui envoyer un message de ce genre:
//[2]
int
resultReceived =
[textField intValue];
Encore une fois, dans les fonctions (et les méthodes) tous les noms des variables sont protégés. C'est formidable pour les noms de variables, parce que vous n'avez pas à craindre que la définition d'une variable dans une partie de votre programme affecte une variable du même nom dans votre fonction. Toutefois, les noms de fonctions doivent toujours être uniques dans votre programme. Objective-C va plus loin dans la protection : les noms de méthode doivent être uniques au sein d'une seule classe, mais différentes classes peuvent avoir des noms de méthode en commun. C'est une grande fonctionnalité pour les gros programmes, car les programmeurs peuvent écrire des classes indépendantes les unes des autres, sans avoir à craindre des conflits dans les noms de méthodes.
Mais il y a mieux. Le fait que différentes méthodes dans des classes différentes peuvent avoir le même nom est appelé polymorphisme en terme branché (et en grec, bien sûr), et c'est l'une des choses qui rend la programmation orientée-objet si particulière. Elle vous permet d'écrire des morceaux de code, sans devoir connaître par avance quelles sont les classes des objets que vous manipulez. La seule chose nécessaire c'est que, au moment de l'exécution, les objets comprennent les messages que vous leur envoyez.
En utilisant le polymorphisme, vous pouvez écrire des applications qui sont flexibles et extensibles de par leur conception. Par exemple, dans l'application graphique que nous avons créée, si on remplace le champ de texte par un objet d'une autre classe qui est capable de comprendre le message setIntValue:, notre application marchera toujours sans nous demander de modifier notre code, ou même de le recompiler. Nous pouvons même modifier l'objet au moment de l'exécution sans rien casser. C'est là que réside la puissance de la programmation orientée objet.