La acción a distancia es un antipatrón en la informática en el que 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 variables globales y altere los datos solo de manera controlada y local , o el uso de un estilo de programación puramente funcional 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 espeluznante a distancia".
Los errores de software debidos a una acción a distancia pueden surgir porque un componente del programa está haciendo algo en el momento equivocado o 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 el 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 deben interactuar con qué otros. Un diseño adecuado que defina con precisión la interfaz entre las partes de un programa y que evite estados compartidos puede eliminar en gran medida los problemas causados por la acción a distancia.
Ejemplo
Este ejemplo, del lenguaje de programación Perl , demuestra un caso especialmente serio de acción a distancia (tenga en cuenta 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 lo establece$[
en 1, las matrices comienzan en 1, lo que hace felices a los programadores de Fortran , por lo que vemos ejemplos como este en laperl(3)
página del manual :foreach $ num ( $ [ .. $ # entrada ) { imprimir "$ num \ t '" , $ entrada [ $ num ], "' \ n" ; }Y, por supuesto, puede establecer
$[
en 17 para que las matrices comiencen en un número aleatorio, como 17 o 4, en lugar de 0 o 1. Esta fue una excelente manera de sabotear a los autores de módulos.Afortunadamente, prevaleció la cordura. Ahora se reconoce que estas características han sido errores. La lista de correo de perl5-porters ahora tiene un eslogan para tales características: se llaman "acción a distancia". El principio es que una declaración en una parte del programa no debería alterar de manera drástica e invisible el comportamiento de alguna otra parte del programa.
- Mark Jason Dominus, Sins of Perl Revisited [2]
Acción a distancia entre objetos.
La programación adecuada orientada a objetos 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 a él. Si se requiere una acción en una parte distante del sistema, entonces debe implementarse mediante la propagación de un mensaje. El diseño adecuado limita severamente la ocurrencia de acciones a distancia, contribuyendo a programas mantenibles. La presión para crear una orgía de objetos es el resultado de un diseño deficiente de la interfaz, tal vez tomando la forma de un objeto de Dios , sin implementar objetos verdaderos o sin prestar atención a la Ley de Deméter.
Una de las ventajas de la programación funcional es que se minimiza la acción a distancia, a veces hasta el punto de ser imposible de expresar en el lenguaje fuente.
Ser consciente del peligro de permitir la acción a distancia en un diseño y ser capaz de reconocer la presencia de acción a distancia es útil para desarrollar programas que sean correctos, confiables y mantenibles. Dado que la mayor parte del gasto de un programa puede estar en la fase de mantenimiento, y que la acción a distancia hace que el mantenimiento sea difícil, costoso y propenso a errores, vale la pena esforzarse durante el diseño para evitarlo.