شیء Function (تابع) در کانستراکت
#1
Lightbulb 
به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد دارم راجع به شیء Function (تابع) در کانستراکت صحبت کنم. اگر تجربه برنامه نویسی با زبان های رایج برنامه نویسی رو داشته باشین بدون شک کلمه تابع یا فانکشن براتون آشناست. ساز و کار تابع در کانستراکت مشابه زبان های رایج برنامه نویسی هست و چیز جدیدی در اون وجود نداره. در واقع یک تابع یا فانکشن یک چارچوب یا قانون از پیش تدوین شده برای به وقوع پیوستن یکسری رخدادها یا روندهای مشخص و از پیش تعیین شده در طول پروژه است. با استفاده از تابع میتونیم یک رخداد خاص رو تعریف کنیم و هرجایی که در طول پروژه مون نیاز داشتیم که اون رخداد خاص به وقوع بپیونده اون رو صدا بزنیم یا فراخوانی کنیم. پس ما با استفاده از تابع میتونیم:
  • ایونت نویسی بسیار جمع و جور و تمیزتری داشته باشیم که این موضوع باعث میشه ایونت ها خواناتر و واضح تر دیده بشن و اگر مشکلی پیش اومد بتونیم به راحتی مشکل رو حل کنیم.
  • به کابوس کپی و پیست کردن ایونت ها (گاهاً چندین ایونت) پایان بدیم.
  • ساده تر ایونت بزنیم و در نهایت دچار سردرگمی نشیم.
  • پرفرمنس (Performance) پروژه مون رو تا حد مناسبی افزایش بدیم و باعث بشیم که منابع پردازشی کاربر روی مسائل مهمتری متمرکز بشن.

بررسی دقیق تر مفهوم تابع:
پس تا به اینجا فهمیدیم که توابع میتونن علاوه بر مزایای خوبی که دارن بیشتر باعث کوتاه تر شدن ایونت ها و کمتر شدن زحمت ما بشن. توابع به طور کلی در کانستراکت میتونن بر پایه اکسپرشن (Experession-Based) و بر پایه اکشن (Action-Based) باشن. توابع بر پایه اکسپرشن همونطور که از اسمشون مشخصه یک اکسپرشن از پیش تعریف شده رو اجرا میکنن. توابع بر پایه اکشن هم اکشن یا اکشن هایی که از پیش تعریف شده باشن رو در جایی که نیاز باشه اعمال یا اجرا میکنن. 
بد نیست بدونین در کانستراکت مثل زبان های رایج برنامه نویسی توابع یا فانکشن ها چند دسته هستن که عبارتند از:
  • * توابع بازگشتی (Recrusion Functions): گاهی اوقات توابع میتونن خودشون رو صدا بزنن. تابعی که خودش رو صدا بزنه یا فراخوانی کنه تابع بازگشتی نامیده میشه. در واقع در شیوه بازگشتی مسئله به قسمت های کوچکتری تقسیم میشه و به صورت نامحدود یکسری روندها رخ میده. مثلاً محاسبه فاکتوریل یک مثال بارز عمل بازگشت میتونه باشه. در واقع در کانستراکت و بسیاری از زبان های رایج توابع بازگشتی با نام For و While شناخته میشن. هر تابع بازگشتی شامل سه فاز (Phase) یا مرحله به نام های ساده سازی و تکرار، شرط خاتمه و بازگشت میشه. گفتیم که یک تابع بازگشتی یک مسئله پیچیده رو به قسمت های کوچکتر تقسیم میکنه که این کار در فاز اول اجرای یک تابع بازگشتی انجام میشه. وقتی شرط خاتمه ای که برای ساده سازی و تکرار تابع بازگشتی تعریف کردیم برقرار بشه، تابع وارد فاز بازگشت میشه. در این فاز یا مرحله تابع از نتایجی که در فاز اول (ساده سازی و تکرار) به دست آورده استفاده میکنه تا بتونه یک خروجی به ما ارائه کنه. به طور ساده یک تابع بازگشتی به خودش متکیه و برای نمایش خروجی خودش از نتایجی که در هر مرحله به دست آورده استفاده میکنه. 
