La acción a distancia es un antipatrón en la ciencia informática en el cual el comportamiento en una parte de un programa varía enormemente en función de operaciones difíciles o imposibles de identificar en otra parte del programa.
La forma de evitar los problemas asociados a la acción a distancia es un diseño adecuado, que evite las variables globales y altere los datos sólo de forma controlada y local , o el uso de un estilo de programación funcional pura con transparencia referencial .
El término se basa en el concepto de acción a distancia en física, que puede referirse a un proceso que permite que los objetos interactúen sin una partícula mediadora como el gluón . En particular, Albert Einstein se refirió a la no localidad cuántica como "acción fantasmal a distancia".
Los errores de software debidos a acciones a distancia pueden surgir porque un componente del programa está haciendo algo en el momento equivocado o está afectando algo que no debería. Sin embargo, es muy difícil rastrear qué componente es responsable. Los efectos secundarios de acciones inocentes pueden poner al programa en un estado desconocido, por lo que los datos locales no son necesariamente locales. La solución en este escenario particular es definir qué componentes deberían interactuar con otros. Un diseño adecuado que defina con precisión la interfaz entre las partes de un programa y que evite los estados compartidos puede eliminar en gran medida los problemas causados por las acciones a distancia.
Este ejemplo, del lenguaje de programación Perl , demuestra un caso especialmente grave de acción a distancia (nótese que la $[
variable quedó obsoleta en versiones posteriores de Perl [1] ):
Los índices de matriz normalmente comienzan en 0 porque el valor de
$[
normalmente es 0; si se establece$[
en 1, las matrices comienzan en 1, lo que hace felices a los programadores de Fortran y Lua , y por eso vemos ejemplos como este en laperl(3)
página del manual :foreach $num ( $[ .. $#entrada ) { imprimir " $num\t'" , $entrada [ $num ], "'\n" ; }Y, por supuesto, se podía establecer
$[
en 17 que las matrices comenzaran en un número aleatorio, como 17 o 4, en lugar de 0 o 1. Esta era una excelente manera de sabotear a los autores de módulos.Afortunadamente, prevaleció la cordura. Ahora se reconoce que estas características fueron errores. La lista de correo perl5-porters tiene ahora un lema para estas características: se las llama "acción a distancia". El principio es que una declaración en una parte del programa no debería alterar de forma drástica e invisible el comportamiento de alguna otra parte del programa.
— Mark Jason Dominus , Los pecados de Perl revisitados [2]
Una programación orientada a objetos adecuada implica principios de diseño que evitan la acción a distancia.
La Ley de Deméter establece que un objeto solo debe interactuar con otros objetos cercanos. Si se requiere una acción en una parte distante del sistema, entonces se debe implementar propagando un mensaje. Un diseño adecuado limita severamente las ocurrencias de acción a distancia, lo que contribuye a que los programas sean mantenibles. La presión para crear una orgía de objetos es resultado de un diseño de interfaz deficiente, que tal vez adopte la forma de un objeto Dios , que no implemente objetos verdaderos o que no respete la Ley de Deméter.
Una de las ventajas de la programación funcional es que se le resta importancia a la acción a distancia, a veces hasta el punto de resultar imposible expresarla en el lenguaje de origen.
Ser consciente del peligro que supone permitir acciones a distancia en un diseño y poder reconocer su presencia resulta útil para desarrollar programas que sean correctos, fiables y fáciles de mantener. Dado que la mayor parte de los gastos de un programa pueden estar en la fase de mantenimiento, y que las acciones a distancia hacen que el mantenimiento sea difícil, costoso y propenso a errores, merece la pena hacer un esfuerzo durante el diseño para evitarlo.