Özel Bloklar: Engelleme Paradigmaları

Blockly kullanan bir uygulama tasarlarken seçilebilecek birkaç paradigma vardır. Bu tercihler kullanıcının ihtiyaç duyacağı engelleri etkilediği için erkenden düşünülmelidir.

Yapılandırma

Birçok Blockly uygulaması, yürütülebilir programlar yerine yapılandırmaları tanımlamak için kullanılır. Yapılandırma uygulamaları genellikle çalışma alanında bir kök düzey bloğu başlatarak başlar. Buna iyi bir örnek olarak Blockly Developer Tools'un Block Factory sekmesi verilebilir:

Blockly.Blocks['factory_base'] = {
  init: function() {
    this.setDeletable(false);
    this.setMovable(false);
    this.setEditable(false);
    // etc...
  }
}

Blockly.serialization.blocks.append({'type': 'factory_base'}, workspace);

Bu işlem, kullanıcının tüm yapılandırmasını barındıran silinemez, taşınamayan bir blok oluşturur. Çalışma alanı, mevcut yapılandırmayı belirlemek için herhangi bir zamanda serileştirilebilir.

Bu tür uygulamalar, kök bloka bağlı olmayan tüm blokları otomatik olarak devre dışı bırakmak isteyebilir. Bu işlem tek satır kullanılarak yapılabilir:

workspace.addChangeListener(Blockly.Events.disableOrphans);

Seri Program

Blockly uygulamalarının çoğu, seri programlar oluşturmak için tasarlanmıştır. Kullanıcılar blokları, sırayla yürütülecek blokları gruplandırır.

Çalışma alanındaki her (devre dışı bırakılmamış) blok, programın bir parçasını oluşturur. Birden fazla blok yığını varsa önce daha yüksek bloklar yürütülür. (İki yığın yaklaşık olarak aynı yükseklikteyse soldaki yığınlara (RTL modunda sağda) öncelik verilir.)

Çalışma alanı herhangi bir zamanda yürütülebilir koda aktarılabilir. Bu kod, istemci tarafında JavaScript'te (değerlendirme veya JS Çevirmeni kullanılarak) ya da sunucu tarafında herhangi bir dilde yürütülebilir.

import {javascriptGenerator} from 'blockly/javascript';

var code = javascriptGenerator.workspaceToCode(workspace);

Paralel Program

Bazı Blockly uygulamaları, tüm blok yığınlarını seri olarak değil, paralel olarak yürütmeyi seçer. Bir davul döngüsünün bir melodiyle eşzamanlı olarak çalıştığı bir müzik uygulaması buna örnek olarak verilebilir.

Paralel yürütmeyi uygulamanın bir yolu, her blok için ayrı ayrı kod oluşturmaktır:

import {javascriptGenerator} from 'blockly/javascript';

var json = Blockly.serialization.workspaces.save(workspace);

// Store top blocks separately, and remove them from the JSON.
var blocks = json['blocks']['blocks'];
var topBlocks = blocks.slice();  // Create shallow copy.
blocks.length = 0;

// Load each block into the workspace individually and generate code.
var allCode = [];
var headless = new Blockly.Workspace();
for (var i = 0; block < topBlocks.length; i++) {
  var block = topBlocks[i];
  blocks.push(block);
  Blockly.serialization.workspaces.load(json, headless);
  allCode.push(javascriptGenerator.workspaceToCode(headless));
  blocks.length = 0;
}

Hedef dil JavaScript ise eş zamanlı yürütme için birden fazla JS Çevirmeni oluşturmak amacıyla allCode dizisi kullanılabilir. Hedef dil Python gibiyse allCode dizisi, iş parçacığı modülü kullanan tek bir programda derlenebilir.

Diğer paralel programlarda olduğu gibi, değişkenler ve fonksiyonlar gibi paylaşılan kaynaklarla ilgili de dikkatli kararlar alınmalıdır.

Etkinlik Odaklı Program

Etkinlik işleyiciler, program tarafından değil, sistem tarafından çağrılan işlevlerdir. Bu bloklar, yürütülecek blok yığınını kapsayabilir veya bir blok yığınının üzerine yerleştirilen başlıklar olabilir.

Bazı geliştiriciler etkinlik bloklarının üst kısmına bir "şapka" ekleyerek bunların diğer bloklardan farklı görünmesini sağlar. Bu, Blockly için varsayılan görünüm değildir ancak oluşturucu sabiti ADD_START_HATS değerini true olarak geçersiz kılarak (Özel oluşturucular codelab - Sabit değerleri geçersiz kıl) veya bir tema ekleyerek blok stilinde şapka seçeneğini ayarlayarak eklenebilir. Temaların parçası olarak bloklara şapka yerleştirme hakkında daha fazla bilgiyi burada bulabilirsiniz.

Etkinlik odaklı bir modelde, programın başlaması için bir işleyici oluşturmak da mantıklı olabilir. Bu modelde, çalışma alanındaki bir etkinlik işleyiciye bağlı olmayan bloklar yoksayılır ve yürütülmez.

Etkinlikleri kullanan bir sistem tasarlarken aynı etkinlik işleyicinin birden fazla örneğini desteklemenin mümkün olup olmadığını göz önünde bulundurun.