تا به اینجای کار یک تابع بازگشتی شباهت بسیار زیادی به مفهوم حلقه (Loop) در دنیای رایانه داشت. میتونیم تقریباً بگیم که حلقه در واقع همون تابع بازگشتی هست. اما تفاوت های ریزی میان حلقه و تابع بازگشتی وجود داره. در حین استفاده از حلقه یک یا چند خانه از حافظه رایانه اشغال میشه و اطلاعات اون خانه های اشغال شده از حلقه در هر فاز حلقه به طور مداوم بروزرسانی میشه. اما در استفاده از توابع بازگشتی استک ها (Stack) درگیر میشن که منابع حافظه کمتری نسبت به حلقه مصرف میکنن.
برای اینکه در پایان توضیحات تابع بازگشتی شما رو از حالت سردرگمی در بیارم باید بگم که یک تابع بازگشتی تا حد زیادی معادل و هم ارز مفهوم حلقه است و یکسری تفاوت های ریزی مشاهده میشه که بهشون پرداختم. در بسیاری از زبان های برنامه نویسی رایج مفهوم تابع بازگشتی در قالب حلقه های For و While پیاده سازی شده که در کانستراکت هم همینطوره. 
  • * توابعی که دیگر توابع را صدا میزنند: ما قادر هستیم که توابعی که قبلاً تعریف کردیم رو در توابعی که مشغول تعریف هستیم به کار ببندیم. فرض کنین من در ابتدای پروژه خودم یک تابع جهت محاسبه صدمات وارد شده به پلیر (بازیکن) تعیین کردم و حالا مشغول تعریف یک تابع محاسبه امتیاز هستم. به راحتی میتونم تابع صدمات وارده به پلیر رو فراخوانی کنم و از اون در تابع محاسبه امتیاز نهایی استفاده کنم.

مفهوم پارامتر (Parameter) در توابع کانستراکت:
بدون شک یک تابع ممکنه نیاز پیدا کنه که با یکسری ورودی ها (آرگومان ها) فعالیت کنه. در دنیای کانستراکت به این ورودی ها پارامتر گفته میشه. هر تابع (چه برپایه اکشن و چه بر پایه اکسپرشن) میتونه یک یا چند پارامتر بپذیره. پارامترها در کانستراکت با یک عدد از هم قابل تشخیص هستن و مبنای شماره گذاری پارامترهای یک تابع از صفر تا بی نهایت خواهد بود. یعنی اگر قراره یک تابع دو پارامتر (ورودی) داشته باشه تابع ما دو پارامتر 0 و 1 رو می پذیره. به کمک اکسپرشن ها و اکشن های شیء تابع (فانکشن) میتونیم مقدار پارامترها رو در زمانی که نیاز هست تابع فعالیت کنه به تابع وارد کنیم.  
کاندیشن های های شیء تابع:
  • کاندیشن Compare Parameter بررسی میکند که آیا مقدار یکی از پارامترهای تابع برابر با مقدار دلخواه می باشد یا خیر. این کاندیشن شامل سه مشخصه Index (برای وارد کردن شماره پارامتر موردنظر)، Comparison (برای مشخص کردن وضعیت برابری شامل برابر بودن یا برابر نبودن، بزرگ تر مساوی یا ...) و Value (برای وارد کردن مقدار دلخواه جهت بررسی) می باشد.
  • کاندیشن On Function بیان می کند که با فراخوانی یک تابع چه اتفاق (اکشنی) باید رخ دهد. پس به بیان دیگر این کاندیشن می تواند یک فانکشن را تعریف کند.

اکشن های شیء تابع:
  • اکشن Call Function برای فراخوانی و در واقع اجرای یک تابع به کار می رود. این اکشن شامل ورودی ها (آرگومان های) Name و Parameter می باشد. ورودی Name نام تابع موردنظر جهت اجرا و فراخوانی را مشخص می کند و عبارت Add Parameter برای اضافه کردن مقدار برای پارامترهای تابع موردنظر می باشد. با هر بار کلیک بر روی Add Parameter امکان افزودن پارامترهای بیشتری فراهم می شود و بر عکس با هر بار کلیک بر Remove Parameter یک عدد از پارامترهای اضافه شده جهت تعیین مقدار از صفحه حذف می شود. دقت کنید که این اکشن هم برای فراخوانی توابع برپایه اکشن و هم توابع بر پایه اکسپرشن کاربرد دارد.
  • اکشن Call Experession برای فراخوانی یک تابع با کمک نوشتن اکسپرشن Call که کمی جلوتر راجع به آن توضیح خواهم داد استفاده می شود. دقت کنید که با استفاده از این اکشن قادر خواهید بود که هم توابع برپایه اکشن و هم توابع برپایه اکسپرشن را اجرا کنید.
  • اکشن Set Return Value برای مشخص کردن مقداری که یک تابع بازگشت می دهد در استفاده از کاندیشن On Function به کار می رود. یعنی اگر شما از کاندیشنی غیر از کاندیشن ذکر شده برای این اکشن استفاده کنید هیچ تأثیری بر مقدار خروجی تابع نخواهد داشت. از این اکشن میتوان برای تعیین خروجی توابع بر پایه اکشن و البته بیشتر توابع بر پایه اکسپرشن استفاده کرد.

