بررسی اتصال

بررسی های اتصال محدود می کند که کدام اتصالات (و در نتیجه بلوک ها) می توانند به یکدیگر متصل شوند.

بررسی اتصال برای انواع مدل‌سازی مفید است. به عنوان مثال، سه بلوک زیر هیچ کسب و کاری متصل نیستند، زیرا آنها کدی را نشان می دهند که انواع مختلفی را برمی گرداند:

یک بلوک لیست خالی، متصل به یک بلوک ریشه مربع، متصل به یک بلوک بزرگ

برای جلوگیری از اتصال این بلوک ها می توان از بررسی اتصال استفاده کرد. این به کاربران بازخورد آنی می دهد و از بسیاری از اشتباهات ساده جلوگیری می کند.

چگونه کار می کنند

هر اتصال را می توان با یک "بررسی اتصال" که یک آرایه از رشته ها تهی می شود، مرتبط کرد.

دو اتصال می توانند متصل شوند اگر:

  1. آنها انواع سازگار هستند (به عنوان مثال خروجی اتصال به ورودی).
  2. آنها حداقل یک رشته مشترک در بررسی اتصال خود دارند.

به عنوان مثال، دو چک زیر می توانند به هم متصل شوند، زیرا آنها رشته 'apple' را به اشتراک می گذارند:

['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']

اما این دو چک نمی توانند به هم متصل شوند، زیرا هیچ رشته ای به اشتراک نمی گذارند:

['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']

یک مورد خاص دیگر نیز وجود دارد. اگر هر یک از آرایه ها null باشد، آنگاه دو اتصال نیز می توانند به هم متصل شوند. این به شما امکان می دهد اتصالاتی را تعریف کنید که می توانند به هر چیزی متصل شوند.

null
['ape', 'bear', 'caterpillar]

چک ها را تنظیم کنید

به طور پیش فرض، همه اتصالات دارای یک بررسی اتصال null هستند، به این معنی که می توانند به هر چیزی متصل شوند. بررسی اتصال باید به صورت دستی اختصاص داده شود.

نحوه اختصاص بررسی اتصال به اتصالات بسته به اینکه از تعاریف بلوک JSON یا تعاریف بلوک جاوا اسکریپت استفاده می کنید متفاوت است.

JSON

برای اتصالات سطح بالا، چک را مستقیماً به ویژگی تعیین کننده اتصال اختصاص می دهید. مقداری که اختصاص می‌دهید می‌تواند null ، یک رشته (که تنها ورودی در بررسی اتصال می‌شود) یا آرایه‌ای از رشته‌ها باشد.

{
  'type': 'custom_block',

  'output': null,
  'nextStatement': 'a connection check entry',
  'previousStatement': ['four', 'connection', 'check', 'entries']
}

برای ورودی‌ها، می‌توانید چک را به یک ویژگی check از تعریف ورودی اختصاص دهید. اگر ویژگی check وجود نداشته باشد، چک null در نظر گرفته می شود. مقداری که اختصاص می دهید می تواند یک رشته یا آرایه ای از رشته ها باشد.

{
  'type': 'custom_block',
  'message0': '%1 %2',

  'args0': [
    {
      'type': 'input_value',
      'check': 'a connection check entry'
    },
    {
      'type': 'input_statement',
      'check': ['four', 'connection', 'check', 'entries']
    }
  ]
}

جاوا اسکریپت

برای اتصالات سطح بالا، می توانید چک را مستقیماً به روشی که اتصال را تعریف می کند، ارسال کنید. اگر مقداری را پاس نکنید، چک null در نظر گرفته می شود. مقداری که ارسال می کنید می تواند یک رشته (که تنها ورودی در بررسی اتصال می شود) یا آرایه ای از رشته ها باشد.

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.setOutput(true); // null check
    this.setNextStatement(true, 'a connection check entry');
    this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
  }
}

برای ورودی ها، بعد از اینکه ورودی را تعریف کردید، می توانید چک را به روش setCheck منتقل کنید. اگر متد setCheck فراخوانی نشود، چک null در نظر گرفته می شود. مقداری که ارسال می کنید می تواند یک رشته یا آرایه ای از رشته ها باشد.

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.appendValueInput('NAME')
        .setCheck('a connection check entry');
    this.appendStatementInput('NAME')
        .setCheck(['four', 'connection', 'check', 'entries']);
  }
}

رشته های چک داخلی

