Wikipedia abstracta/Canónica y normal
Últimamente tuvimos algunas discusiones sobre las formas canónica y normal para la representación JSON de Objetos Z.
Para la mayoría de los contribuyentes y usuarios de Wikifunciones, esto realmente no debería importar: la interfaz de usuario debería incluirlos y no exponerlos a la representación JSON. Pero para aquellos casos en los que sí importa, aquí se muestran algunos elementos de fondo.
Muchos objetos JSON diferentes pueden describir eficazmente el mismo Objeto Z. Hay dos formas bien definidas: la normal y la canónica. Estas son las que se utilizan en el sistema. A veces, los contribuyentes pueden escribir algo a medio camino entre las dos, y todas las partes del sistema tendrían que estar de acuerdo.
La normalización siempre debe devolver la misma forma normal para cualquier entrada bien formada. La canonización siempre debe devolver la misma forma canónica para cualquier entrada bien formada. Por lo tanto, la mayoría de los lugares no deberían tener que preocuparse por lo que se recibe, siempre y cuando esté bien formado. Simplemente pueden canonizar o normalizar su entrada para obtenerla en el formato en el que quieren trabajar.
Internamente, almacenamos la forma canónica en la base de datos y le damos preferencia al uso de esta forma para mostrársela al usuario. La forma normal se usa en la mayoría de los otros casos, especialmente cuando se procesan datos en el orquestador o en la interfaz de usuario (front-end).
Finalmente, existe lo que se llama el etiquetado. Esto simplemente implica reemplazar cada objeto ZID o referencia clave con la etiqueta en el idioma dado. Esta suele ser una etapa de pérdida de información: un desetiquetador no necesariamente funcionará. Esto está diseñado para fines de salida en pantalla únicamente. A continuación, mostramos la versión etiquetada a la izquierda y la versión sin procesar a la derecha.
Aquí hay una llamada de función en forma normal:
Forma legible por humanos | Forma normal |
---|---|
{
"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"
}
}
}
|
La misma llamada en forma canónica:
Forma legible por humanos | Forma canónica |
---|---|
{
"type": "Function call",
"function": "Head",
"list": [ "a" ]
}
|
{
"Z1K1": "Z7",
"Z7K1": "Z811",
"Z811K1": [ "a" ]
}
|
La misma llamada de función en lo que la mayoría de los desarrolladores de software considerarían una forma razonablemente legible:
Head(["a"])
Esta es la llamada a la función Head
(Cabecera) en un argumento que es una lista con un elemento, siendo ese elemento la cadena "a"
.
Head
devuelve el primer elemento de una lista, por lo que los resultados de esta llamada de función serían, en forma normal:
{
"type": "String",
"value": "a"
}
|
{
"Z1K1": "Z6",
"Z6K1": "a"
}
|
o simplemente en forma canónica:
"a"
Debido a que a veces nos confundimos con la terminología, también llamamos a la forma normal la forma “larga” o “explícita”. El término "normal" está inspirado en el concepto de normalización de bases de datos. La forma canónica también la llamamos forma “corta” o “compacta”, ya que suele ser mucho más corta. Canonización es el término habitual para este paso en la informática. Tenga en cuenta que en la informática, la canonización y la normalización son a menudo sinónimos entre sí, por lo que la forma "corta" y "larga" parece conducir a menos confusión.