Bloklar parantez gösterir. Örneğin, aşağıdaki blokları gördüğünüzde, 5
ve 2
bir blokun, -
ise başka bir blokun parçası olduğu için bunun -5 + 2
değil -(5 + 2)
anlamına geldiğini varsayalım.
Ancak her blokun etrafına parantez işareti koymanız, kodun çok daha okunaklı olmamasına neden olur. (((5) * (2)) + (3))
ile 5 * 2 + 3
karşılaştırmasını yapın. Bu ifadelerin ikisi de aynı şeyi (13
) ifade eder, ancak ikincisinin okunması çok daha kolaydır.
Blockly'nin operatör öncelik kuralları, maksimum okunabilirlik için minimum parantez sayısıyla kod oluşturmanıza yardımcı olur.
"Doğru" çıkış oluşturma
Oluşturulan kodunuzun kullanıcıların okuyabileceği şekilde olması gerekmiyorsa parantezleri küçültme konusunda endişelenmenize gerek yoktur. Her bloku sarmalamak iyi bir yaklaşımdır ve oluşturulan kodunuzun her zaman doğru şekilde değerlendirilmesini sağlar.
Doğruluğu sağlamak için her zaman Order.ATOMIC
-valueToCode
çağrısını iletin ve blok kodu oluşturucunuzdan her zaman Order.NONE
kodunu döndürün.
En uygun parantezleri oluşturma
Parantezlerin sadece oluşturulan kod olmadan yanlış olması durumunda eklenmesi gerekir. Bu durum, dış bloktaki bir operatörün önceliği iç bloktaki operatörün önceliğinden daha güçlü olduğunda meydana gelir.
Örneğin, aşağıdaki bloklarda tekli olumsuzlama operatörü ve ekleme operatörü bulunmaktadır. Tekli olumsuzlama, ekleme operatöründen daha güçlü bir önceliğe sahiptir.
Dolayısıyla, parantez eklemezseniz -5 + 2
alırsınız ve -
, bloklarla eşleşmeyen +
'den önce değerlendirilir.
Farklı operatörlerin ne kadar güçlü olduğunu söyleyerek parantezleri ne zaman eklemesi gerektiğini oluşturucuya söyleyebilirsiniz. Dış operatörün iç operatörden daha güçlü olduğu tespit edilirse iç operatörü korumak için parantez ekler.
valueToCode
, dış operatörün önceliğini alır ve döndürülen operatörün önceliğini belirtir.
İki operatör içeren bir blok örneği aşağıda verilmiştir:
import {javascriptGenerator, Order} from 'blockly/javascript';
javascriptGenerator.forBlock['negate_plus_two'] = function(block, generator) {
// valueToCode takes in the precedence of the outer operator.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
// The return tuple specifies the precedence of the inner operator.
return [code, Order.ADDITION];
}
valueToCode önceliği
Bir iç bloğun kodunu oluşturmak için valueToCode
yöntemini çağırdığınızda bunu, iç bloğun koduna işlem yapan en güçlü operatör'ün önceliğini geçirirsiniz. Bu, iç blokun kodunun korunması gereken operatördür.
Örneğin, aşağıdaki bloklarda hem tekli olumsuzlama operatörü hem de ekleme operatörü iç bloğun koduna hareket etmektedir. Tekli olumsuzlama daha güçlü olduğundan valueToCode
öğesine iletmeniz gereken öncelik budur.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Önceliği döndür
Blok kodu oluşturma aracınızdan bir öncelik döndürdüğünüzde, blok kodu içindeki en zayıf operatörün önceliğini döndürün. Bu, korunması gereken operatördür.
Örneğin, aşağıdaki blok hem tekli olumsuzlama operatörü hem de ekleme operatörü içerir. Ekleme daha zayıftır, dolayısıyla blok kodu oluşturma aracından döndürmeniz gereken öncelik budur.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Sıralandırma sıralaması
Her dil oluşturma aracı modülü, söz konusu dilin tüm önceliklerini içeren bir Order
enum tanımlar.
Daha güçlü öncelikler daha düşük yedek değerlere, zayıf öncelikler ise daha yüksek yedekleme değerlerine sahiptir. Güçlü öncelikleri "daha yüksek sıralamaya" sahip olmak, daha zayıf olanları ise "daha alt sıralarda yer almak" olarak düşünebilirsiniz.
Tüm yerleşik diller için Order
sıralamalarını şurada bulabilirsiniz:
Özel öncelikler
Oluşturucuların Order
numaralandırmalarındaki önceliklerin çoğu, ilgili metin tabanlı dilleri tarafından tanımlanan önceliklerle eşleşir. Ancak iki özel öncelik
vardır: Order.ATOMIC
ve Order.NONE
.
Order.ATOMIC
en güçlü önceliktir. Aşağıdaki durumlarda kullanılır:
- Kodun her zaman parantez içinde olmasını sağlamak istersiniz, bu nedenle kodu
valueToCode
işlevine geçirirsiniz. - Bloğunuzda herhangi bir operatör bulunmadığından blok kodu oluşturma aracından döndürülür.
Order.NONE
en zayıf önceliktir. Aşağıdaki durumlarda kullanılır:
- Kodun her zaman parantez içinde olmasını sağlamak, böylece kodu blok kodu oluşturma aracından döndürmenizi öneririz.
- İç blokta işlem yapan operatör olmadığından bunu
valueToCode
öğesine iletiyorsunuz.