ارزیابی اتصال کوتاه Short-Circuit Evaluation
ارزیابی اتصال کوتاه یا Short-Circuit Evaluation چیست؟
ارزیابی اتصال کوتاه (Short-Circuit Evaluation) به نحوه سنجش تعدادی از عملگرهای بولی در برخی از زبان های برنامه نویسی اشاره میکند که در آنها صرفا زمانی عملوند دوم مورد ارزیابی قرار میگیرد که عملوند اول به تنهایی نتواند مقدار نهایی عبارت را مشخص کند.
به عبارت بهتر در Short Circuit اگر پیش از اتمام ارزیابی کامل یک عبارت، بتوان مقدار آن را تشخیص داد از ارزیابی مابقی عبارت خودداری میشود. ارزیابی مینیمال (Minimal Evaluation) نیز معادلی برای همین اصطلاح میباشد.
برای مثال، حاصل عمل AND بولی در صورتی که هر دو عملوند مقدار true داشته باشند برابر با true خواهد بود و در غیراینصورت برابر با false خواهد بود. بنابراین اگر عملوند اول برابر با false باشد نیازی به ارزیابی عملوند دوم نخواهد بود و حاصل عمل برابر با false میباشد. درنتیجه اگر از یک عملگر AND اتصال کوتاه (Short Circuit AND) استفاده کنید در صورتی که نتیجه ارزیابی عملوند اول برابر با false باشد بدون ارزیابی عملوند دوم، حاصل عمل برابر false درنظر گرفته میشود. اما اگر نتیجه ارزیابی عملوند اول برابر با true باشد به ناچار عملوند دوم نیز ارزیابی میشود.
به عنوان مثال دستور شرطی زیر در زبان جاوا را در نظر بگیرید. هدف این دستور چک کردن اینست که آیا مقدار متغیر x در بازه 5 تا 10 قرار میگیرد یا خیر؟ با فرض اینکه && عملگر AND اتصال کوتاه باشد اگر مقدار x برابر با 4 باشد عملوند اول به صورت false ارزیابی میشود و درنتیجه بدون چک کردن عملوند دوم نتیجه عبارت برابر false تشخیص داده میشود.
همین موضوع در مورد عمل OR بولی نیز صادق است. حاصل این عملگر تنها در صورتی برابر با true خواهد بود که حداقل یکی از عملوندهایش برابر با true باشد. بنابراین اگر عملوند اول برابر با true باشد بدون نیاز به ارزیابی عملوند دوم، حاصل عمل برابر با true میباشد.
از آنجایی که حاصل ارزیابی یک عبارت XOR تنها زمانی true میباشد که دقیقا یکی از عملوندها برابر true باشد بنابراین برای این منظور نیاز به دانستن مقدار هر دو عملوند است و عملگر XOR اتصال کوتاه وجود ندارد.
فواید و معایب عملگرهای Short Circuit
استفاده از عملگرهای اتصال کوتاه میتواند به کاهش اعمال لازم و زمان موردنیاز برای ارزیابی یک عبارت کمک کند. این موضوع به خصوص در زمانی که عملوند دوم شامل یک محاسبه طولانی و پیچیده یا عملی زمانبر میباشد (نظیر تابعی که دادههایی را از یک سرور واکشی میکند) به شدت مفید خواهد بود.
همچنین یکی از کاربردهای رایج برای این عملگرها مربوط به زمانی است که ارزیابی اضافی عملوند دوم میتواند منجر به یک خطا شود. برای مثال در قطعه کد زیر به زبان C استفاده از عملگر اتصال کوتاه && تضمین میکند اگر p برابر با null باشد isalpha(p[0]) اجرا نشده و درنتیجه از بروز NullPointerException جلوگیری میکند.
bool is_first_char_valid_alpha(const char *p) { return p != NULL && isalpha(p[0]); }
لازم است بدانید استفاده از عملگرهای Short Circuit به دلیل اثرات جانبی که ممکن است در برخی موارد به خاطر اجرا نشدن و عدم ارزیابی عملوند دوم به وجود آید همیشه هم توصیه نمیشود.
اتصال کوتاه در زبان های برنامه نویسی رایج
در برخی از زبان های برنامه نویسی نظیر Lisp صرفا عملگرهای بولی به شکل اتصال کوتاه عمل میکنند اما در اغلب زبان ها هم عملگرهای بولی معمولی وجود دارد و هم عملگرهای بولی اتصال کوتاه. وجود این دو نوع عملگر در زبان های برنامه نویسی میتواند مشکل اثرات جانبی بیان شده در بالا را بسته به تشخیص برنامه نویس رفع کند.
در بسیاری از زبان های برنامه نویسی رایج از نماد & و | به عنوان عملگرهای استاندارد بولی و از نمادهای && و || برای عملگرهای Short-Circuit معادل استفاده میشود. زبان هایی مثل خانواده C، جاوا، جاوا اسکریپت و PHP از جمله همین زبان ها هستند. در Visual Basic .NET نیز از AndAlso و OrElse به عنوان عملگرهای اتصال کوتاه متناظر با And و Or معمولی استفاده میشود.
پیوندهای پیشنهادی تک دیک