La transmission de message est une manière différente de gérer le besoin en code OO pour un objet d'obtenir un autre objet (ou potentiellement lui-même) pour faire quelque chose.
Dans la plupart des langages modernes issus de l'approche C ++, nous le faisons avec des appels de méthodes. Dans ce cas, l'objet appelé (via sa définition de classe) met une grande liste des méthodes qu'il accepte, puis le codeur de l'objet appelant écrit simplement l'appel:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Pour les langages à typage statique, le compilateur peut alors vérifier le type de la chose appelée et confirmer que la méthode a été déclarée. Pour les langages à typage dynamique, cette opération est effectuée au moment de l'exécution.
Mais ce qui se passe essentiellement, c’est qu’un ensemble de variables est envoyé à un bloc de code spécifique.
Message en passant
Dans les langues de transmission de messages (telles que Objective C) au lieu de méthodes, il y a des destinataires, mais dans l’ensemble, l’approche consistant à les définir et à les appeler est sensiblement la même - la différence réside dans la manière dont elle est traitée.
Dans une langue de message passé, le compilateur peut vérifier que le destinataire que vous avez appelé existe, mais au pire, un avertissement apparaît pour vous avertir qu'il n'est pas sûr qu'il soit là. En effet, au moment de l'exécution, un bloc de code sur l'objet récepteur sera appelé en passant à la fois le groupe de variables et la signature du destinataire que vous souhaitez appeler. Ce bloc de code recherche alors le destinataire et l’appelle. Cependant, si le destinataire n'existe pas, le code renverra simplement une valeur par défaut.
En conséquence, l’une des bizarreries trouvées lors du passage de C ++ / Java -> Objective C comprend que vous pouvez "appeler une méthode" sur un objet qui n’a pas été déclaré dans le type de compilation et n’existait même pas le le type d'exécution ... et que l'appel ne se traduirait pas par une exception mais par un résultat renvoyé.
Les avantages de cette approche sont qu’elle aplatit la hiérarchie des sous-classes et évite la plupart des besoins en interfaces / héritage multiple / types de canard. Cela permet également aux objets de définir le comportement par défaut quand on leur demande de faire quelque chose pour laquelle ils n'ont pas de récepteur (généralement "si je ne le fais pas, transférez la demande à cet autre objet"). Il peut également simplifier la liaison aux rappels (par exemple, pour les éléments d'interface utilisateur et les événements programmés), en particulier avec des langages statiques tels que Java (le bouton appelle alors le destinataire "runTest" plutôt que la méthode "actionPerformed" de la classe interne). "RunTestButtonListener" qui effectue l'appel pour vous).
Cependant, il semblerait que le développeur ait besoin de vérifier que l'appel qu'il pense est en train de passer sur le bon objet avec le bon type et de transmettre les bons paramètres dans le bon ordre, car le compilateur pourrait ne pas le faire. vous avertir et il fonctionnera parfaitement au moment de l'exécution (en renvoyant une réponse par défaut). On peut également affirmer que les performances supplémentaires résultent de la recherche supplémentaire et du dépassement des paramètres.
De nos jours, les langages à typage dynamique peuvent donner beaucoup d'avantages du message passé à OO avec moins de problèmes.