---
title: "Action at a distance (programação de computadores)"
type: "antipattern"
slug: "action-at-a-distance"
url: "http://localhost:3000/pt-br/antipatterns/action-at-a-distance.md"
description: "Antipadrão"
---
# Action at a distance (programação de computadores)

> Antipadrão

**Action at a distance** (ação à distância) é um [antipadrão](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") na [ciência da computação](https://en.wikipedia.org/wiki/Computer%5Fscience "Computer science") no qual o comportamento de uma parte de um [programa](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") varia drasticamente com base em [operações](https://en.wikipedia.org/wiki/Instruction%5F%28computer%5Fscience%29 "Instruction (computer science)") difíceis ou impossíveis de identificar em outra parte do programa.

A maneira de evitar os problemas associados à action at a distance é um bom design, que evita [variáveis globais](https://en.wikipedia.org/wiki/Global%5Fvariable "Global variable") e altera dados apenas de maneira controlada e [local](https://en.wikipedia.org/wiki/Subprogram#Local%5Fvariables,%5Frecursion%5Fand%5Freentrancy "Subprogram"), ou o uso de um estilo de [programação puramente funcional](https://en.wikipedia.org/wiki/Pure%5Ffunctional%5Fprogramming "Pure functional programming") com [transparência referencial](https://en.wikipedia.org/wiki/Referential%5Ftransparency "Referential transparency").

O termo é baseado no conceito de [ação à distância](https://en.wikipedia.org/wiki/Action%5Fat%5Fa%5Fdistance "Action at a distance") na física, que pode se referir a um processo que permite que objetos interajam sem uma partícula mediadora como o [glúon](https://en.wikipedia.org/wiki/Gluon "Gluon"). Em particular, [Albert Einstein](https://en.wikipedia.org/wiki/Albert%5FEinstein "Albert Einstein") referiu-se à [não-localidade quântica](https://en.wikipedia.org/wiki/Quantum%5Fnonlocality "Quantum nonlocality") como "ação fantasmagórica à distância".

[Bugs de software](https://en.wikipedia.org/wiki/Software%5Fbug "Software bug") causados por action at a distance podem surgir porque um componente do programa está fazendo algo na hora errada ou afetando algo que não deveria. É muito difícil, no entanto, rastrear qual componente é o responsável. [Efeitos colaterais](https://en.wikipedia.org/wiki/Side%5Feffect%5F%28computer%5Fscience%29 "Side effect (computer science)") de ações inofensivas podem deixar o programa em um estado desconhecido, de modo que dados locais não são necessariamente locais. A solução nesse cenário específico é definir quais componentes devem interagir com quais outros. Um bom design, que define com precisão a interface entre as partes de um programa e que evita estados compartilhados, pode eliminar em grande parte os problemas causados pela action at a distance.

## Exemplo

Este exemplo, da linguagem de programação [Perl](https://en.wikipedia.org/wiki/Perl "Perl"), demonstra um caso especialmente grave de action at a distance (observe que a variável `$[` foi [descontinuada](https://en.wikipedia.org/wiki/Deprecation "Deprecation") em versões posteriores do Perl):

> Os índices de [arrays](https://en.wikipedia.org/wiki/Array%5Fdata%5Ftype "Array data type") normalmente começam em 0 porque o valor de `$[` normalmente é 0; se você definir `$[` como 1, então os arrays começam em 1, o que deixa os programadores [Fortran](https://en.wikipedia.org/wiki/Fortran "Fortran") felizes, e assim vemos exemplos como este na [man page](https://en.wikipedia.org/wiki/Man%5Fpage "Man page") do `perl(3)`:
>
> foreach $num ($[ .. $#entry) {
>    print "  $num\t'",$entry[$num],"'\n";
> }
>
> E, claro, você poderia definir `$[` como 17 para que os arrays começassem em algum número aleatório, como 17 ou 4, em vez de 0 ou 1\. Essa era uma ótima maneira de sabotar os autores de módulos.
>
> Felizmente, o bom senso prevaleceu. Hoje reconhece-se que esses recursos foram erros. A lista de discussão perl5-porters agora tem um bordão para tais recursos: eles são chamados de "action at a distance". O princípio é que uma declaração em uma parte do programa não deveria alterar drástica e invisivelmente o comportamento de alguma outra parte do programa.

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

## Action at a distance entre objetos

A [programação orientada a objetos](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") bem feita envolve princípios de design que evitam a action at a distance.

A [Lei de Deméter](https://en.wikipedia.org/wiki/Law%5Fof%5FDemeter "Law of Demeter") afirma que um objeto deve interagir apenas com outros objetos próximos a ele. Caso seja necessária uma ação em uma parte distante do sistema, ela deve ser implementada propagando uma mensagem. Um bom design limita severamente as ocorrências de action at a distance, contribuindo para programas fáceis de manter. A pressão para criar uma [object orgy](https://en.wikipedia.org/wiki/Object%5Forgy "Object orgy") resulta de um design de interface ruim, talvez assumindo a forma de um [God object](https://en.wikipedia.org/wiki/God%5Fobject "God object"), da não implementação de objetos de verdade ou da falta de atenção à Lei de Deméter.

Uma das vantagens da [programação funcional](https://en.wikipedia.org/wiki/Functional%5Fprogramming "Functional programming") é que a action at a distance é menos enfatizada, às vezes a ponto de ser totalmente impossível de expressar na linguagem de origem.

Estar ciente do perigo de permitir a action at a distance em um design, e ser capaz de reconhecer a presença da action at a distance, é útil para desenvolver programas corretos, confiáveis e fáceis de manter. Dado que a maior parte do custo de um programa pode estar na fase de manutenção, e que a action at a distance torna a manutenção difícil, cara e propensa a erros, vale o esforço de evitá-la durante o design.
