تختلف اللغات المستندة إلى الوحدات عن اللغات المستندة إلى النصوص في عدد من الطرق، ويعود السبب في ذلك بشكل أساسي إلى أنّها مصمّمة للمستخدمين المبتدئين. في ما يلي قائمة بالنقاط التي يجب مراعاتها عند تصميم لغتك المستندة إلى الكتل.
استخدام قوائم مستندة إلى رقم واحد
يتفاعل المبرمجون المبتدئون بشكل سيئ عند مواجهة قوائم مستندة إلى الصفر للمرة الأولى. نتيجةً لذلك، تتّبع Blockly أسلوب Lua وLambda Moo من خلال جعل فهرسة القوائم والسلاسل تستند إلى الرقم واحد.
لاستخدامات أكثر تقدمًا من Blockly، تتوفّر قوائم مستندة إلى الصفر لتسهيل الانتقال إلى النص. بالنسبة إلى شرائح الجمهور الأصغر سنًا أو الأقل خبرة، لا يزال من المستحسن استخدام فهرسة مستندة إلى قاعدة واحدة.
اقتراح: واحد هو الرقم الأول.
أن تتيح قواعد تسمية ليبرالية
لا يتوقّع المبرمجون المبتدئون أنّ location_X
وlocation_x
متغيّران مختلفان. نتيجةً لذلك، تتّبع Blockly لغةَي BASIC وHTML من خلال
عدم مراعاة حالة الأحرف في المتغيّرات والدوالّ. تستخدِم Scratch أسلوبًا دقيقًا
أكثر (كما هو موضّح على يسار الصفحة) وتراعي حالة الأحرف في أسماء المتغيّرات، ولكن ليس
في عمليات التحقّق من المساواة.
لا تتطلّب Blockly أيضًا أن تكون المتغيّرات والدوالّ متوافقة مع المخطّط
النموذجي [_A-Za-z][_A-Za-z0-9]*
. إذا أراد أحدهم تسمية متغيّر List
of zip codes
أو רשימת מיקודים
، هذا أمر جيد تمامًا.
اقتراح: تجاهل حالة الأحرف، والسماح بأي أسماء
جعل جميع المتغيّرات عامة
يواجه المبرمجون المبتدئون أيضًا صعوبات في فهم النطاق. نتيجةً لذلك، يلي Blockly أسلوب Scratch من خلال جعل جميع المتغيّرات عالمية. إنّ السلبيات الوحيدة للمتغيّرات الشاملة هي أنّ التكرار أكثر تعقيدًا (يجب دفع المتغيّرات وإزالتها من قائمة)، ولكن هذه تقنية برمجة تتجاوز نطاق المستخدمين المستهدَفين في Blockly.
اقتراح: النطاق خارج النطاق، اترك هذا الخيار لوقت لاحق.
ضع في الاعتبار كيفية التعامل مع القيم الاختيارية المعروضة
تُنفِّذ العديد من الدوالّ في البرمجة المستندة إلى النصوص إجراءً، ثم تعرِض قيمة.
قد يتم استخدام قيمة الإرجاع هذه أو لا يتم استخدامها. ومن الأمثلة على ذلك دالة pop()
للتكدّم. قد يتم استدعاء Pop للحصول على العنصر الأخير وإزالته، أو قد يتم
استدعاؤه لإزالة العنصر الأخير فقط مع تجاهل القيمة المعروضة.
var last = stack.pop(); // Get and remove last element.
stack.pop(); // Just remove last element.
لا تجيد اللغات المستندة إلى الكتل بشكل عام تجاهُل قيمة الإرجاع. يجب توصيل قالب القيمة بعنصر يقبل القيمة. هناك عدة استراتيجيات للتعامل مع هذه المشكلة.
(أ) تجنُّب المشكلة تم تصميم معظم اللغات المستندة إلى الكتل بهدف تجنُّب هذه الحالات. على سبيل المثال، لا تتضمّن Scratch أيّ كتل لها أثران جانبيان وقيمة معروضة.
(ب) تقديم كتلتين إذا لم تكن المساحة في صندوق الأدوات مشكلة، يمكنك استخدام حلّ بسيط وهو تقديم عنصرَين من كل نوع من هذا النوع من الكتل، أحدهما يحتوي على قيمة مرتجعة والآخر بدون قيمة مرتجعة. الجانب السلبي من ذلك هو أنّه يمكن أن يؤدي إلى أدوات مربكة تحتوي على الكثير من الكتل المتطابقة تقريبًا.
ج) تغيير قطعة واحدة. استخدِم قائمة منسدلة أو مربّع اختيار أو عنصر تحكّم آخر يسمح للمستخدم باختيار ما إذا كانت هناك قيمة معروضة أم لا. يتغيّر شكل الكتلة بعد ذلك تبعًا لخياراتها. يمكن العثور على مثال على ذلك في قائمة كتلة الوصول في Blockly.
د) تناول القيمة. أنشأ الإصدار الأول من App Inventor وحدة خاصة لمسار التحويل التي كانت تستهلك أي قيمة متصلة. لم يفهم المستخدمون هذا المفهوم، ولذلك أزال الإصدار الثاني من App Inventor وحدة علامة الشرطة المائلة واقترح بدلاً من ذلك أن يحدّد المستخدمون القيمة لمتغيّر صالح لمرة واحدة.
اقتراح: لكل استراتيجية مزايا وعيوب، لذا اختَر ما يناسب مستخدِميك.
إنشاء رمز برمجي سهل القراءة
من المفترض أن يتمكّن مستخدمو Blockly Advanced من الاطّلاع على الرمز الذي تم إنشاؤه (JavaScript وPython وPHP وLua وDart وما إلى ذلك) والتعرّف على البرنامج الذي كتبوه على الفور. وهذا يعني أنّه يجب بذل جهد إضافي للحفاظ على سهولة قراءة هذا الرمز البرمجي الذي تم إنشاؤه آليًا. إنّ الأقواس الزائدة والمتغيّرات الرقمية والمسافات الفارغة المكثّفة والنماذج المفصّلة للرموز تقف جميعها في طريق إنشاء رمز أنيق. يجب أن يتضمّن الرمز المُنشَئ تعليقات وأن يكون متوافقًا مع إرشادات أسلوب Google.
اقتراح: كن فخورًا بالرمز الذي أنشأته. عرضها للمستخدم
قبول الاختلافات بين اللغات
من الآثار الجانبية للرغبة في الحصول على رمز برمجي نظيف أنّ سلوك Blockly يتم تحديده بشكل كبير من حيث سلوك اللغة المُجمَّعة بشكل متعدّد. لغة الإخراج الأكثر استخدامًا هي JavaScript، ولكن إذا تم تجميع Blockly بشكل متعدّد بلغة مختلفة، يجب عدم بذل محاولات غير معقولة للحفاظ على السلوك الدقيق في كلتا اللغتَين. على سبيل المثال، في JavaScript، تكون السلسلة الفارغة خطأ، في حين تكون صحيحة في Lua. سيؤدي تحديد نمط واحد من السلوك لرمز Blockly من أجل تنفيذه بغض النظر عن اللغة الهدف إلى إنشاء رمز لا يمكن صيانته ويبدو أنّه ناتج من مترجم GWT.
اقتراح: لغة Blockly ليست لغة، لذا يجب السماح للغة الحالية بتأثير السلوك.