الوحدات الأساسية المخصَّصة: حظر النماذج

هناك العديد من النماذج للاختيار من بينها عند تصميم تطبيق يستخدم Blockly. يجب أن يتم النظر في هذه الخيارات في وقت مبكر، لأنها تؤثر على الحظر الذي سيحتاجه المستخدم.

الإعدادات

يتم استخدام العديد من تطبيقات Blockly لوصف عمليات الضبط، بدلاً من البرامج القابلة للتنفيذ. تبدأ تطبيقات التهيئة عادةً بتهيئة كتلة مستوى جذر واحدة على مساحة العمل. وخير مثال على ذلك هو علامة تبويب Block Process في أدوات مطوري البرامج المحظورة:

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

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

يؤدي ذلك إلى إنشاء كتلة غير قابلة للنقل وغير قابلة للنقل تحتفظ بجميع إعدادات المستخدم. يمكن إنشاء تسلسل لمساحة العمل في أي وقت لتحديد الإعدادات الحالية.

وقد تحتاج هذه التطبيقات إلى الإيقاف التلقائي لأي كتلة غير مرتبطة بمجموعة الجذر. يمكن تحقيق ذلك من خلال سطر واحد:

workspace.addChangeListener(Blockly.Events.disableOrphans);

برنامج تسلسلي

صُممت غالبية تطبيقات حظر المحتوى لإنشاء برامج تسلسلية. يتجمع المستخدمون في مجموعات يتم تنفيذها بالترتيب.

سيشكل كل جزء (غير معطل) في مساحة العمل جزءًا من البرنامج. إذا كانت هناك مكدسات متعددة من الكتل، يتم تنفيذ الأعلى أولاً. (إذا كانت مكدستان بنفس الارتفاع تقريبًا، تُعطى الأولوية للمكدسات إلى اليسار (اليمين في وضع RTL).

يمكن تصدير مساحة العمل إلى رمز تنفيذي في أي وقت. يمكن تنفيذ هذه التعليمة البرمجية من جانب العميل في JavaScript (باستخدام eval أو مترجم JavaScript) أو من جهة الخادم بأي لغة.

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 لإنشاء عدة مترجمين بلغة JavaScript للتنفيذ المتزامن. إذا كانت اللغة الهدف مثل Python، قد يتم تجميع صفيف allCode في برنامج واحد يستخدم وحدة سلاسل محادثات.

كما هو الحال مع أي برنامج موازٍ، يجب اتخاذ قرارات دقيقة بشأن أي موارد مشتركة مثل المتغيرات والدوال.

برنامج موجَّه إلى الأحداث

معالِجات الأحداث هي مجرد دوال يستدعيها النظام، بدلاً من البرنامج. يمكن لهذه الكتل إما أن تضم مكدس من القوالب المراد تنفيذها، أو قد تكون عناوين تقع فوق حزمة من الكتل.

يحب بعض المطورين إضافة "قبعة" إلى الجزء العلوي من قوالب الأحداث بحيث تبدو مميزة عن الكتل الأخرى. هذا ليس الشكل التلقائي للخيار Blockly، ولكن يمكن إضافته من خلال استبدال ثابت العارض ADD_START_HATS إلى true (الدرس التطبيقي حول ترميز برامج العرض المخصَّصة - إلغاء الثوابت). أو من خلال إضافة مظهر وضبط خيار القبعة على نمط الحظر. يمكنك الاطّلاع هنا على مزيد من المعلومات حول وضع القبعات على القوالب كجزء من المظاهر.

ضمن النموذج المستند إلى الحدث، قد يكون من المنطقي أيضًا إعداد معالج لبدء البرنامج. ضمن هذا النموذج، سيتم تجاهل أي كتلة في مساحة العمل غير متصلة بمعالج أحداث ولن يتم تنفيذها.

عند تصميم نظام يستخدم الأحداث، فكّر في ما إذا كان من الممكن أو المطلوب دعم مثيلات متعددة من معالج الأحداث نفسه.