بلوک ها دلالت بر پرانتز دارند. به عنوان مثال، وقتی بلوک های زیر را می بینید، فرض می کنید به معنای -(5 + 2)
است نه -5 + 2
زیرا 5
و 2
بخشی از یک بلوک هستند و -
بخشی از یک بلوک دیگر است.
اما اگر دور هر بلوک پرانتز قرار دهید، خوانایی کد بسیار کمتر می شود. (((5) * (2)) + (3))
با 5 * 2 + 3
مقایسه کنید. هر دوی این عبارات به یک چیز ارزیابی می شوند ( 13
) اما خواندن دومی بسیار آسان تر است.
قوانین تقدم عملگر Blockly به شما کمک می کند کدی را با حداقل تعداد پرانتز تولید کنید تا حداکثر خوانایی داشته باشید.
خروجی "درست" تولید کنید
اگر نیازی ندارید که کد تولید شده شما قابل خواندن توسط انسان باشد، دیگر نیازی به نگرانی در مورد کوچک کردن پرانتزها نیست. بسته بندی هر بلوک یک رویکرد خوب است و تضمین می کند که کد تولید شده شما همیشه به درستی ارزیابی می شود.
برای اطمینان از صحت، همیشه Order.ATOMIC
به فراخوانی های valueToCode
منتقل کنید و همیشه Order.NONE
از تولیدکننده کد بلاک خود برگردانید.
ایجاد پرانتز بهینه
پرانتزها فقط در صورتی باید درج شوند که کد تولید شده بدون آنها نادرست باشد. این زمانی اتفاق میافتد که تقدم یک عملگر در بلوک بیرونی قویتر از تقدم عملگر در بلوک داخلی باشد.
به عنوان مثال، در بلوک های زیر یک عملگر نفی یکنواخت و یک عملگر جمع وجود دارد. نفی یکنواخت اولویت قوی تری نسبت به عملگر جمع دارد.
بنابراین اگر پرانتز اضافه نکنید، -5 + 2
دریافت می کنید، و -
قبل از +
ارزیابی می شود، که با بلوک ها مطابقت ندارد.
با گفتن اینکه اپراتورهای مختلف شما چقدر قوی هستند، می توانید به ژنراتور بگویید که چه زمانی پرانتز را وارد کند. اگر ببیند که عملگر خارجی قویتر از عملگر داخلی است، برای محافظت از عملگر داخلی، پرانتزها را وارد می کند.
valueToCode
اولویت عملگر بیرونی را می گیرد و تاپل بازگشتی اولویت عملگر داخلی را مشخص می کند.
در اینجا یک مثال برای بلوکی است که شامل دو عملگر است:
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
هنگامی که valueToCode
برای تولید کد یک بلوک داخلی فراخوانی میکنید، آن را در اولویت قویترین عملگر فعال بر روی کد بلوک داخلی قرار میدهید. این اپراتوری است که کد بلوک داخلی باید از آن محافظت شود.
به عنوان مثال، در بلوکهای زیر هم عملگر نفی واحد و هم عملگر جمع بر روی کد بلوک داخلی عمل میکنند. نفی یکنواختی قوی تر است، بنابراین این اولویتی است که باید به valueToCode
بدهید.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
اولویت بازگشت
وقتی اولویتی را از مولد کد بلاک خود برمی گردانید، اولویت ضعیف ترین عملگر را در کد بلوک برگردانید. این اپراتور است که نیاز به محافظت دارد.
به عنوان مثال، بلوک زیر شامل یک عملگر نفی یکنواخت و یک عملگر جمع است. افزودن ضعیف تر است، بنابراین اولویتی است که باید از تولید کننده کد بلوک برگردید.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
تعداد را سفارش دهید
هر ماژول مولد زبان یک Order
enum را تعریف می کند که شامل تمام اولویت های آن زبان است.
اولویت های قوی تر دارای مقادیر پشتوانه پایین تری هستند و اولویت های ضعیف تر دارای مقادیر پشتوانه بالاتری هستند. شما میتوانید اولویتهای قوی را بهعنوان «رتبههای بالاتر» در قدرت، و اولویتهای ضعیفتر بهعنوان «رتبههای پایینتر» در نظر بگیرید - گویی جنگجویان رقابتی هستند.
در اینجا میتوانید فهرستهای Order
برای همه زبانهای داخلی پیدا کنید:
اولویت های خاص
بیشتر اولویتها در فهرستهای Order
تولیدکنندگان با اولویتهای تعریفشده توسط زبانهای مبتنی بر متن مربوطه مطابقت دارند. اما دو اولویت ویژه وجود دارد، Order.ATOMIC
و Order.NONE
.
Order.ATOMIC
قوی ترین اولویت است. زمانی استفاده می شود که:
- شما می خواهید مطمئن شوید که کد همیشه پرانتز است ، بنابراین آن را به
valueToCode
ارسال می کنید. - بلوک شما شامل هیچ عملگر نمیشود، بنابراین آن را از تولیدکننده کد بلاک خود برمیگردانید.
Order.NONE
ضعیف ترین اولویت است. زمانی استفاده می شود که:
- میخواهید مطمئن شوید که کد همیشه پرانتز است ، بنابراین آن را از تولیدکننده کد بلاک خود برمیگردانید.
- هیچ عملگر روی یک بلوک داخلی وجود ندارد، بنابراین آن را به
valueToCode
ارسال می کنید.