Referencia circular - Circular reference

Uma referência circular é uma série de referências em que o último objeto faz referência ao primeiro, resultando em um loop fechado.

Referência circular (em vermelho)

Na linguagem

Uma referência circular não deve ser confundida com a falácia lógica de um argumento circular . Embora uma referência circular seja freqüentemente inútil e não revele nenhuma informação, como duas entradas em um índice de livro referindo-se uma à outra, não é necessariamente que uma referência circular seja inútil. Os dicionários, por exemplo, devem ser sempre, em última análise, uma referência circular, uma vez que todas as palavras em um dicionário são definidas em termos de outras palavras, mas um dicionário continua sendo uma referência útil. Frases contendo referências circulares ainda podem ser significativas:

Seu irmão deu a ela um gatinho; sua irmã agradeceu por isso.

é circular, mas não sem significado. Na verdade, pode-se argumentar que a autorreferência é uma consequência necessária da Lei da não-contradição de Aristóteles , um axioma filosófico fundamental . Nessa visão, sem autorreferência, a lógica e a matemática tornam-se impossíveis ou, pelo menos, carecem de utilidade.

Em programação de computador

Referências circulares podem aparecer na programação de computador quando um trecho de código requer o resultado de outro, mas esse código precisa do resultado do primeiro. Por exemplo, as duas funções, posn e plus1 no seguinte programa Python compreendem uma referência circular:

def posn(k: int) -> int:
    if k < 0:
        return plus1(k)
    return k

def plus1(n: int) -> int:
    return posn(n + 1)

Referências circulares como o exemplo acima podem retornar resultados válidos se tiverem uma condição de término. Se não houver uma condição de término, uma referência circular leva a uma condição conhecida como livelock ou loop infinito , o que significa que teoricamente poderia ser executado para sempre.

def posn(k: int) -> int:
    return plus1(k)

def plus1(n: int) -> int:
    return posn(n + 1)

No padrão ISO, as restrições de integridade circular SQL são implicitamente suportadas em uma única tabela. Entre várias tabelas, restrições circulares (por exemplo, chaves estrangeiras) são permitidas definindo as restrições como adiáveis ​​(consulte CREATE TABLE para PostgreSQL e DEFERRABLE Constraint Exemplos para Oracle). Nesse caso, a restrição é verificada no final da transação, não no momento em que a instrução DML é executada. Para atualizar uma referência circular, duas instruções podem ser emitidas em uma única transação que irá satisfazer ambas as referências assim que a transação for confirmada.

Em planilhas

Referências circulares também ocorrem em planilhas quando duas células exigem o resultado uma da outra. Por exemplo, se o valor na Célula A1 deve ser obtido adicionando 5 ao valor na Célula B1, e o valor na Célula B1 deve ser obtido adicionando 3 ao valor na Célula A1, nenhum valor pode ser calculado. (Mesmo que as especificações sejam A1: = B1 + 5 e B1: = A1-5, ainda há uma referência circular. Não ajuda que, por exemplo, A1 = 3 e B1 = -2 satisfaçam ambas as fórmulas, como existem infinitamente muitos outros valores possíveis de A1 e B1 que podem satisfazer ambas as instâncias.)

A 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 muitas outras, que podem exigir algoritmos de Newton-Raphson tediosos em VBA ou o uso de macros.

Uma distinção deve ser feita com processos que contêm uma referência circular entre aqueles que são incomputáveis ​​e aqueles que são um cálculo iterativo com uma saída final. Estes últimos podem falhar em planilhas não equipadas para lidar com eles, mas ainda assim são logicamente válidos.

Veja também

Referências