Referência circular
Uma referência circular é uma série de referências onde o último objeto referencia o primeiro, tendo como resultado um laço fechado.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Circular_Reference.svg/220px-Circular_Reference.svg.png)
Na linguagem
A referência circular não deve ser confundida com a falácia lógica do argumento circular. Apesar de um argumento circular ser por, muitas vezes, inútil e não revelar informações, como duas entradas em um índice que se referem uma a outra, não necessariamente quer dizer que é de nenhum uso. Dicionários, por exemplo, são quase totalmente feitos por referência circular, uma vez que todas as palavras do dicionário são definidas em termos de outras palavras, entretanto, o dicionário continuará a ser uma referência útil. Textos contendo referências circulares ainda podem ser significativos. Seu irmão lhe deu um gatinho; Sua irmã lhe agradeceu por isso. É circular, mas não sem significado. De fato, pode ser argumentado que a auto-referência é uma consequência da lei da não-contradição de Aristóteles, um axioma fundamental da filosofia. Sob esse ponto de vista, sem a auto-referência, a lógica e a matemática se tornam impossíveis, ou pelo menos, perderiam muito de sua utilidade.[1][2]
Nos negócios
Algumas vezes, negócios indevidamente planejados podem ocasionar em uma referência circular. Por exemplo:
Alice precisa retornar a sua máquina de lavar – está com defeito e ela precisa disso funcionando. Ela foi instruída por Bob do atendimento ao cliente (customer service) para reportar a Carol de Devoluções e trocas pelo serviço requisitado. Carol, no entanto, falou para Alice para reportar para David. David fala para Alice para falar com o Bob.
O conjunto inteiro de referências é inútil porque nenhum deles pode satisfazer o pedido de Alice; Alice realizou uma volta completa, onde cada referência a conduz ela a outra pessoa e finalmente ela é enviada de volta para a primeira pessoa.
Em programação de computadores
A referência circular pode aparecer em uma programa de computador onde uma parte do código requer o resultado de outra, mas esse código precisa do resultado da primeira. Por exemplo:
A função A irá mostrar a última configuração do sol baseado na data atual. A função B irá calcular a data baseada no número de vezes que a lua já orbitou a Terra desde a última vez desde a última vez que a função B foi chamada. Então, a função B pergunta para a função C quantas vezes foram. A função C não sabe, mas pode descobrir chamando a função A para saber o momento da última configuração do sol.
O conjunto de funções como um todo é inútil porque nada entre eles pode retornar qualquer informação útil, de alguma maneira. Isso remete a um tipo de deadlock que é conhecido tecnicamente como livelock. Isso também aparece em planilhas eletrônicas onde duas células pedem o resultado de uma a outra. Por exemplo, se o valor da Célula A1 pode ser obtido adicionando 5 ao valor da Célula B1, e o valor da Célula B1 pode ser obtido adicionando 3 ao valor da Célula A1, nenhum valor pode ser computado. (mesmo se nas especificações estiver A1:=B1+5 e B1:=A1-5, ainda terá uma referência circular. Isso não ajuda se, no momento, A1=3 e B1=-2 possam satisfazer ambas as formulas, como existe infinitas outras possibilidades de valores para A1 e B1 que podem satisfazer ambas as instâncias.) A referência circular representa um grande problema na computação. O deadlock ocorre quando dois ou mais processos ficam esperando um pelo outro para liberar o recurso. A maioria dos bancos de dados relacionados como Oracle e SQL não permitem fazer referência circular porque sempre tem o problema de quando apagar uma fileira de uma tabela haver dependências com outras fileira de outra tabela (chave estrangeira) que se refere a fileira que será deletada. Da documentação técnica da Microsoft: a restrição de CHAVE ESTRANGEIRA não podem ser usadas para criar auto referência ou uma restrição circular de CHAVE ESTRANGEIRA.[3] Para a Oracle e PostgreSQL o problema com a atualização de referência circular pode ser resolvidas definindo as chaves estrangeiras correspondents como deferrable (veja em CRIAR TABELA para PostgreSQL e DEFERRABLE Constraint Examples para Oracle). Nesse caso, a restrição é verificada no final da transação não no momento em que a declaração DDL é executada. Para atualizar uma referência circular, podem ser emitidas duas declarações em uma única transação que irá satisfazer ambas as referências uma vez que a transação seja enviada. Só associações internas são suportadas e são especificadas por uma comparação de colunas de diferentes tabelas. Junções circulares não são suportadas. Uma junção circular é uma consulta SQL que liga três ou mais tabelas entre si em um circuito. Oracle usa o termo cíclico para designar uma referência circular. Uma distinção deve ser feita através de processos contendo uma referência circular entre o que é incomputável e entre os cálculos de iteração com uma saída final. Este último pode falhar em planilhas que não estão equipadas para lidar com eles, mas são, no entanto, ainda logicamente válidos.
Em planilhas eletrônicas
No caso específico de planilhas eletrônicas, uma referência circular é uma formula que depende, direta ou indiretamente, do seu próprio valor. O tipo mais comum de referência circular ocorre quando é feita uma referência à célula onde a fórmula está sendo editada. Por exemplo, ao se editar na célula B10, é inserida a seguinte formula: =A10+B10[4] Referência circular em planilhas pode ser uma técnica muito útil para resolver equações implícitas, como a equação de Colebrook e muitos outros, o que de outra maneira poderiam exigir os tediosos algoritmos de Newton-Raphson em VBA ou a utilização de macros.[5]
Ver também
- Sub-rotina aninhada
- Problema da parada
- Ardil 22 (lógica)
- Pseudo-história
- O ovo ou a galinha
Referências
- ↑ Terry A. Osborn, The future of foreign language education in the United States, pp.31-33, Greenwood Publishing Group, 2002 ISBN 0-89789-719-6.
- ↑ Robert Fiengo, Robert May, Indices and identity, pp.59-62, MIT Press, 1994 ISBN 0-262-56076-3.
- ↑ «Microsoft TechNet - SQL Server CREATE TABLE» .
- ↑ Greg Harvey. «Circular References in Excel 2013 - For Dummies». Consultado em 7 de outubro de 2013
- ↑ «Solve Implicit Equations Inside Your Worksheet By Anilkumar M, Dr Sreenivasan E and Dr Raghunathan K». Consultado em 13 de agosto de 2014. Arquivado do original em 17 de agosto de 2009 .