اکسپرشن های شیء تابع:
  • اکسپرشن Call برای فراخوانی یا اجرای یک تابع بر پایه اکشن یا بر پایه اکسپرشن علاوه بر اکشن Call Function به کار می رود. این اکسپرشن به دلیل اینکه می تواند مستقیم مقادیر پارامترها را به تابع وارد کند می تواند آرگومان ها (ورودی های) متعددی داشته باشد. برای مثال فرض کنید قصد داریم تابع Add را که بر مبنای دو پارامتر عمل می کند را به کمک این اکسپرشن اجرا یا فراخوانی کنیم:
کد:
Function.Call("Add",x,y)
اولین آرگومان اکسپرشن نام تابع را مشخص می کند. دومین آرگومان مقداری که قصد داریم به پارامتر اول بدهیم و سومین آرگومان هم مقداری که قصد داریم به پارامتر دوم تابع بدهیم را مشخص می کند. همچنین دقت کنید که اگر مقدار خروجی برای تابع (از طریق اکشن Set Return Value) تعریف نکرده باشید پس از به کار بستن یا اجرای این اکسپرشن مقدار صفر به شما برگردانده می شود.
  • اکسپرشن Param مقدار یک پارامتر مورد استفاده پس از فراخوانی تابع را بر می گرداند. این اکسپرشن تنها یک ورودی یا آرگومان می پذیرد که در واقع همان شماره پارامتر است. دقت کنید که این اکسپرشن پس از اجرا یا فراخوانی هر تابع  قادر است که مقدار پارامترهای تابعی که اخیراً اجرا یا فراخوانی شده است را برگرداند. مثال:
کد:
Function.Param(0)
  • اکسپرشن ParamCount تعداد پارامترهایی که به تابع تحویل داده شده اند را پس از اجرای تابع بر می گرداند. به عبارت دیگر این اکسپرشن تعداد پارامترهای وارد شده در یک تابعی که اخیراً اجرا یا فراخوانی شده است را بر می گرداند. این اکسپرشن هیچ آرگومانی نمی پذیرد و تنها به شکل زیر به کار می رود:
کد:
Function.ParamCount
(دقت کنید که اگر شما این اکسپرشن را پس از فراخوانی تابع به کار نبندید یا اجرا نکنید مقدار صفر به شما برگردانده می شود. دلیل این مسئله هم این هست که پارامترها در کانستراکت در حین اجرا یا فراخوانی تابع به آن وارد می شوند.)
  • اکسپرشن Return Value مقدار خروجی تابعی که اخیراً فراخوانی یا اجرا شده باشد را بر می گرداند. اگر هیچ مقداری به عنوان مقدار خروجی تابع تعیین نشده باشد عدد صفر برگردانده می شود. این اکسپرشن هیچ آرگومانی نمی پذیرد و تنها به شکل زیر به کار می رود:
کد:
Function.ReturnValue
 
