Abstraktní Wikipedie/Kanonické a normální
V poslední době jsme několikrát diskutovali o kanonických a normálních formách pro reprezentaci JSON objektů typu ZObject.
Pro většinu přispěvatelů a uživatelů Wikifunkcí by to nemělo být důležité: uživatelské rozhraní by je mělo účinně oddálit od JSON reprezentace. Pro případy, kdy na tom záleží, uvádíme několik informací.
Mnoho různých objektů JSON může efektivně popisovat stejný objekt typu ZObject. Existují dvě dobře definované formy: normální a kanonická forma. To jsou ty, které se používají v systému. Někdy mohou přispěvatelé napsat něco mezi tím a všechny části systému by to měly přijmout.
Normalizace by měla vracet stejný normalizovaný výsledek na jakémkoli dobře formulovaném vstupu. Kanonizace by měla vracet stejný kanonický tvar na jakémkoli dobře formulovaném vstupu. Většině míst by tedy mělo být jedno, co dostanou, pokud je to dobře formulované. Mohou je jednoduše kanonizovat nebo normalizovat a poté získat vstup ve formátu, se kterým chtějí pracovat.
Interně ukládáme kanonický tvar do databáze a při zobrazení uživateli používáme přednostně kanonický tvar. Normalizovaná forma se používá téměř ve všech ostatních případech, zejména při zpracování dat v orchestrátoru nebo na frontendu.
V neposlední řadě existuje tzv. labelizace. Jedná se o jednoduché nahrazení každého ZID nebo klíče štítkem v daném jazyce. Obvykle se jedná o ztrátový krok: odznačkovač (un-labelizer) nemusí nutně fungovat. Je to čistě pro účely výstupu. Na následujícím obrázku je vlevo uvedena štítkovaná verze a vpravo hrubá verze.
Zde je volání funkce v normálním tvaru:
Lidsky čitelná forma | Normalizovaná forma |
---|---|
{
"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"
}
}
}
|
Zde je volání funkce v kanonickém tvaru:
Lidsky čitelná forma | Kanonická forma |
---|---|
{
"type": "Function call",
"function": "Head",
"list": [ "a" ]
}
|
{
"Z1K1": "Z7",
"Z7K1": "Z811",
"Z811K1": [ "a" ]
}
|
Stejné volání funkce v podobě, kterou by většina vývojářů softwaru považovala za rozumně čitelnou:
Head(["a"])
Toto je volání funkce Head
s jedním parametrem, kterým je seznam (list) s jedním prvkem, přičemž tímto prvkem je řetězec (string) "a"
.
Head
vrací první prvek seznamu, takže výsledek volání této funkce bude v normálním tvaru:
{
"type": "String",
"value": "a"
}
|
{
"Z1K1": "Z6",
"Z6K1": "a"
}
|
nebo jednoduše v kanonické podobě:
"a"
Protože se nám někdy plete terminologie, nazýváme normální formu také "dlouhou" nebo "explicitní" formou. Termín "normální" je inspirován konceptem normalizace databáze. Kanonickou formu nazýváme také "krátká" nebo "kompaktní" forma, protože je obvykle mnohem kratší. Kanonizace je obvyklý termín pro tento krok v informatice. Všimněte si, že v informatice jsou kanonizace a normalizace často vzájemnými synonymy, a proto se zdá, že "krátká" a "dlouhá" forma vedou k menšímu zmatku.