אבני בניין בהתאמה אישית: פרדיגמות של בלוקים

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

תצורה

אפליקציות רבות של Blockly משמשות לתיאור הגדרות, ולא מאשר תוכנות הפעלה. הגדרות התצורה מתחילות בדרך כלל ב- אתחול בלוק אחד של הרמה הבסיסית (root) בסביבת העבודה. דוגמה טובה היא הכרטיסייה Block מפעל בכלים למפתחים ב-Blockly:

Blockly.Blocks['factory_base'] = {
  init: function() {
    this.setDeletable(false);
    this.setMovable(false);
    this.setEditable(false);
    // etc...
  }
}

Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);

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

ייתכן שאפליקציות כאלה ירצו להשבית באופן אוטומטי כל חסימה שמחובר לבלוק הרמה הבסיסית (root). ניתן לעשות זאת בשורה אחת:

workspace.addChangeListener(Blockly.Events.disableOrphans);

תוכנית סידורית

רוב האפליקציות של Blockly מתוכננות ליצור קוד טורי התוכניות השונות. משתמשים מקבצים יחד בלוקים שמבוצעים לפי הסדר.

כל בלוק (לא מושבת) בסביבת העבודה יהיה חלק בתוכנית. אם יש כמה ערימות של בלוקים, המקבצים הגבוהים יותר מבוצעת קודם. (אם שתי ערימות הן באותו גובה בערך, מחסניות משמאל (ימין במצב RTL) מקבלות עדיפות.)

אפשר לייצא את סביבת העבודה לקוד להפעלה בכל שלב. הקוד הזה ניתן להריץ בצד הלקוח ב-JavaScript (באמצעות eval או ה-JS תרגום), או בצד השרת בכל שפה.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

תוכנית מקבילה

אפליקציות מסוימות של Blockly בוחרות להריץ את כל מקבצים של בלוקים מקבילים ולא ברציפות. לדוגמה: אפליקציית מוזיקה שבה לולאה של תיפוף מופעלת בו-זמנית עם מנגינה.

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

import {javascriptGenerator} from 'blockly/javascript';

var json = Blockly.serialization.workspaces.save(workspace);

// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice();  // Create shallow copy.
blocks.length = 0;

// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
  var block = topBlocks[i];
  blocks.push(block);
  Blockly.serialization.workspaces.load(json, headless);
  allCode.push(javascriptGenerator.workspaceToCode(headless));
  blocks.length = 0;
}

אם שפת היעד היא JavaScript, מערך ה-allCode יכול להיות משמש ליצירת כמה מתורגמים של JS לצורך ביצוע בו-זמנית. אם המיקום שפת היעד היא משהו כמו Python, ואז מערך ה-allCode רכיב מסוים לתוך תוכנה יחידה שמשתמשת במודול שרשור.

כמו בכל תוכנית מקבילה, יש לקבל החלטות זהירות משאבים משותפים כמו משתנים ופונקציות.

תוכנית שמבוססת על אירועים

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

חלק מהמפתחים אוהבים להוסיף 'כובע' לחלק העליון של בלוקים של אירועים, הם נראים נפרדים מבלוקים אחרים. זהו לא חיפוש ברירת המחדל של חסום, אבל ניתן להוסיף אותו על ידי שינוי קבוע של כלי הרינדור ADD_START_HATS עד true (Codelab של כלי רינדור בהתאמה אישית – שינוי קבועים). או על ידי הוספת עיצוב והגדרת אפשרות לכובע בסגנון הבלוק. סמל האפשרויות הנוספות ניתן למצוא מידע להגדרת כובעים על בלוקים כחלק מעיצובים כאן.

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

כאשר מתכננים מערכת המשתמשת באירועים, יש לשקול אם אפשרי או רצוי כדי לתמוך בכמה מופעים של אותו אירוע המטפל.