در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
رویدادها
در زبانهای برنامهنویسی امروزی، بهخصوص در زبانهای ویژوال، مفهومی به نام رویداد (Event) وجود دارد. رویداد اتفاقات مشخص و تعریف شدهای است که ممکن است حین اجرای برنامه اتفاق بیفتد و این اتفاق ممکن است تحت کنترل کاربر آن نرمافزار باشد یا از کنترل وی خارج باشد. از جمله رویدادهای تعریف شده در برنامهنویسی میتوان به رویداد کلیک، کوچک و بزرگ کردن و تغییر اندازه پنجره برنامه، بستن برنامه، تغییر یک متن، کلیک مضاعف روی یک عنصر، ورود و خروج به یک ناحیه، بیکار شدن برنامه و ... اشاره کرد.
برنامهنویس میتواند بنا به نیاز خود، برای هر رویداد برنامه رویهای تعریف کند تا در زمان رخ دادن آن رویداد، رویه مربوطه فراخوانی و اجرا شود. پرکاربردترین رویدادها در برنامهها کلیک، کلیک مضاعف و فشردن کلید در محیط برنامه است. هنگامی که در فرمی از برنامهروی دکمهای کلیک میکنید، رویداد کلیک آن دکمه فراخوانی میشود و آنچه که بعد از فشردن دکمه رخ میدهد، درواقع روالی است که برنامهنویس برای رویداد کلیک آن دکمه تعریف کرده است. ممکن است با کلیک مضاعف روی فرم یک برنامه پنجره Open ظاهر شود (مثل نرمافزار فتوشاپ). همچنین کار کلیدهای میانبر Ctrl+O و 4Alt+F در رویداد فشار کلید آن برنامه تعریف شده است.
تعداد رویدادها در یک برنامه بسیار زیاد است. چیزی که مهم است آن است که برنامهنویس باید حتیالامکان رویدادها را بشناسد به زمان فراخوانی هر یک آشنا باشد و هنگام برنامهنویسی نیز به این نکته توجه داشته باشد. زمان فراخوانی یک رویداد و نیز تعداد دفعات فراخوانی ممکن است در زمان برنامهنویسی مشخص نباشد و بههنگام اجرا تعیین شود؛ اما اینکه در زمان هر فراخوانی چه کاری انجام شود، این به عهده برنامهنویس است. ضمن اینکه برنامهنویس میتواند در اکثر موارد پیشبینی کند که در چه شرایطی یک رویداد رخ میدهد و اغلب، دفعات تکرار و تاثیر هر کدام آنها در روند اجرای برنامه نیز قابل پیشبینی است. حال ببینیم یک رویداد چگونه میتواند در سرعت اجرای یک برنامه و کارایی آن تاثیر بگذارد.
از کار انداختن به موقع رویدادها
روالهای مربوط به رویدادها روالهایی هستند که فراخوانی آنها بهصورت خودکار انجام میشود. یعنی معمولا برنامهنویس نام روال رویداد را در متن برنامه نمیآورد و بهطور مستقیم آن را فراخوانی نمیکند. (مگر اینکه بخواهد بهطور مجازی فرض را بر این بگذارد که اتفاقی افتاده است که در این صورت میتواند بهطور مستقیم آن روال را فراخوانی کند)، اما در جایی که لازم است میتواند یک رویداد را از کار بیندازد. بهعبارتی میتواند کاری کند که هنگام وقوع آن رویداد، روال مربوطه اجرا نشود و در صورت لزوم میتواند دوباره آن را فعال کند. با ذکر یک مثال بحث را دنبال میکنیم.
کادرهای متنی از جمله Text box و Memo، رویدادی بهنام Onchange دارند. این رویداد زمانی که متن داخل این کادرها تغییر کند، بهطور خودکار فراخوانی میشود. مثلا برنامهنویس میتواند از این خاصیت بهگونهای استفاده کند که با ورود هر حرف توسط کاربر نزدیکترین واژه بهعبارت ورودی او را بهوی پیشنهاد دهد. این دقیقا کاری است که در Autocomplete و نیز در وبسایتها انجام میشود. حال فرض کنید برنامهای مثل ویراستار متن نوشتهاید که میخواهید تعداد حروف «a» در متن را نشان دهد. هر بار هم که کاربر حرفی اضافی و کم کرد، شمارنده مربوطه را نسبت به آن تغییر اضافه و کم کرده و به طور زنده تعداد حروف «a» را در گوشهای نمایش میدهید.
حال اگر بر یک متن بزرگ مثلا صد صفحهای را باز کرده باشد، با تایپ هر حرف رویداد Onchange بهدلیل تغییر متن فراخوانی میشود و اگر در این رویداد کدی نوشته باشید که از ابتدا تا انتها تعداد حروف «a» را بشمارد، آنگاه هر بار که کاربر حرفی تایپ میکند یک متن صد صفحهای از ابتدا تا انتها حرفبهحرف بررسی میشود. در این صورت میتوان تصور کرد که چه فاجعهای رخ خواهد داد!برای متنهای کوتاه این کار آنقدر سریع انجام میشود که کاربر احساس نمیکند. اما برنامهنویس باید این پیشبینی را بکند که ممکن است کاربر متن بزرگی را در آن بارگذاری کند. بنابراین باید به فکر چاره باشد تا به این ترتیب کارایی برنامه افت پیدا نکند. مثلا میتواند روال شمارش حروف «a» را از رویداد Onchange برداشته و در رویداد کلیک دکمهای قرار دهد تا کاربر هرگاه خواست که از این مساله آگاه شود، روی آن دکمه کلیک کند. در این مورد همیشه کار بهپایین آمدن کارایی ختم نمیشود و ممکن است اتفاق بدتری بیفتد.
فرض کنید میخواهید هر بار که کاربر در متن حرف «a» را وارد کرد شما یک حرف «a» دیگر بهطور خودکار به انتهای متن اضافه کنید. (این کار در اینجا ممکن است بیهوده بهنظر برسد. اما شما فرض را بر این بگذارید که منطقی برای این کار وجود دارد)رویداد Onchange نمیتواند تشخیص دهد که حرف a وارد شده توسط کاربر یا توسط برنامه. این رویداد فقط تغییر را تشخیص میدهد. بنابراین هنگامی که کاربر یک بار حرف a را وارد میکند رویداد تغییر، فراخوانی شده و یک حرف a دیگر به انتهای متن اضافه میکند.
با اضافه شدن این a متن تغییر کرده و مجددا رویداد تغییر فراخوانی میشود و این کار تا بینهایت ادامه پیدا میکند. در واقع برنامه شما یک اشکال جدی دارد که موجب میشود برنامه به حالت Not Responding رفته و کاربر مجبور شود برنامه را بهطور غیرطبیعی پایان دهد (End task) و اگر متن کاربر، ذخیره نشده باشد مسلما او از این اشکال برنامه عصبانی خواهد شد!
باز هم برنامهنویس با پیشبینی این مساله میتواند راه چاره باشد. یک راه حل آن است که کاربر در رویداد فشار کلید (OnKeyDown) بررسی کند که اگر حرف وارد شده a است رویداد تغییر را از کار بیندازد و یک حرف a دیگر اضافه کند و سپس رویداد تغییر را دوباره فعال کند.
حلقهای از رویدادها
همانطور که پیش از این گفتیم، دستوراتی که داخل حلقههای تکرار قرار دارند، میتوانند در سرعت و کارایی برنامه تاثیر بگذارند و برنامهنویس باید تا حد ممکن در بهینهسازی دستورات داخل حلقههای تکرار بکوشد. یک رویداد ممکن است در طول اجرای برنامه تنها یک بار رخ دهد. مثلا رویداد بسته شدن برنامه تنها یک بار آن هم زمان خروج از برنامه فراخوانی میشود که میتوان در آن اعمال بازپسگیری منابع و حتی یک پیام خداحافظی قرار داد، اما رویدادهایی که ممکن است در طی اجرای برنامه بکرات اجرا شوند حکم حلقههای تکرار را دارند. با این که ممکن است درون روالهای آنها حلقه تکراری وجود نداشته باشد، اما رخ دادن مداوم آن رویداد در حقیقت دستورات داخل روال مربوطه را مانند حلقه تکرار اجرا میکند. بنابراین برنامهنویس باید رویدادهای تکرارشونده را بشناسد و در نوشتن روالهای مربوطه دقت کافی را بهخرج دهد و با آنها مانند یک حلقه تکرار برخورد کند.
بهروزرسانی گرافیکی
مساله تکرارشونده دیگری که در برنامهها انجام میشود و اغلب برنامهنویسهای آماتور به آن توجه ندارند بهروزرسانی گرافیکی محیط برنامه است. برخی از عناصر گرافیکی برنامهنویسی تنها برای آگاه کردن کاربر از اعمال پشت صحنه برنامه است. هر کار گرافیکی نیز بسته به حجم و نوع پردازش زمانی از پردازنده را بهخود اختصاص میدهد. بنابراین اگر عملیات زیاد و سریعی در پشت صحنه در حال انجام است که میخواهید کاربر را از نتایج آن آگاه کنید، سعی کنید در فاصلههای مشخص و منطقی بهروزرسانی گرافیکی را انجام دهید. بهعنوان یک مثال ساده، اگر برنامه در حال کپی یک فایل از جایی به جای دیگر است، لازم نیست روند پیشرفت کار را بعد از کپی شدن هر بایت به اطلاع کاربر رساند.
این کار شاید بهمراتب از خود عمل کپی کردن زمانگیرتر باشد. میتوان بعد از کپی شدن هر کیلوبایت یا هر مگابایت این مساله را به کاربر اعلام کرد یا این که روند پیشروی را با نسبت درصد به آگاهی مخاطب رسانید. با تعمیم این مثالهای ساده و بدیهی، میتوان به مواردی پی برد که درعمل کارایی برنامه را به سادگی به چند برابر افزایش خواهند داد.
پارسا ستودهنیا
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: