سلام و درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. رویداد در برنامه نویسی یعنی وقتی ما یک Event را تعریف میکنیم در واقع به برنامه و نرمافزار خود دستور میدهیم که در صورت بروز یک اتفاق خاص، رویداد مدنظر ما رخ دهد. در این بخش از آموزش قصد داریم رویدادها یا Events در #F و کلاس رویداد و رویداد Module در #F رو مورد بررسی قرار دهیم .همچنین چگونگی ایجاد یک رویداد در #F رو نیز خواهیم داشت.
در ابتدا می خواهیم بدانیم که رویدادها یا Events در #F چه کاربردی دارند.
رویدادها به کلاس ها اجازه می دهند که پیام ها را به یکدیگر ارسال و دریافت کنند.
در GUI رویدادها اقدامات کاربر مانند فشار کلید، کلیک، حرکات ماوس، و غیره، و یا برخی از وقایع مانند اعلان تولید شده سیستم هستند.
برنامه های کاربردی نیاز به پاسخ به وقایع، زمانی که آن ها رخ می دهد، دارند.
به عنوان مثال، interrupts. رویدادها برای برقراری ارتباط بین فرآیند استفاده می شود.
اشیاء با یکدیگر از طریق پیغام همزمان همگام سازی می کنند.
رویدادها به سایر توابع متصل می شوند اشیاء توابع callback را به یک رویداد ثبت می کنند.
و این callback ها وقتی که (و اگر) Events ها توسط برخی از اشیا اجرا می شوند ،رخ می دهند .
کلاس <Control.Event<‘T کمک می کند در ایجاد یک شی یا رویداد قابل مشاهده.
به عنوان اعضا ی نمونه برای کار با Events در زیر آمده است.
عضو | شرح |
---|---|
Publish | مشاهدات را به عنوان ارزش اولین کلاس منتشر می کند. |
Trigger | مشاهدات را با استفاده از پارامترهای داده شده راه اندازی می کند. |
ماژول Control.Event توابع را برای مدیریت جریان رویداد فراهم می کند.
مقدار | شرح |
---|---|
add : (‘T → unit) → Event<‘Del,’T> → unit | تابع داده شده را هر بار که رویداد داده شده تریگر شود، اجرا می کند. |
choose : (‘T → ‘U option) → IEvent<‘Del,’T> → IEvent<‘U> | رویداد جدیدی که selection پیام از رویداد original را فعال می کند، برمی گرداند. تابع selection یک پیام اصلی را به یک پیام جدید اختیاری می برد. |
filter : (‘T → bool) → IEvent<‘Del,’T> → IEvent<‘T> | یک رویداد جدید را که به رویداد original گوش می دهد را برمی گرداند. و رویداد حاصل را تنها زمانی که آرگومان به رویداد تابع داده شده منتقل می شود. |
map : (‘T → ‘U) → IEvent<‘Del, ‘T> → IEvent<‘U> | رویداد جدیدی را که مقادیر تبدیل شده توسط تابع داده شده را می گذراند، برمی گرداند. |
merge : IEvent<‘Del1,’T> → IEvent<‘Del2,’T> → IEvent<‘T> | رویداد خروجی هنگام وقوع هر یک از رخدادهای ورودی فعال می شود. |
pairwise : IEvent<‘Del,’T> → IEvent<‘T * ‘T> | یک رویداد جدید را که در دومی و پس از وقوع رویداد ورودی تریگر شده ،باز می گرداند. تریگر Nth از رویداد ورودی، آرگومان های N-1 و Nth را به عنوان یک جفت منتقل می کند. استدلال انتقال یافته به N-1triggering در وضعیت hidden internal نگه داشته می شوند تا زمانی که Nth triggering رخ دهد. |
partition : (‘T → bool) → IEvent<‘Del,’T> → IEvent<‘T> * IEvent<‘T> | تریگر Nth از رویداد ورودی، آرگومان های N-1 و Nth را به عنوان یک جفت منتقل می کند. آرگومان انتقال یافته به N-1triggering در وضعیت داخلی پنهان hidden internal نگه داشته می شود تا زمانی که تریگر Nth رخ دهد. |
scan : (‘U → ‘T → ‘U) → ‘U → IEvent<‘Del,’T> → IEvent<‘U> | یک رویداد جدید شامل نتایج اعمال تابع تجمیع (accumulating) داده شده به مقادیر متوالی تریگر شده در رویداد ورودی را برمی گرداند. یک آیتم از internal state، مقدار فعلی پارامتر state را ثبت می کند. internal state در حین اجرای تابع accumulation قفل نخواهد شد. بنابراین باید توجه داشت که IEvent ورودی به طور همزمان توسط چندین موضوع تریگر نمی شود. |
split : (‘T → Choice<‘U1,’U2>) → IEvent<‘Del,’T> → IEvent<‘U1> * IEvent<‘U2> | یک رویداد جدید را که به رویداد original گوش می دهد و اولین نتیجه ی رویداد را تریگر می کند. اگر application تابع به ارگومان رویداد Choice1Of2 را برگرداند، و رویداد دوم اگر Choice2Of2 را بازگرداند. |
در قسمت بعد ایجاد یک رویداد در #F رو خواهیم داشت.
رویدادها از طریق کلاس رویداد ایجاد و استفاده می شوند.
constructor برای ایجاد یک رویداد در #F استفاده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 | type Worker(name : string, shift : string) = let mutable _name = name; let mutable _shift = shift; let nameChanged = new Event<unit>() (* creates event *) let shiftChanged = new Event<unit>() (* creates event *) member this.Name with get() = _name and set(value) = _name <- value member this.Shift with get() = _shift and set(value) = _shift <- value |
پس از این شما باید فیلد nameChanged را به عنوان یک عضو public نمایش دهید.
به طوری که listener ها می توانند قلاب کنند بر روی رویداد، برای این که شما از Publish property رویداد استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | type Worker(name : string, shift : string) = let mutable _name = name; let mutable _shift = shift; let nameChanged = new Event<unit>() (* creates event *) let shiftChanged = new Event<unit>() (* creates event *) member this.NameChanged = nameChanged.Publish (* exposed event handler *) member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *) member this.Name with get() = _name and set(value) = _name <- value nameChanged.Trigger() (* invokes event handler *) member this.Shift with get() = _shift and set(value) = _shift <- value shiftChanged.Trigger() (* invokes event handler *) |
بعد، شما backgammon را به رویداد handlers اضافه می کنید.
هر رویداد handler دارای نوع<IEvent <‘T است که چندین متد را فراهم می کند.
متد | شرح |
---|---|
val Add : event:(‘T → unit) → unit | یک تابع listener را به رویداد متصل می کند. هنگامی که رویداد اخراج می شود، listener فعال می شود. |
val AddHandler : ‘del → unit | یک آبجکت handler delegate را به رویداد متصل می کند. یک handler می تواند بعدا با استفاده از RemoveHandler حذف شود. هنگامی که رویداد اخراج می شود، listener فعال می شود. |
val RemoveHandler : ‘del → unit | یک listener delegate را از یک رویداد listener store حذف می کند. |
بخش زیر یک نمونه کامل را ارائه می دهد.
مثال زیر مفهوم و تکنیک های مورد بحث در بالا را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | type Worker(name : string, shift : string) = let mutable _name = name; let mutable _shift = shift; let nameChanged = new Event<unit>() (* creates event *) let shiftChanged = new Event<unit>() (* creates event *) member this.NameChanged = nameChanged.Publish (* exposed event handler *) member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *) member this.Name with get() = _name and set(value) = _name <- value nameChanged.Trigger() (* invokes event handler *) member this.Shift with get() = _shift and set(value) = _shift <- value shiftChanged.Trigger() (* invokes event handler *) let wk = new Worker("Wilson", "Evening") wk.NameChanged.Add(fun () -> printfn "Worker changed name! New name: %s" wk.Name) wk.Name <- "William" wk.NameChanged.Add(fun () -> printfn "-- Another handler attached to NameChanged!") wk.Name <- "Bill" wk.ShiftChanged.Add(fun () -> printfn "Worker changed shift! New shift: %s" wk.Shift) wk.Shift <- "Morning" wk.ShiftChanged.Add(fun () -> printfn "-- Another handler attached to ShiftChanged!") wk.Shift <- "Night" |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 5 6 | Worker changed name! New name: William Worker changed name! New name: Bill -- Another handler attached to NameChanged! Worker changed shift! New shift: Morning Worker changed shift! New shift: Night -- Another handler attached to ShiftChanged! |
خب اینم از رویدادها یا Events در #F و ایجاد یک رویداد در #F
همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم.
با رویدادها یا Events در #F در واقع به برنامه و نرمافزار خود دستور میدهیم. که در صورت بروز یک اتفاق خاص، رویداد مدنظر ما رخ دهد.
در این بخش از آموزش قصد داریم رویدادها یا Events در #F و کلاس رویداد و رویداد Module در #F رو مورد بررسی قرار دادیم .
همچنین در ایجاد یک رویداد در #F دیدیم که constructor برای ایجاد یک رویداد در #F مورد استفاده قرار می گیرد. موفق و پیروز باشید.