بلوک‌های داخلی دارای بررسی‌های اتصال با مقادیر 'Array' ، 'Boolean' ، 'Colour' ، 'Number' و 'String' هستند. اگر می‌خواهید بلوک‌های شما با بلوک‌های داخلی کار کنند، می‌توانید از این مقادیر برای سازگار کردن آنها استفاده کنید.

نمونه های ارزشی

هنگامی که بررسی های اتصال را برای ورودی ها و خروجی ها تعریف می کنید، معمولاً باید بررسی ها را به عنوان نمایانگر انواع در نظر بگیرید.

چک ورودی‌ها باید شامل هر «نوعی» باشد که می‌پذیرند، و چک‌های خروجی باید دقیقاً شامل آنچه «باز می‌گردانند» باشد.

یک نوع واحد را بپذیرید

در ابتدایی‌ترین حالتی که می‌خواهید بلوکی ایجاد کنید که یک نوع را «می‌پذیرد» یا «باز می‌گرداند»، باید آن نوع را در بررسی اتصال اتصال قرار دهید.

یک بلوک مقدار که یک نوع واحد را می پذیرد

انواع مختلف را بپذیرید

برای ایجاد بلوکی که چندین نوع را می پذیرد، باید هر نوع پذیرفته شده را در بررسی اتصال ورودی وارد کنید.

یک بلوک ارزش که چندین نوع را می پذیرد

طبق قرارداد، اگر گاهی اوقات بتوان یک خروجی را در موقعیت‌های متعدد پذیرفت (مثلاً اگر اجازه می‌دهید گاهی اوقات از اعداد به‌عنوان رشته‌ها استفاده شود)، خروجی باید محدودتر باشد، و ورودی (ها) باید مجازتر باشد. این کنوانسیون اطمینان حاصل می کند که خروجی ها در جایی که پشتیبانی نمی شوند وصل نمی شوند.

هر نوع را بپذیرید

برای ایجاد بلوکی که هر نوع را می پذیرد، باید بررسی اتصال ورودی را روی null تنظیم کنید.

یک بلوک ارزش که هر نوع را می پذیرد

برگرداندن انواع فرعی

برای ایجاد بلوکی که یک نوع فرعی را «برگرداند»، باید هم نوع و هم supertype را در بررسی اتصال خروجی وارد کنید.

یک بلوک مقدار که نوع و سوپرتایپ آن را برمی گرداند

در مورد زیرگروه‌ها، داشتن چندین بررسی در یک بررسی خروجی اشکالی ندارد، زیرا بلوک همیشه هر دو نوع را «باز می‌گرداند».

انواع پارامتر شده را برگردانید

برای ایجاد بلوکی که نوع پارامتری شده را "بازگرداندن" می کند، باید هم نسخه پارامتری و هم نسخه بدون پارامتر را در بررسی اتصال خروجی قرار دهید.

بسته به اینکه می‌خواهید زبان بلاک شما چقدر سخت‌گیرانه باشد، ممکن است بخواهید واریانس(های) نوع را نیز وارد کنید.

یک بلوک مقدار که نوع پارامتری و نوع غیر پارامتری آن را برمی‌گرداند

درست مانند انواع فرعی، در این مورد نیز وجود چندین بررسی در یک بررسی خروجی اشکالی ندارد، زیرا بلوک همیشه هر دو نوع را "باز می گرداند".

نمونه های پشته یا بیانیه

چند راه متداول وجود دارد که توسعه دهندگان چک را برای اتصالات قبلی و بعدی تعریف می کنند. معمولاً به این فکر می کنید که ترتیب بلوک ها را محدود می کند.

اتصالات بعدی باید شامل بلوک‌هایی باشد که باید از بلوک فعلی پیروی کنند، و اتصالات قبلی شامل آنچه بلوک فعلی است، باشد.

بلوک ها را مرتب نگه دارید

برای ایجاد مجموعه‌ای از بلوک‌ها که به ترتیب تعریف‌شده به هم متصل می‌شوند، باید بنویسید که کدام بلوک‌ها باید از بلوک فعلی در بررسی اتصال بعدی پیروی کنند و بلوک فعلی در بررسی اتصال قبلی چیست.

بلوک های بیانیه ای که دارای دستور اجباری هستند

تعداد زیادی بلوک میانی را مجاز کنید

