연결 검사는 서로 연결할 수 있는 연결 (및 블록)을 제한합니다.
연결 검사는 유형 모델링에 유용합니다. 예를 들어 다음 세 블록은 서로 다른 유형을 반환하는 코드를 나타내므로 연결할 필요가 없습니다.
연결 검사를 사용하여 이러한 블록이 연결되지 않도록 할 수 있습니다. 이렇게 하면 사용자에게 즉각적인 피드백을 제공하고 많은 간단한 실수를 방지할 수 있습니다.
작동 방식
모든 연결은 문자열 배열로 null 허용인 '연결 확인'과 연결될 수 있습니다.
다음과 같은 경우 두 연결을 연결할 수 있습니다.
- 호환되는 유형입니다 (예: 입력에 연결되는 출력).
- 연결 검사에서 공통적으로 하나 이상의 문자열이 있습니다.
예를 들어 다음 두 검사의 연결은 'apple'
문자열을 공유하므로 연결될 수 있습니다.
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
하지만 이 두 검사의 연결은 공유하는 문자열이 없으므로 연결할 수 없습니다.
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
또 다른 특수 사례가 하나 있습니다. 두 배열 중 하나가 null
이면 두 연결도 연결할 수 있습니다. 이렇게 하면 무엇이든 연결할 수 있는 연결을 정의할 수 있습니다.
null
['ape', 'bear', 'caterpillar]
예
연결 확인을 사용하는 방법의 예시 목록은 연결 확인 플레이북을 참고하세요.
설정 확인
기본적으로 모든 연결에는 null
연결 검사가 있습니다. 즉, 모든 항목에 연결할 수 있습니다. 연결 확인은 수동으로 할당해야 합니다.
연결에 연결 검사를 할당하는 방법은 JSON 블록 정의 또는 JavaScript 블록 정의를 사용하는지에 따라 다릅니다.
JSON
최상위 연결의 경우 연결을 정의하는 속성에 직접 검사를 할당합니다. 할당하는 값은 null
, 문자열 (연결 확인의 유일한 항목이 됨), 문자열 배열일 수 있습니다.
{
'type': 'custom_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
입력의 경우 입력 정의의 check
속성에 검사를 할당할 수 있습니다. check
속성이 없으면 검사가 null
로 간주됩니다. 할당하는 값은 문자열이거나 문자열 배열일 수 있습니다.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry' // Accepts custom_value_block
},
{
'type': 'input_statement',
'check': ['two', 'entries'] // Accepts custom_statement_block
}
]
}
자바스크립트
최상위 연결의 경우 연결을 정의하는 메서드에 직접 검사를 전달할 수 있습니다. 값을 전달하지 않으면 검사가 null
으로 간주됩니다. 전달하는 값은 문자열 (연결 확인의 유일한 항목이 됨) 또는 문자열 배열일 수 있습니다.
Blockly.Blocks['custom_value_block'] = {
init: function() {
this.setOutput(true, 'a connection check entry');
}
};
Blockly.Blocks['custom_statement_block'] = {
init: function() {
this.setNextStatement(true); // null check
this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
}
};
입력의 경우 입력을 정의한 후 setCheck
메서드에 검사를 전달할 수 있습니다. setCheck
메서드가 호출되지 않으면 검사가 null
로 간주됩니다. 전달하는 값은 문자열이거나 문자열 배열일 수 있습니다.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry'); // Accepts custom_value_block
this.appendStatementInput('NAME')
.setCheck(['two', 'entries']); // Accepts custom_statement_block
}
};
기본 제공 검사 문자열
내장 블록에는 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
, 'String'
값이 있는 연결 검사가 있습니다. 블록이 내장 블록과 상호 운용되도록 하려면 이러한 값을 사용하여 호환성을 높일 수 있습니다.
제한사항
이 시스템은 매우 강력하며 많은 사용 사례를 해결할 수 있지만 몇 가지 제한사항이 있습니다.
더 큰 맥락 제한
이 시스템은 자체적으로 연결이 허용되는 '상위 컨텍스트'를 제한하지 않습니다. 예를 들어 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());
}
}
하지만 연결된 블록이 또한 일반 블록이면 올바르게 작동하지 않습니다. 이 경우에는 적절한 해결 방법이 없습니다.
연결 검사기
이 시스템이 사용 사례에 적합하지 않은 경우 커스텀 연결 검사기를 만들어 연결 검사를 비교하는 방식을 변경할 수도 있습니다.
예를 들어 이 시스템의 일부 제한사항을 처리하는 고급 시스템을 만들려면 맞춤 연결 검사기를 만들면 됩니다.