Cirkulær reference - Circular reference

En cirkulær reference er en række referencer, hvor det sidste objekt refererer til det første, hvilket resulterer i en lukket sløjfe.

Cirkulær reference (i rødt)

I sprog

En cirkulær reference må ikke forveksles med den logiske fejl i et cirkulært argument . Selvom en cirkulær reference ofte vil være uhensigtsmæssig og ikke afsløre oplysninger, f.eks. To poster i et bogindeks, der refererer til hinanden, er det ikke nødvendigvis sådan, at en cirkulær reference ikke nytter noget. Ordbøger skal for eksempel altid i sidste ende være en cirkulær reference, da alle ord i en ordbog er defineret med andre ord, men en ordbog er alligevel en nyttig reference. Sætninger, der indeholder cirkulære referencer, kan stadig have betydning:

Hendes bror gav hende en killing; hans søster takkede ham for det.

er cirkulær, men ikke uden mening. Det kan faktisk argumenteres for, at selvreference er en nødvendig konsekvens af Aristoteles ' lov om ikke-modsigelse , et grundlæggende filosofisk aksiom . I denne opfattelse, uden selvreference, bliver logik og matematik umulig, eller i det mindste mangler brugbarhed.

I computerprogrammering

Cirkulære referencer kan forekomme i computerprogrammering, når et stykke kode kræver resultatet fra et andet, men den kode har brug for resultatet fra det første. For eksempel omfatter de to funktioner, posn og plus1 i det følgende Python -program en cirkulær reference:

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

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

Cirkulære referencer som ovenstående eksempel kan returnere gyldige resultater, hvis de har en afsluttende tilstand. Hvis der ikke er nogen afsluttende tilstand, fører en cirkulær reference til en tilstand kendt som livelock eller uendelig sløjfe , hvilket betyder, at den teoretisk set kan køre for evigt.

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

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

I ISO -standarden understøttes implicit SQL -cirkulære integritetsbegrænsninger i en enkelt tabel. Mellem flere tabeller er cirkulære begrænsninger (f.eks. Udenlandske nøgler) tilladt ved at definere begrænsningerne som deferrable (se Opret tabel for PostgreSQL og DEFERRABLE Constraint eksempler for Oracle). I så fald kontrolleres begrænsningen ved transaktionens afslutning ikke på det tidspunkt, hvor DML -erklæringen udføres. For at opdatere en cirkulær reference kan der udsendes to udsagn i en enkelt transaktion, der opfylder begge referencer, når transaktionen er begået.

I regneark

Cirkulære referencer forekommer også i regneark, når to celler kræver hinandens resultat. For eksempel, hvis værdien i celle A1 skal opnås ved at tilføje 5 til værdien i celle B1, og værdien i celle B1 skal opnås ved at tilføje 3 til værdien i celle A1, kan der ikke beregnes nogen værdier. (Selvom specifikationerne er A1: = B1+5 og B1: = A1-5, er der stadig en cirkulær reference. Det hjælper ikke, at f.eks. A1 = 3 og B1 = -2 opfylder begge formler, som der er uendeligt mange andre mulige værdier af A1 og B1, der kan tilfredsstille begge tilfælde.)

Cirkulær reference i regneark kan være en meget nyttig teknik til løsning af implicitte ligninger såsom Colebrook-ligningen og mange andre, som ellers kan kræve kedelige Newton-Raphson-algoritmer i VBA eller brug af makroer.

Der bør skelnes mellem processer, der indeholder en cirkulær reference mellem dem, der ikke kan beregnes, og dem, der er en iterativ beregning med et endeligt output. Sidstnævnte kan mislykkes i regneark, der ikke er udstyret til at håndtere dem, men ikke desto mindre stadig er logisk gyldige.

Se også

Referencer