Abstract Wikipedia/Canonical and normal

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

היו לנו כמה דיונים לאחרונה על ייצוג JSON קנוני ונורמלי של עצמי Z.

עבור רוב התורמים והמשתמשים בוויקיפונקציות, זה לא אמור לשנות: חוויית המשתמש צריכה להגן עליהם מייצוג ה־JSON. אבל עבור אותם מקרים שבהם זה חשוב, הנה מעט רקע.

עצמים רבים ושונים של JSON יכולים לתאר טוב את אותו עצם ה־Z. ישנן שתי צורות מוגדרות היטב: הצורה הנורמלית והקנונית. הם אלה שמשמשים במערכת. לפעמים, תורמים עשויים לכתוב משהו באמצע, וכל החלקים של המערכת צריכים לקבל את זה.

הנורמליזציה צריכה להחזיר את אותה הצורה הנורמלית בכל קלט מעוצב היטב (well-formed). קנוניזציה צריכה להחזיר את אותה הצורה הקנונית בכל קלט מעוצב היטב. לרוב המקומות לא צריך לשנות מה הם מקבלים, כל עוד מה שיקבלו מעוצב היטב. הם יכולים פשוט להפוך אותו לקנוני או לנורמלי, ואז לקבל את הקלט בתסדיר שהם רוצים לעבוד איתו.

באופן פנימי, אנחנו מאחסנים את הטופס הקנוני במסד הנתונים, ועדיף להשתמש בצורה הקנונית בעת הצגתו בפני המשתמש. הצורה הנורמלית משמשת כמעט בכל המקרים האחרים, במיוחד בעת עיבוד הנתונים במתזמר או בצד הלקוח.

לבסוף, יש את מה שמכונה מתן תוויות (labelization). זה פשוט החלפת כל התייחסות למזהה ה־Z או להפניה למפתח בתווית בשפה הנתונה. זה בדרך כלל צעד שמייצר אובדן נתונים (lossy): ביטול תווית לא בהכרח יעבוד פה. זה אך ורק למטרות פלט. בהמשך אנו מציגים את הגרסה עם תוויות משמאל, ואת הגרסה הגולמית מימין.

הנה קריאה לפונקציה בצורה רגילה:

צורה שקריאה אנושית צורה נורמלית
{
  "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"
    }
  }
}

אותה הקריאה לפונקציה בצורה הקנונית:

צורה שקריאה אנושית צורה קנונית
{
  "type": "Function call",
  "function": "Head",
  "list": [ "a" ]
}
{
  "Z1K1": "Z7",
  "Z7K1": "Z811",
  "Z811K1": [ "a" ]
}

אותה הקריאה לפונקציה במה שרוב מפתחי התוכנה יראו בו צורה קריאה סבירה:

Head(["a"])

זו הקריאה לפונקציה Head על ארגומנט אחד שהוא רשימה עם רכיב אחד, והאלמנט הזה הוא המחרוזת "a". Head מחזיר את הרכיב הראשון ברשימה, כך שהתוצאה של הקריאה הזאת לפונקציה תהיה, בצורה נורמלית:

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

או, בצורה קנונית, פשוט:

"a"

מכיוון שלעתים אנו מתבלבלים מהמינוח, אנו מכנים את הצורה הרגילה גם "ארוכה" או "מפורשת". המונח "נורמלי" נכתב בהשראת המושג database normalization. את הצורה הקנונית אנו מכנים גם הצורה "קצרה" או "קומפקטית", מכיוון שהיא בדרך כלל קצרה בהרבה. Canonicalization הוא המונח המקובל לשלב זה במדעי המחשב. שימו לב שבמדעי המחשב קנוניקליזציה ונורמליזציה הן לרוב מילים נרדפות זו לזו, ולכן נראה כי צורה "קצרה" ו"ארוכה" מובילה לפחות בלבול.