Bloklar parantez anlamına gelir. Örneğin, aşağıdaki blokları gördüğünüzde 5
ve 2
bir bloğun, -
ise başka bir bloğun parçası olduğu için bunun -5 + 2
değil -(5 + 2)
anlamına geldiğini varsayabilirsiniz.
Ancak her bloğun etrafına parantez koyarsanız kod çok daha okunaklı olmaz. (((5) * (2)) + (3))
ile 5 * 2 + 3
metriklerini karşılaştırın. Bu ifadelerin ikisi de aynı sonucu (13
) verir ancak ikincisinin okunması çok daha kolaydır.
Blockly'nin operatör önceliği kuralları, maksimum okunabilirlik için minimum sayıda parantez içeren kod oluşturmanıza yardımcı olur.
"Doğru" çıkış oluşturma
Oluşturulan kodunuzun insanlar tarafından okunabilir olması gerekmiyorsa parantezleri en aza indirme konusunda endişelenmenize gerek yoktur. Her bloğu 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 valueToCode
çağrılarına her zaman Order.ATOMIC
gönderin ve blok kodu oluşturucunuzdan her zaman Order.NONE
döndürün.
En uygun parantezleri oluşturma
Parantezlerin yalnızca oluşturulan kod parantez olmadan yanlışsa eklenmesi gerekir. Bu durum, dış bloktaki bir operatörün önceliği iç bloktaki bir operatörün önceliğinden daha güçlü olduğunda ortaya çıkar.
Örneğin, aşağıdaki bloklarda bir tek adımlı olumsuzlama operatörü ve bir toplama operatörü vardır. Birli olumsuzlama, toplama operatöründen daha güçlü bir önceliğe sahiptir.
Bu nedenle, parantez eklemezseniz -5 + 2
değerini alırsınız ve -
, bloklarla eşleşmeyen +
değerinden önce değerlendirilir.
Farklı operatörlerinizin ne kadar güçlü olduğunu söyleyerek jeneratöre ne zaman parantez eklemesi gerektiğini bildirebilirsiniz. Dış operatörün iç operatörden daha güçlü olduğunu görürse iç operatörü korumak için parantez ekler.
valueToCode
, dış operatörün önceliğini alır ve döndürülen tuple, iç 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
işlevini çağırdığınızda, iç bloğun kodu üzerinde çalışan en güçlü operatörün önceliğini iletirsiniz. Bu, iç bloğun kodunun korunması gereken operatördür.
Örneğin, aşağıdaki bloklarda hem tek adımlı olumsuzlama operatörü hem de toplama operatörü, iç bloğun kodu üzerinde işlem yapmaktadır. Birli olumsuzlama daha güçlüdür. Bu nedenle, valueToCode
değerine bu önceliği iletmeniz gerekir.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Dönüş önceliği
Blok kodu oluşturucunuzdan bir öncelik döndürdüğünüzde, blokun kodundaki 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 tek adımlı bir olumsuzlama operatörü hem de bir toplama operatörü içerir. Ekleme daha zayıftır. Bu nedenle, blok kodu oluşturucudan döndürmeniz gereken öncelik budur.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Sıralama enumu
Her dil oluşturucu modülü, ilgili dile ait tüm öncelikleri içeren bir Order
enum tanımlar.
Daha güçlü öncelikler daha düşük destek değerlerine, daha zayıf öncelikler ise daha yüksek destek değerlerine sahiptir. Güçlü öncelikleri, güç açısından "daha yüksek sırada", zayıf öncelikleri ise "daha düşük sırada" olarak düşünebilirsiniz.
Tüm yerleşik diller için Order
enum'larını burada bulabilirsiniz:
Özel öncelikler
Oluşturucuların Order
enum'larındaki önceliklerin çoğu, ilgili metin tabanlı diller tarafından tanımlanan önceliklerle eşleşir. Ancak Order.ATOMIC
ve Order.NONE
olmak üzere iki özel öncelik vardır.
Order.ATOMIC
en yüksek önceliktir. Aşağıdaki durumlarda kullanılır:
- Kodu her zaman parantez içine almasını sağlamak için
valueToCode
işlevine iletiyorsunuz. - Blokunuzda operatör olmadığından blok kod oluşturucunuzdan döndürür.
Order.NONE
en düşük önceliğe sahiptir. Aşağıdaki durumlarda kullanılır:
- Kodu her zaman parantez içine almasını sağlamak için kod blok oluşturucunuzdan döndürürsünüz.
- İç blokta işlem yapan operatör olmadığından bu blok
valueToCode
'ye iletilir.