Abstrakte Wikipedia/Kanonisch und normal

This page is a translated version of the page Abstract Wikipedia/Canonical and normal and the translation is 100% complete.

Wir hatten kürzlich ein paar Diskussionen über kanonische und normale Formen für die JSON-Darstellung von ZObjekten.

Für die meisten Beitragenden und Nutzer von Wikifunctions sollte es wirklich nicht wichtig sein: die Benutzeroberfläche sollte sie effektiv von der JSON-Darstellung abschirmen. Für die Fälle, in denen es wichtig ist, sind hier einige Hintergrundinformationen.

Viele verschiedene JSON-Objekte können effektiv das gleiche ZObjekt beschreiben. Es gibt zwei wohldefinierte Formen: die normale und die kanonische Form. Dies sind diejenigen, die im System genutzt werden. Manchmal schreiben Beitragende in einer Mischung und alle Teile des Systems sollten es akzeptieren.

Für jede wohlgeformte Eingabe sollte die Normalisierung die gleiche normale Form ausgeben. Für jede wohlgeformte Eingabe sollte die Kanonisierung die gleiche kanonische Form ausgeben. Den meisten Orten sollte es also egal sein, was sie erhalten, solange es wohlgeformt ist. Sie können es einfach kanonisieren oder normalisieren und die Eingabe dann in dem Format erhalten, mit dem sie arbeiten wollen.

Intern speichern wir die kanonische Form in der Datenbank und nutzen die kanonische Form bevorzugt für die Anzeige beim Benutzer. Die normale Form wird in nahezu allen anderen Fällen genutzt, insbesondere wenn Daten im Orchestrierer oder im Frontend verarbeitet werden.

Schließlich gibt es die sogenannte Labelisierung. Dabei wird einfach jede ZID oder Schlüsselreferenz durch die Bezeichnung in der angegebenen Sprache ersetzt. Dies ist normalerweise ein verlustbehafteter Schritt: eine Rückgängigmachung der Labelisierung wird nicht unbedingt funktionieren. Es dient ausschließlich zu Ausgabe-Zwecken. Im folgenden zeigen wir links die labelisierte und rechts die Rohversion.

Hier ist ein Funktionsaufruf in der normalen Form:

Menschenlesbare Form Normale Form
{
  "type": {
    "type": "Reference",
    "reference ID": "Function call"
  },
  "function": {
    "type": "Reference",
    "reference ID": "Head"
  },
  "list": {
    "type": "List",
    "head": {
      "type": "String",
      "value": "a"
    },
    "tail": {
        "type": "List"
    }
  }
}
{
  "Z1K1": {
    "Z1K1": "Z9",
    "Z9K1": "Z7"
  },
  "Z7K1": {
    "Z1K1": "Z9",
    "Z9K1": "Z811"
  },
  "Z811K1": {
    "Z1K1": "Z10",
    "Z10K1": {
      "Z1K1": "Z6",
      "Z6K1": "a"
    },
    "Z10K2": {
        "Z1K1": "Z10"
    }
  }
}

Der gleiche Funktionsaufruf in kanonischer Form:

Menschenlesbare Form Kanonische Form
{
  "type": "Function call",
  "function": "Head",
  "list": [ "a" ]
}
{
  "Z1K1": "Z7",
  "Z7K1": "Z811",
  "Z811K1": [ "a" ]
}

Der gleiche Funktionsaufruf in einer Form, die die meisten Softwareentwickler als vernünftig lesbare Form bezeichnen würden:

Head(["a"])

Dies ist der Aufruf der Funktion Head mit einem Argument, welches eine Liste mit einem Element ist, wobei dieses Element die Zeichenkette "a" ist. Head gibt das erste Element einer Liste aus, sodass das Ergebnis des Funktionsaufruf in normaler Form folgendes wäre:

{
  "type": "String",
  "value": "a"
}
{
  "Z1K1": "Z6",
  "Z6K1": "a"
}

oder in kanonischer Form einfach:

"a"

Da uns die Begriffe manchmal verwirren, nennen wir die normale Form auch die “lange” oder “explizite” Form. Der Begriff “normal” ist vom Konzept der Datenbank-Normalisierung inspiriert. Die kanonische Form nennen wir die “kurze” oder “kompakte” Form, da sie normalerweise wesentlich kürzer ist. Kanonisierung ist der übliche Begriff aus der Computerwissenschaft für diesen Schritt. Beachte, dass in der Computerwissenschaft Kanonisierung und Normalisierung häufig synonym verwendet werden, weshalb “kurze” und “lange” Form zu weniger Verwirrung zu führen scheinen.