توابع بر پایه اکشن (Action-Based) در کانستراکت:
همونطور که براتون تشریح کردم به کمک این توابع میتونیم یکسری اکشن رو که از قبل تعریف کردیم در هر کجا که لازم بود اعمال و اجرا کنیم. فرض کنین در پروژه خودم قراره که یک روند مشخص که چندبار در طول پروژه تکرار میشه مثل ساخته شدن دشمن رو در قالب یک تابع تعریف کنم. قبل از هر چیز باید شیء Function رو به پروژه اضافه کنم. با انتخاب کاندیشن On Function میتونم یک تابع جدید رو تعریف کنم. بعد از انتخاب این کاندیشن باید نام تابع خودم رو در فیلد Name وارد کنم. به عنوان مثال من نام تابع فرضی خودم رو "Create_Enemy" قرار میدم. حالا با درج اکشن Create Object از سری اکشن های سیستمی رو به روی کاندیشن On Function تعیین میکنم که با اجرای این تابع اسپرایت دشمن در لایوت ایجاد بشه. حالا در هر کجای پروژه که اون رو فراخوانی کنم یک اسپرایت دشمن ساخته خواهد شد.
برای فراخوانی این تابع کافیه در هر کجا که لازم بود اکشن ساخت دشمن ایجاد بشه اکشن Call Function شیء فانکشن رو انتخاب کنم و در فیلد Name نام تابع رو وارد کنم تا تابع موردنظرم اجرا بشه. یا میتونم به کمک اکسپرشن Call در یک تکست یا هر شیء مشابهی تابع رو فراخوانی کنم. دقت کنین که چون در این تابع بر پایه اکشن مقدار خروجی (از طریق اکشن Set Return Value) تعیین نکردیم اگر شما به عنوان مثال با اکسپرشن تابع رو در یک تکست فراخوانی کنین اسپرایت دشمن ایجاد میشه اما مقدار تکست به صفر تغییر میکنه. میتونیم این تابع رو ارتقاء بدیم و از طریق دو پارامتر موقعیت اسپرایت دشمنی که در صفحه ایجاد میشه رو هم تعیین کنیم.
توابع بر پایه اکسپرشن (Expression-Based) در کانستراکت:
همونطور که براتون تشریح کردم به کمک این توابع میتونیم یکسری اکسپرشن رو که از قبل تعریف کردیم در هر کجا که لازم بود اعمال و اجرا کنیم. فرض کنین در پروژه خودم قراره که یک روند مشخص که چندبار در طول پروژه تکرار میشه مثل محاسبه امتیاز نهایی در هر مرحله از بازی چند مرحله ای خودم رو در قالب یک تابع تعریف کنم. برای این کار اول از همه  کاندیشن On Function رو انتخاب می کنم و نام فرضی "Socre_Calculator" رو برای تابع موردنظرم تعریف میکنم. حالا رو به روی کاندیشنی که تعریف کردم از طریق اکشن Set Return Value شیء تابع مقدار خروجی تابع رو مشخص میکنم. فرض کنین بازی من به در سبک رانر (دویدن) هست و کاربر با برخورد به هر یک موانع در حین دویدن از امتیازش کسر میشه و با گرفتن هر یک از سکه های در طول مسیر دویدن یک عدد به امتیازش اضافه میشه. من تعداد دفعات برخورد کاربر با موانع رو در طول مرحله در یک متغیر به نام Collison و تعداد سکه های دریافت شده توسط کاربر رو در یک متغیر به نام Coin ذخیره کردم. حالا امتیاز نهایی کاربر من تفاضل (حاصل تفریق) تعداد برخوردها از سکه های جمع آوری شده است. با این تفاسیر تابع "Socre_Calculator" باید دو پارامتر رو به عنوان ورودی بپذیره. در فیلد Value اکشن Set Return Value اکسپرشن های زیر رو وارد میکنم و بینشون یک علامت تفریق قرار میدم:
کد:
Function.Param(0) - Function.Param(1)
(در اینجا از درج اکسپرشن abs که کارش قدرمطلق گرفتن هست صرف نظر کردم چرا که ایرادی نداره که امتیاز کاربر منفی بشه.)
فرض کنین الان به مرحله ای از ایونت هام رسیدم که کاربر مرحله رو با برد یا باخت تموم کرده. میخوام امتیاز نهایی کاربر رو در یک تکست بهش نمایش بدم. طبیعتاً باید تابعی که تعریف کردم رو فراخوانی کنم. کافیه بعد از انتخاب اکشن Set Text To شیء تکست عبارت زیر رو در فیلد Text درج کنم:
کد:
Function.Call("Socre_Calculator",Collision,Coin)
به سادگی تعریف کردم که تابع "Socre_Calculator" اجرا بشه و دو پارامتر تعداد برخوردها با موانع (متغیر Collision) و تعداد سکه های جمع آوری شده (متغیر Coin) رو برای تابع مشخص کردم.
امیدوارم از این مطلب لذت برده باشین و تونسته باشین مفهوم تابع در کانستراکت و طریقه به کار بستنش رو به راحتی آموخته باشین.
خوشحال میشم که اگر جایی اشتباه یا به شکل درستی بیان و ادا نشده حتماً در ادامه گوشزد کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: M.gh ، mhp ، hasansanaei ، shazde ، mostafanastary ، amin hosseini ، ᔕinaᗪehghani
#2
لازم نبود زحمت بکشید
ممنون خییلی کامل تر از آموزش من بود که سورسشو هم گذاشته بودم
4141414141 ‌  ‌ 41414141
[تصویر:  default-yellow.svg]
  پاسخ


 سپاس شده توسط: Master Badfar
#3
(1399/1/31، 07:37 عصر)oak نوشته است: لازم نبود زحمت بکشید
ممنون خییلی کامل تر از آموزش من بود که سورسشو هم گذاشته بودم
4141414141 ‌  ‌ 41414141
من اصلاً از آموزش شما یادم نبود.
الان یادم افتاد 4
غایب
  پاسخ


 سپاس شده توسط: oak


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 76,636 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 17,776 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,170 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 7,050 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,347 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: