---
title: "Acción a distancia (programación informática)"
type: "antipattern"
slug: "action-at-a-distance"
url: "http://localhost:3000/es/antipatterns/action-at-a-distance.md"
description: "Antipatrón"
---
# Acción a distancia (programación informática)

> Antipatrón

La **acción a distancia** es un [antipatrón](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") de la [informática](https://en.wikipedia.org/wiki/Computer%5Fscience "Computer science") en el que el comportamiento de una parte de un [programa](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") varía drásticamente en función de [operaciones](https://en.wikipedia.org/wiki/Instruction%5F%28computer%5Fscience%29 "Instruction (computer science)") difíciles o imposibles de identificar en otra parte del programa.

La manera de evitar los problemas asociados a la acción a distancia es un buen diseño, que evite las [variables globales](https://en.wikipedia.org/wiki/Global%5Fvariable "Global variable") y altere los datos solo de forma controlada y [local](https://en.wikipedia.org/wiki/Subprogram#Local%5Fvariables,%5Frecursion%5Fand%5Freentrancy "Subprogram"), o el uso de un estilo de [programación funcional pura](https://en.wikipedia.org/wiki/Pure%5Ffunctional%5Fprogramming "Pure functional programming") con [transparencia referencial](https://en.wikipedia.org/wiki/Referential%5Ftransparency "Referential transparency").

El término se basa en el concepto de [acción a distancia](https://en.wikipedia.org/wiki/Action%5Fat%5Fa%5Fdistance "Action at a distance") de la física, que puede referirse a un proceso que permite a los objetos interactuar sin una partícula mediadora como el [gluón](https://en.wikipedia.org/wiki/Gluon "Gluon"). En particular, [Albert Einstein](https://en.wikipedia.org/wiki/Albert%5FEinstein "Albert Einstein") se refería a la [no localidad cuántica](https://en.wikipedia.org/wiki/Quantum%5Fnonlocality "Quantum nonlocality") como «acción fantasmal a distancia».

Los [errores de software](https://en.wikipedia.org/wiki/Software%5Fbug "Software bug") debidos a la acción a distancia pueden surgir porque un componente del programa hace algo en el momento equivocado o afecta a algo que no debería. Sin embargo, es muy difícil rastrear qué componente es el responsable. Los [efectos secundarios](https://en.wikipedia.org/wiki/Side%5Feffect%5F%28computer%5Fscience%29 "Side effect (computer science)") de acciones aparentemente inocentes pueden dejar el programa en un estado desconocido, de modo que los datos locales no son necesariamente locales. La solución en este escenario concreto es definir qué componentes deben interactuar con cuáles otros. Un buen diseño 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 la acción a distancia.

## Ejemplo

Este ejemplo, del lenguaje de programación [Perl](https://en.wikipedia.org/wiki/Perl "Perl"), demuestra un caso especialmente grave de acción a distancia (obsérvese que la variable `$[` quedó [obsoleta](https://en.wikipedia.org/wiki/Deprecation "Deprecation") en versiones posteriores de Perl):

> Los índices de los [arrays](https://en.wikipedia.org/wiki/Array%5Fdata%5Ftype "Array data type") normalmente empiezan en 0 porque el valor de `$[` normalmente es 0; si pones `$[` a 1, entonces los arrays empiezan en 1, lo que hace felices a los programadores de [Fortran](https://en.wikipedia.org/wiki/Fortran "Fortran"), y por eso vemos ejemplos como este en la [página de manual](https://en.wikipedia.org/wiki/Man%5Fpage "Man page") de `perl(3)`:
>
> foreach $num ($[ .. $#entry) {
>    print "  $num\t'",$entry[$num],"'\n";
> }
>
> Y, por supuesto, podrías poner `$[` a 17 para hacer que los arrays empiecen en un número arbitrario como 17 o 4 en lugar de en 0 o 1\. Esta era una magnífica manera de sabotear a los autores de módulos.
>
> Por fortuna, prevaleció la cordura. Ahora se reconoce que estas características fueron errores. La lista de correo perl5-porters tiene ahora una expresión para esas características: las llaman «acción a distancia». El principio es que una declaración en una parte del programa no debería alterar drástica e invisiblemente el comportamiento de otra parte del programa.

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

## Acción a distancia entre objetos

Una [programación orientada a objetos](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") adecuada implica principios de diseño que evitan la acción a distancia.

La [ley de Deméter](https://en.wikipedia.org/wiki/Law%5Fof%5FDemeter "Law of Demeter") establece que un objeto solo debería interactuar con otros objetos cercanos a él. Si se requiere una acción en una parte distante del sistema, esta debería implementarse propagando un mensaje. Un buen diseño limita drásticamente las apariciones de la acción a distancia, lo que contribuye a programas mantenibles. La presión por crear una [orgía de objetos](https://en.wikipedia.org/wiki/Object%5Forgy "Object orgy") surge de un diseño deficiente de la interfaz, tal vez en forma de un [objeto todopoderoso](https://en.wikipedia.org/wiki/God%5Fobject "God object"), de no implementar verdaderos objetos o de no respetar la ley de Deméter.

Una de las ventajas de la [programación funcional](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming") es que la acción a distancia se minimiza, a veces hasta el punto de ser imposible de expresar en absoluto en el lenguaje de origen.

Ser consciente del peligro de permitir la acción a distancia en un diseño, y ser capaz de reconocer la presencia de la acción a distancia, es útil para desarrollar programas correctos, fiables y mantenibles. Dado que la mayor parte del coste de un programa puede recaer en la fase de mantenimiento, y que la acción a distancia hace que el mantenimiento sea difícil, costoso y propenso a errores, merece la pena dedicar esfuerzo durante el diseño a evitarla.
