Méthodes
Qu’est-ce qu’une méthode ? En programmation orientée objet, on n’opère pas directement sur les données de l’extérieur d’un objet ; au lieu de cela, on donne aux objets une espèce de compréhension de la façon dont ils doivent opérer sur eux-mêmes (quand on le leur demande gentiment). On peut dire qu’on passe des messages à un objet, et que ces messages vont généralement susciter quelque action ou réponse de la part de l’objet. Cela doit survenir sans que nous ayons nécessairement la connaissance ou le souci de ce qui se passe dans l’objet pour produire cet effet. Les tâches que nous avons le droit de demander à un objet d’accomplir (ou — c’est équivalent — les messages qu’il comprend) sont les méthodes de cet objet.
En ruby, on invoque une méthode d’un objet avec une notation par point (.) comme en C++ ou en Java. L’objet auquel on s’adresse est nommé à gauche du point.
ruby> "abcdef".length
6
Pour parler d’une façon très intuitive on « demande » à cet objet sa longueur. Pour parler plus technique, on invoque la méthode length de l’objet abcdef.
D’autres objets pourraient avoir une autre interprétation de length, ou même aucune. Les décisions sur la façon de répondre aux messages sont faites à la volée, pendant l’exécution du programme, et l’action résultante peut varier selon ce à quoi une variable se réfère.
ruby> foo = "abc"
"abc"
ruby> foo.length
3
ruby> foo = ["abcde", "fghij"]
["abcde", "fghij"]
ruby> foo.length
2
Ce que nous entendons par length peut varier selon l’objet dont nous parlons. La première fois que nous demandons à foo quelle est sa longueur, dans l’exemple ci-dessus, il s’agit d’une simple chaîne de caractères, et il n’y a qu’une seule réponse raisonnable. La seconde fois, foo se réfère à un tableau, et nous pouvons raisonnablement imaginer que la réponse soit 2, 5, ou 10 ; mais la réponse la plus courante sera bien sûr 2 (les autres réponses peuvent être obtenues si on veut).
ruby> foo[0].length
5
ruby> foo[0].length + foo[1].length
10
La chose à remarquer ici est qu’un tableau « sait » ce que être un tableau implique. Les données en ruby portent en elles des connaissances sur leur propre type, si bien que les demandes qu’on leur fait peuvent être automatiquement satisfaites de diverses façons. Ceci soulage le programmeur de la charge de mémoriser un grand nombre de noms de fonctions parce qu’un nombre relativement petit de noms de méthodes, correspondant aux concepts du langage naturel, peuvent s’appliquer à différents types de données avec pour chacun les résultats appropriés. Cette caractéristique des langages orientés objets (que, malheureusement, Java a faiblement exploité) est appelée le Polymorphisme.
Quand un objet reçoit un message qu’il ne comprend pas, une erreur est « soulevée » :
ruby> foo = 5
5
ruby> foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)
Il est donc nécessaire de savoir quelles sont les méthodes acceptables pour un objet, bien qu’il ne soit pas indispensable de savoir comment ces méthodes sont exécutées.
Si des arguments sont fournis à une méthode, ils sont généralement entourés de parenthèses,
object.method(arg1, arg2)
bien qu’elles puissent être omises si cela ne crée pas d’ambiguïté.
object.method arg1, arg2
Il y a en ruby une variable spéciale : self , qui se réfère à tout objet qui appelle la méthode. Ceci arrive si souvent que, par commodité, le “self.” soit omis pour les appels d’un objet à ses propres méthodes :
self.method_name(args...)
équivaut donc à
method_name(args...)
Cette forme qui ressemble à ce qui serait un appel de fonction en programmation classique, est en ruby une façon abrégée de noter les invocations de méthodes par self. Cela fait de ruby un langage purement orienté objet. Cela dit, les méthodes se comportent en ruby à peu près comme les fonctions d’autres langages de programmation, à l’avantage de ceux qui ne digèrent pas le fait que, en ruby, les « appels de fonction » soient vraiment des invocations de méthodes. Vous pouvez donc parler des fonctions comme si elles n’étaient pas vraiment des méthodes d’objets si vous voulez.
Précédent : GDU : Penser orienté-objet Suivant : GDU : Classes