برای ایجاد مجموعه ای از بلوک های مرتب شده که امکان تعداد زیادی بلوک میانی را فراهم می کند، باید حداقل یک ورودی از بررسی اتصال قبلی بلوک میانی را در بررسی اتصال بعدی بلوک میانی قرار دهید. این اجازه می دهد تا بلوک توسط تعداد بیشتری از خودش دنبال شود.

بلوک های بیانیه ای که تعداد زیادی بلوک میانی را امکان پذیر می کند

هیچ بلوک میانی را مجاز نکنید

برای ایجاد مجموعه‌ای از بلوک‌های مرتب شده که بلوک‌های میانی اختیاری هستند، باید حداقل یک ورودی را از بررسی اتصال قبلی بلوک میانی و بررسی اتصال قبلی بلوک آخر را در بررسی اتصال بعدی بلوک اول وارد کنید. این اجازه می دهد تا بلوک اول با بلوک میانی یا آخرین بلوک دنبال شود.

بلوک‌های بیانیه‌ای که اجازه هیچ بلوک میانی را نمی‌دهند

یا پشته

برای ایجاد بلوکی که فقط می‌تواند توسط بلوک‌هایی از یک گروه یا بلوک‌هایی از گروه دیگر (و نه هر دو) دنبال شود، باید دو کار انجام دهید:

  1. باید حداقل یک ورودی از هر دو گروه بررسی های قبلی اتصال را در بررسی اتصال بعدی بلوک اول وارد کنید.

  2. باید بررسی‌های اتصال بعدی گروه‌ها را به گونه‌ای تعریف کنید که فقط شامل مقادیری باشد که در بررسی‌های قبلی اتصال آنها وجود دارد (بنابراین آنها فقط می‌توانند توسط بلوک‌های همان گروه دنبال شوند).

بلوک‌های دستوری که می‌توانند توسط چندین یک نوع بلوک، یا مضربی از دیگری، اما نه هر دو دنبال شوند

محدودیت ها

این سیستم کاملاً قوی است و می تواند بسیاری از موارد استفاده را حل کند، اما محدودیت هایی دارد.

زمینه بزرگتر را محدود کنید

این سیستم به خودی خود از محدود کردن "زمینه بزرگتر" که در آن اتصال مجاز به اتصال است پشتیبانی نمی کند. به عنوان مثال، نمی توانید بگویید که یک بلوک break فقط در داخل یک بلوک loop مجاز است. سیستم بررسی اتصال فقط دو اتصال فوری را در نظر می گیرد.

می‌توانید با استفاده از سیستم رویداد برای گوش دادن به رویدادهای انتقال بلوک و بررسی اینکه آیا بلوک در موقعیت نادرست قرار گرفته است، از این پشتیبانی کنید.

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (this.workspace.isDragging()) return;
    if (e.type !== Blockly.Events.BlockMove) return;
    if (!this.getSurroundLoop()) this.outputConnection.disconnect();
  }

  loopTypes: new Set(); // Your valid *block types* (not connection checks).

  getSurroundLoop: function () {
    let block = this.getSurroundParent();
    do {
      if (loopTypes.has(block.type)) return block;
      block = block.getSurroundParent();
    } while (block);
    return null;
  },
}

انواع ژنریک

این سیستم به خودی خود از تعریف انواع عمومی پشتیبانی نمی کند. به عنوان مثال، شما نمی توانید یک بلوک "Identity" ایجاد کنید، که هر ورودی خود را "باز می گرداند".

می‌توانید با تغییر فعال بررسی اتصال در خروجی بلوک برای مطابقت با ورودی آن، تا حدودی از این پشتیبانی کنید. کاری که می توانید با استفاده از سیستم رویداد برای گوش دادن به رویدادهای حرکتی مسدود انجام دهید.

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (e.type !== Blockly.Events.BlockMove) return;
    this.setOutput(
        true, this.getInputTargetBlock()?.outputConnection.getCheck());
  }
}

اما اگر بلوک متصل نیز عمومی باشد، این به درستی کار نمی کند. کار خوبی برای این مورد وجود ندارد.

چک کننده های اتصال

اگر این سیستم برای مورد استفاده شما کار نمی کند، می توانید نحوه مقایسه بررسی های اتصال را نیز با ایجاد یک بررسی کننده اتصال سفارشی تغییر دهید.

برای مثال، اگر می‌خواهید یک سیستم پیشرفته‌تر ایجاد کنید که برخی از محدودیت‌های این سیستم را برطرف کند، می‌توانید یک بررسی کننده اتصال سفارشی ایجاد کنید.