---
title: "Action à distance (programmation informatique)"
type: "antipattern"
slug: "action-at-a-distance"
url: "http://localhost:3000/fr/antipatterns/action-at-a-distance.md"
description: "Anti-patron"
---
# Action à distance (programmation informatique)

> Anti-patron

**L’action à distance** est un [anti-patron](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") en [informatique](https://en.wikipedia.org/wiki/Computer%5Fscience "Computer science") dans lequel le comportement d’une partie d’un [programme](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") varie énormément en fonction d’[opérations](https://en.wikipedia.org/wiki/Instruction%5F%28computer%5Fscience%29 "Instruction (computer science)") difficiles, voire impossibles, à identifier dans une autre partie du programme.

La façon d’éviter les problèmes associés à l’action à distance consiste à adopter une conception appropriée, qui évite les [variables globales](https://en.wikipedia.org/wiki/Global%5Fvariable "Global variable") et ne modifie les données que de manière contrôlée et [locale](https://en.wikipedia.org/wiki/Subprogram#Local%5Fvariables,%5Frecursion%5Fand%5Freentrancy "Subprogram"), ou à recourir à un style de [programmation purement fonctionnelle](https://en.wikipedia.org/wiki/Pure%5Ffunctional%5Fprogramming "Pure functional programming") avec [transparence référentielle](https://en.wikipedia.org/wiki/Referential%5Ftransparency "Referential transparency").

Le terme repose sur le concept d’[action à distance](https://en.wikipedia.org/wiki/Action%5Fat%5Fa%5Fdistance "Action at a distance") en physique, qui peut désigner un processus permettant à des objets d’interagir sans particule médiatrice telle que le [gluon](https://en.wikipedia.org/wiki/Gluon "Gluon"). En particulier, [Albert Einstein](https://en.wikipedia.org/wiki/Albert%5FEinstein "Albert Einstein") qualifiait la [non-localité quantique](https://en.wikipedia.org/wiki/Quantum%5Fnonlocality "Quantum nonlocality") d’« action fantôme à distance ».

Les [bogues logiciels](https://en.wikipedia.org/wiki/Software%5Fbug "Software bug") dus à l’action à distance peuvent survenir parce qu’un composant du programme fait quelque chose au mauvais moment, ou affecte quelque chose qu’il ne devrait pas. Il est toutefois très difficile de déterminer quel composant est responsable. Les [effets de bord](https://en.wikipedia.org/wiki/Side%5Feffect%5F%28computer%5Fscience%29 "Side effect (computer science)") d’actions anodines peuvent placer le programme dans un état inconnu, de sorte que les données locales ne sont pas nécessairement locales. La solution dans ce scénario particulier consiste à définir quels composants doivent interagir avec quels autres. Une conception appropriée, qui définit précisément l’interface entre les parties d’un programme et qui évite les états partagés, peut largement éliminer les problèmes causés par l’action à distance.

## Exemple

Cet exemple, tiré du langage de programmation [Perl](https://en.wikipedia.org/wiki/Perl "Perl"), illustre un cas particulièrement grave d’action à distance (notez que la variable `$[` a été [dépréciée](https://en.wikipedia.org/wiki/Deprecation "Deprecation") dans les versions ultérieures de Perl) :

> Les indices d’un [tableau](https://en.wikipedia.org/wiki/Array%5Fdata%5Ftype "Array data type") commencent normalement à 0 parce que la valeur de `$[` est normalement 0 ; si vous fixez `$[` à 1, alors les tableaux commencent à 1, ce qui réjouit les programmeurs [Fortran](https://en.wikipedia.org/wiki/Fortran "Fortran"), et l’on voit donc des exemples comme celui-ci dans la [page de manuel](https://en.wikipedia.org/wiki/Man%5Fpage "Man page") `perl(3)` :
>
> foreach $num ($[ .. $#entry) {
>    print "  $num\t'",$entry[$num],"'\n";
> }
>
> Et bien sûr, vous pourriez fixer `$[` à 17 pour que les tableaux commencent à un nombre arbitraire comme 17 ou 4 au lieu de 0 ou 1\. C’était un excellent moyen de saboter les auteurs de modules.
>
> Heureusement, la raison l’a emporté. Ces fonctionnalités sont aujourd’hui reconnues comme ayant été des erreurs. La liste de diffusion perl5-porters a désormais une expression toute faite pour de telles fonctionnalités : on les appelle « action à distance ». Le principe est qu’une déclaration dans une partie du programme ne devrait pas modifier radicalement et invisiblement le comportement d’une autre partie du programme.

— [Mark Jason Dominus](https://en.wikipedia.org/wiki/Mark%5FJason%5FDominus "Mark Jason Dominus"), Sins of Perl Revisited

## Action à distance entre objets

Une [programmation orientée objet](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") appropriée repose sur des principes de conception qui évitent l’action à distance.

La [loi de Déméter](https://en.wikipedia.org/wiki/Law%5Fof%5FDemeter "Law of Demeter") stipule qu’un objet ne devrait interagir qu’avec d’autres objets proches de lui. Si une action dans une partie distante du système est nécessaire, elle devrait être mise en œuvre en propageant un message. Une conception appropriée limite fortement les occurrences d’action à distance, ce qui contribue à des programmes maintenables. La tendance à créer une [orgie d’objets](https://en.wikipedia.org/wiki/Object%5Forgy "Object orgy") résulte d’une mauvaise conception des interfaces, prenant peut-être la forme d’un [objet dieu](https://en.wikipedia.org/wiki/God%5Fobject "God object"), de l’absence de véritables objets, ou du non-respect de la loi de Déméter.

L’un des avantages de la [programmation fonctionnelle](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming") est que l’action à distance y est minimisée, parfois au point d’être tout bonnement impossible à exprimer dans le langage source.

Être conscient du danger de laisser l’action à distance s’introduire dans une conception, et savoir reconnaître sa présence, est utile pour développer des programmes corrects, fiables et maintenables. Étant donné que l’essentiel du coût d’un programme peut se situer dans la phase de maintenance, et que l’action à distance rend la maintenance difficile, coûteuse et sujette aux erreurs, il vaut la peine de faire l’effort de l’éviter lors de la conception.
