اگر از علاقمندان به زبان ActionScript 3 بوده باشید، احتمالا می‌دانید که این زبان آزادی بسیاری برای انواع روشهای کدنویسی به برنامه‌نویسان می‌دهد. البته گاهی این آزادی و امکانات عجیب و غریب در قواعد زبان، متمایل به کدهای اسپاگتی می‌شوند.البته شخصا علاقه بسیار زیادی به تولید اسپاگتی در AS3 داشته و این را از نقاط قوت آن می‌دانم، اما همانطور که می‌دانید، ضرب‌المثل معروفی در این زمینه وجود دارد که بیان می‌کند:

“اگر کد اولیه خود را بسیار هوشمندانه بنویسید، جهت دیباگ آن به اندازه کافی باهوش نخواهید بود!”
به ادامه بحث بر‌میگردیم. یکی از امکانات جالبی که در AS3 وجود دارد، قابلیت تعریف توابع با پارامترهای بدون نوع و نامحدود است که به آنها rest parameter گفته می‌شود.
برای تعرف این پارامترها از کلمه کلیدی “…” (سه نقطه) استفاده شده و پارامتر را به صورت آرایه بدون نوع تعریف می‌نماییم. مثلا:
function f(...n:Array) {

n.push(n[n.length-1].toString());

n.sort();



trace(n);

}

اگر این تابع را به صورت زیر فراخوانی نماییم، خروجی ذکر شده حاصل خواهد شد. همانطور که می‌بینید هر چیزی را می‌توان به عنوان پارامتر به این تابع ارسال نمود:
Call: f(3, undefined, Object, 1, int, 2, void, "4", NaN, 0xff);

Output:  1, 2, 255, 255, 3, 4, NaN, [class Object], [class int], ,

نکته جالبی که در این مورد وجود دارد این است که حتی می‌توان، توابع را به عنوان پارامتر به این تابع ارسال نمود.
از آنجا که در AS3 شئ‌گرایی حرف اول را میزند، یک تابع حتی می‌تواند نوع تابع خودش را به عنوان خروجی، پارامتر یا هر شئ دیگر پاس دهد.

به عنوان مثال به کد زیر دقت نمایید. این تابع، شئ تابع خود را به عنوان خروجی بر می‌گرداند:

function f(...n:Array):Function {

trace(">", n);

return f;

}

اکنون ماجرا جالب‌تر می‌شود. به شیوه فراخوانی در کد زیر دقت نمایید، اگر تصور می‌کنید که این کد دارای Syntax error است، کاملا اشتباه می‌کنید. از آنجا که در AS3 خروجی هر تابع نیز از نوع شئ است، یک تابع که “نوع تابع” را به عنوان خروجی برگرداند، می‌تواند عینا در خروجی خود، دوباره فراخوانی شود. (رشته‌های اسپاگتی وارد می‌شوند)
f(1, 2, f(3) (4, f(5))) (f(6, 7), 8) (9, 10);

خروجی دستور فوق، به صورت زیر چاپ می‌گردد:

> 3

> 5

> 4, function Function() {}

> 1, 2, function Function() {}

> 6, 7

> function Function() {}, 8

> 9, 10

حال، دو قابلیت ذکر شده را با یکدیگر ترکیب کرده و سعی می‌کنیم که پارامترهایی که به صورت “تابع” ارسال شده‌اند را در خود تابع، به عنوان یک “تابع” فراخوانی نماییم. (اسپاگتی آماده خوردن است)
جهت ایجاد تمایز در خروجی توابع f و a، در دستور trace آنها از علائم “=” و “==” استفاده شده است.
function f(...n:Array):Function {

trace("=",n);

return f;

}



function a(...n:Array):Function {

trace("==",n);

if (n[0] == "function Function() {}") {

n[0](1)(2);

}

return a;

}



Call:   a( a(1, 2), 3) ( f(1, 2, f(3) (4) ));

اگر بتوانید فقط با توجه به ترتیب چاپ خروجی‌ها در مثالهای قبل و فهمیدن اینکه اولویت پارامترها در AS3 چگونه است، حدس بزنید که خروجی چاپ شده و حاصل فراخوانی تابع فوق چه خواهد بود، مشخص می‌شود که واقعا دید درستی از شئ‌گرایی دارید.
در غیر این صورت زحمت نکشید، خروجی به صورت زیر است:
= 1, 2

= function Function() {}, 3

= 1

= 2

== 3

== 4

== 1, 2, function Function() {}

= function Function() {}

== 1

== 2

پ.ن: قابلیتهای متهورانه AS3 همچنان بنده را به هیجان می‌آورد.
پ.ن: جای شکرش باقی است که طراحان سوالات کنکور رشته‌های کامپیوتر، با زبان AS3 آشنا نیستند.
Print this pageEmail this to someoneShare on Google+Share on FacebookShare on LinkedInTweet about this on TwitterShare on RedditShare on TumblrShare on StumbleUponPin on Pinterest