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

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

הגדרות אישיות

הרבה אפליקציות של blockly משמשות לתיאור הגדרות אישיות, ולא במקום תוכנות שניתנות להפעלה. אפליקציות להגדרת תצורה בדרך כלל מתחילות באתחול חסימה אחת ברמה הבסיסית (root) בסביבת העבודה. דוגמה טובה לכך היא הכרטיסייהBlock Factory (חסימה של מפעל) מתוך הכלים למפתחים ב-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 בתוכנה אחת שמשתמשת במודול שרשור.

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

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

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

חלק מהמפתחים אוהבים להוסיף 'כובע' לחלק העליון של בלוקים של אירועים, כדי שייראו מובדלים מבלוקים אחרים. זה לא מראה ברירת המחדל ל-Blockly, אבל אפשר להוסיף אותו על ידי שינוי הערך הקבוע של ה-Renderer ADD_START_HATS ל-true (Custom Renderers codelab - Override קבוע) או על ידי הוספת עיצוב והגדרת אפשרות הכובע בסגנון הבלוק. מידע נוסף על הגדרת כובעים על בלוקים כחלק מעיצובים זמין כאן.

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

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