연결 확인

연결 검사는 서로 연결할 수 있는 연결 (및 블록)을 제한합니다.

연결 확인은 모델링 유형에 유용합니다. 예를 들어 다음 세 블록은 서로 다른 유형을 반환하는 코드를 나타내기 때문에 연결된 비즈니스가 없습니다.

정사각형 루트 블록에 연결되고 대문자 블록에 연결된 빈 목록 블록

연결 확인을 사용하여 이러한 블록이 연결되지 않도록 할 수 있습니다. 이렇게 하면 사용자에게 즉각적인 피드백을 제공하고 여러 가지 간단한 실수를 방지할 수 있습니다.

작동 방식

모든 연결은 null을 허용하는 문자열 배열인 '연결 확인'과 연결될 수 있습니다.

다음과 같은 경우 두 연결을 연결할 수 있습니다.

  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']
    }
  ]
}

JavaScript

최상위 연결의 경우 연결을 정의하는 메서드에 확인을 직접 전달할 수 있습니다. 값을 전달하지 않으면 검사는 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로 설정해야 합니다.

모든 유형을 허용하는 값 블록

반환 하위유형

하위유형을 '반환'하는 블록을 만들려면 유형과 상위유형을 모두 출력의 연결 검사에 포함해야 합니다.

유형 및 상위 유형을 반환하는 값 블록

하위유형의 경우 블록이 항상 두 유형을 모두 '반환'하므로 출력 검사에 여러 검사를 수행해도 괜찮습니다.

매개변수화된 유형 반환

매개변수화된 유형을 '반환'하는 블록을 만들려면 매개변수화된 버전과 매개변수화되지 않은 버전을 모두 출력의 연결 확인에 포함해야 합니다.

원하는 블록 언어의 엄격성에 따라 유형의 분산을 포함할 수도 있습니다.

매개변수화된 유형과 매개변수화되지 않은 유형을 반환하는 값 블록

하위유형과 마찬가지로 블록이 항상 두 유형을 모두 '반환'하기 때문에 이 경우에는 출력 검사에서 여러 검사를 수행해도 괜찮습니다.

스택 또는 문 예시

개발자가 이전 및 다음 연결의 검사를 정의하는 일반적인 방법이 몇 가지 있습니다. 일반적으로 이러한 차단은 블록의 순서를 제한하는 것으로 생각됩니다.

그다음 연결에는 현재 블록 다음에 이어지는 블록이 포함되어야 하며, 이전 연결에는 현재 블록이 '있는' 항목이 포함됩니다.

블록을 순서대로 유지

정의된 순서로 연결되는 블록 집합을 만들려면 다음 연결 확인에서 현재 블록 뒤에 따라야 하는 블록과 이전 연결 확인의 현재 블록이 '있는' 블록을 포함해야 합니다.

강제 순서가 지정된 명령문 블록

중간 블록을 많이 허용

많은 중간 블록을 허용하는 정렬된 블록 집합을 만들려면 중간 블록의 이전 연결 확인에서 가져온 항목을 중간 블록의 다음 연결 확인에 하나 이상 포함해야 합니다. 이렇게 하면 블록 다음에는 더 많은 블록이 뒤따를 수 있습니다.

많은 중간 블록을 허용하는 문 블록

중간 블록 허용 안 함

중간 블록이 선택사항인 순서가 지정된 블록 집합을 만들려면 중간 블록의 이전 연결 확인과 첫 번째 블록의 다음 연결 확인 시 마지막 블록의 이전 연결 확인에 있는 항목을 하나 이상 포함해야 합니다. 이렇게 하면 첫 번째 블록 다음에 중간 블록 또는 마지막 블록이 옵니다.

중간 블록을 허용하지 않는 문 블록

둘 중 하나 또는 스택

한 그룹의 블록만 따라갈 수 있거나 다른 그룹의 블록 (둘 다는 아님)만 따라갈 수 있는 블록을 만들려면 다음 두 가지 작업을 실행해야 합니다.

  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;
  },
}

일반 유형

이 시스템은 단독으로 일반 유형 정의를 지원하지 않습니다. 예를 들어 입력 내용이 무엇이든 '반환'하는 'ID' 블록을 만들 수 없습니다.

입력과 일치하도록 블록의 출력에서 연결 확인을 적극적으로 변경하여 이를 약간 지원할 수 있습니다. 이벤트 시스템을 사용하여 이동 이벤트를 차단하여 할 수 있는 작업

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

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

그러나 연결된 블록이 또한 일반적이면 올바르게 작동하지 않습니다. 이 케이스에 대한 적절한 해결 방법이 없습니다.

연결 검사기

이 시스템이 사용 사례에 적합하지 않으면 커스텀 연결 검사기를 만들어 연결 검사 비교 방법을 변경할 수도 있습니다.

예를 들어, 이러한 시스템의 일부 제한사항을 처리하는 고급 시스템을 만들려면 맞춤 연결 검사기를 만들면 됩니다.