من الأسئلة الشائعة كيفية تعديل تعريف قالب حالي. على سبيل المثال، قد تحتاج إلى إضافة عملية التحقّق من الاتصال أو تغيير حقل إلى إدخال قيمة.
بشكل عام، لا يمكن تعديل تعريف العنصر في مكانه.
كيفية تعديل تعريف حالي
إذا أردت تعديل تعريف نوع كتلة حالي:
- أنشئ نسخة من التعريف الحالي، بما في ذلك أدوات إنشاء الرموز البرمجية.
- عدِّل النسخة وامنح نوعك اسمًا جديدًا.
- أضِف التعريف الجديد إلى
Blockly.Blocks
.
لماذا لا يمكنني تعديل تعريف حالي مباشرةً؟
إذا كنت تريد معرفة سبب عدم تمكّنك من تعديل تعريف حالي، يُرجى الاطّلاع على ما يلي. سننظر في بعض الاحتمالات.
تعديل تعريف حالي مباشرةً
هناك طريقتان لتعديل تعريف كتلة حالية مباشرةً: تعديل الرمز البرمجي وإنشاء نسخة منه. لا يُنصح بشدة باستخدام أي من الطريقتَين، لأنّك تواجه خطر تعطُّل الرمز البرمجي الذي يعتمد على الرمز البرمجي الذي تم تعديله أو تم إنشاء نسخة منه. وتؤدي كلتا القصدتَين أيضًا إلى صعوبة دمج التحديثات وإصلاحات الأخطاء. لمزيد من المعلومات، يُرجى الاطّلاع على ما هو المقصود بتعديل الرمز البرمجي؟ وFork Blockly.
إنشاء فئة فرعية لتعريف حالي
قد تخطر لك فكرة إنشاء فئة فرعية لتعريف حالي. لا يمكن
إجراء ذلك لأنّ تعريفات الكتل ليست فئات، بل هي مزيج من العناصر.
على سبيل المثال، لا تتوفّر طريقة لإعادة استخدام سمة لون لأنّ
التعريف لا يحتوي على سمة لون. بدلاً من ذلك، تحتوي على دالة init
تستدعي setColour
لضبط سمة اللون في الكتلة. بما أنّ الطلب
داخل init
، لا يمكن استبداله بدون استبدال دالة
init
بالكامل.
استبدال دالة في تعريف حالي
من الممكن استبدال دالة في تعريف حالي:
Blockly.Blocks['existing_block'].init = function() {/*new function*/};
يعمل هذا الإجراء، ولكن عليك نسخ الدالة الحالية وتعديلها، ولا يمكنك استبدال سطر واحد فقط بشكلٍ سحري. هناك عدة مشاكل في ذلك:
- ولا يختلف ذلك كثيرًا عن نسخ التعريف بالكامل وتعديله.
- ولا يمكنك استخدامها لتعديل دالة
init
للوحدات المحدّدة في JSON، مثل الوحدات المضمّنة في Blockly. ويعود السبب في ذلك إلى عدم توفّر دالةinit
لنسخها، بل يتم إنشاؤها في وقت التشغيل. - ويتطلّب منك تحديد القسم باستخدام JavaScript، ما قد يتسبّب في مشاكل تتعلّق بالترجمة والنشر.
استبدال نتائج init
إحدى الطرق " لاستبدال سطر واحد فقط" من دالة init
هي استبدال دالة
init
بدالة تستدعي دالة init
الأصلية ثم تُلغي
نتيجة هذا الاستدعاء. على سبيل المثال، تغيِّر التعليمة البرمجية التالية
لون العنصر logic_null
:
const originalInit = Blockly.Blocks['logic_null'].init;
Blockly.Blocks['logic_null'].init = function() {
originalInit.call(this);
this.setColour(300);
}
لسوء الحظ، هذه الطريقة أقل فائدة مما تبدو عليه. على سبيل المثال:
إنّ توسيع نطاق عمليات التحقّق من الربط أو تطبيق مدقّق حقول أقل تقييدًا قد يؤدي إلى إبطال الافتراضات التي تفترضها مولدّات الرموز البرمجية للوحدات ومعالجات الأحداث.
سيؤدي استبدال حقل بإدخال قيمة إلى إيقاف أدوات إنشاء الرموز البرمجية المجمّعة وأداة التحقّق من الحقول، وقد يؤدي أيضًا إلى إيقاف معالجات الأحداث. وقد يكون من الصعب جدًا إجراء ذلك للّبنات المترجَمة لأنّ اللغات المختلفة قد تؤدي إلى استخدام لبنات تتضمّن أنواعًا وترتيبات مختلفة للإدخالات والحقول.
استبدال زوج مفتاح/قيمة في تعريف JSON
إذا كان ملف JSON الخاص بأحد الأقسام متاحًا للجميع، قد يكون من الممكن استبدال قيم JSON الفردية. على سبيل المثال:
// Block definition.
blockJson = {...};
Blockly.Blocks['my_block'] = {
init: function() {
initJson(blockJson); // Called when the block is created.
}
}
// Third-party code.
blockJson.colour = 100;
ومع ذلك، لا يعمل هذا الإجراء إلا إذا كان عنصر JSON متاحًا للجميع، ويفسر التعريف صراحةً دالة init
، وتستدعي دالة init
دالة
initJson
. لا يعمل هذا الإجراء إذا تم تمرير ملف JSON إلى defineBlocksWithJsonArray
أو createBlockDefinitionsFromJsonArray
لأنّه تتم معالجة ملف JSON قبل أن تحصل جهة خارجية على فرصة لتعديله. (يُرجى العِلم أنّ الكتل المضمّنة في Blockly تستخدم
createBlockDefinitionsFromJsonArray
).
ولكن ماذا لو لم يتم تعريف ملف JSON بهذه الطريقة؟ ألا يبقى من الممكن
استبدال خصائص JSON؟ لا، لأنّ التعريف يحتوي على دالة init
(وليس JSON) ولا تتوفّر دالة لتحويل دالة init
إلى
JSON.
// Doesn't work. There is no getJson() function.
const json = Blockly.Blocks['existing_block'].getJson();
json['message0'] = 'my new message0';
Blockly.Blocks['existing_block'].init = function () {
initJson(json);
};
تصميم المحتوى لإعادة استخدامه
أثناء تصميم الكتل المخصّصة، قد تتمكّن من تصميمها بطرق تشجّع على إعادة الاستخدام.
إعادة استخدام ملف JSON
إذا كانت لديك كتلتان متشابهتان بشكل كبير، يمكنك إنشاء تعريف ملف JSON رئيسي وإعادة استخدامه في التعريفات الفرعية. على سبيل المثال:
const parentJson = {
// shared properties
};
Blockly.Blocks['child_block_1'] = {
init: function() {
initJson({...parentJson, colour: 100})
}
}
Blockly.Blocks['child_block_2'] = {
init: function() {
initJson({...parentJson, colour: 200})
}
}
هناك بديل آخر وهو تحديد ملف JSON في عنصر متاح للجميع ونقْل هذا العنصر إلى initJson
في دالة init
. يتيح ذلك
للمستخدمين الآخرين استبدال مواقع فردية. لمزيد من المعلومات، اطّلِع على مقالة استبدال زوج مفتاح/قيمة في تعريف ملف JSON.
إعادة استخدام الدوالّ
يمكن أن تحدِّد الكتل عددًا من الدوالّ العادية، مثل معالجات الأحداث على مستوى الكتلة، ونصائح التلميحات المخصّصة، ومحرّرات أخطاء الحقول، والدوالّ التي تستخدمها عوامل التحويل، بالإضافة إلى الدوالّ التي توفّر سلوكًا مخصّصًا، مثل دالة تضبط قيم الحقول من بيانات خارجية، مثل القيمة الحالية لذراع الروبوت.
قد يكون من الممكن إعادة استخدام هذه الدوالّ في مختلف الوحدات.
استخدام حقل قائمة منسدلة
إذا كانت لديك مجموعة من الكتل متطابقة بشكل أساسي باستثناء عامل حسابي، قد تتمكّن من تصميم كتلة واحدة تحتوي على حقل منسدل لعامل الحساب. على سبيل المثال:
- تستخدم الوحدة المضمّنة
logic_operation
قائمة منسدلة تتضمّن عاملَي التشغيلand
وor
. - يستخدم العنصر المضمّن
math_arithmetic
قائمة منسدلة تتضمّن عوامل التشغيل+
،-
،×
،÷
، و^
.
إنّ كتابة أدوات إنشاء الرموز البرمجية لهذه الوحدات عادةً ما تكون أكثر تعقيدًا قليلاً، ولكنها مع ذلك أسهل من كتابة وحدات متعددة وتعديلها.
استخدام مُعدِّل
إذا كانت لديك مجموعة من الكتل التي تمثّل صيغًا مختلفة من
هيكل البرمجة نفسه، قد تتمكّن من إنشاء كتلة واحدة تستخدِم
مُعدِّل. على سبيل المثال، يمكن أن يمثّل الرمز المضمّن controls_if
عدّة صيغ لعبارة if-then-else
.