بررسی توابع در برنامه نویسی تابع گرا

در برنامه نویسی تابع گرا یک تابع و یا Function یک مجموعه از جملات مربوط به کد است که یک وظیفه خاص را اجرا می‌کند. توابع، داده هایی را به عنوان ورودی دریافت کرده، آنها را پردازش می کنند و نتیجه را بر می گردانند. به طور کلی در زبان های برنامه نویسی تابع گرا از توابع برای پشتیبانی از مفهوم قابلیت استفاده مجدد و یا همان Reusability استفاده می شود. به عبارت دیگر زمانی که یک تابع تعریف و نوشته شود می‌تواند به راحتی فراخوانی گردد و این کار به دفعات نامتناهی رخ خواهد داد. به بیان دیگر، شما با یک بار یک تابع را تعریف کرده و بارهای بی نهایتی از آن استفاده می کنید. زبان های برنامه نویسی تابع گرای مختلف از املا و یا Syntax مختلف و متفاوتی برای تعریف یک تابع استفاده می‌کنند. در ادامه در رابطه با برخی از الزامات مربوط به تعریف کردن توابع صحبت خواهیم کرد.الزامات تعریف کردن توابعقبل از ایجاد کردن یک تابع، برنامه نویس باید به نکاتی که در قسمت زیر قرار داده شده اند دقت کنید:رسالت و یا وظیفه این تابع باید برای برنامه نویس مشخص باشد.الگوریتمی که می بایست توسط تابع اجرا بشود تا خروجی نهایی تولید گردد، باید توسط برنامه نویس شناخته شده باشد.پارامترهای ورودی احتمالی که تابع باید دریافت کند باید مشخص باشد.داده هایی که توسط کاربر در زمان فراخوانی تابع به تابع داده می شوند باید مشخص باشند.کنترل جریان (Flow Control) مربوط به یک تابعزمانی که یک تابع فراخوانی و یا اصطلاحاً Called می شود، برنامه کنترل اجرا را به آن تابع منتقل کرده و به این موضوع اصطلاحاً کنترل جریان و یا Flow Control می گویند. در روند اجرا شدن و یا فراخوانی یک تابع، در ابتدا برنامه به دستوری که تابع مورد نظر فراخوانی شده است می رسد. پس از آن اولین خط کد درون تابع اجرا می‌شود.پس از اجرا شدن تمامی جملات درون تابع از ابتدا تا پایان، خروجی احتمالی تابع مشخص می گردد. پس از برگردانده شدن این خروجی، کنترل اجرا شدن برنامه به جمله بعدی که در برنامه اصلی وجود دارد ارسال می گردد. در ادامه، در رابطه با املا و یا Syntax مربوط به تعریف کردن یک تابع صحبت خواهیم کرد. به طور کلی، تعریف کردن یک تابع از Syntax و یا املای زیر تبعیت می کند.[snippet]returnType functionName(type1 argument1, type2 argument2, . . . ) {// function body}[/snippet]تعریف کردن یک تابع در زبان برنامه نویسی++ Cدر ادامه مثالی را از نحوه تعریف کردن یک تابع در زبان برنامه نویسی++Cبررسی خواهیم کرد. زبان برنامه نویسی C++ یک زبان شی‌گرا و یا Object-Oriented است. کدی که در قسمت زیر مشاهده می کنید نحوه ایجاد کردن یک تابع به منظور جمع زدن دو مقدار عددی و برگرداندن نتیجه کار را نشان می ‌دهد.[c++]#includeint addNum(int a, int b); // function prototypeint main() {int sum;sum = addNum(5,6); // function callprintf(“sum = %d”,sum);return 0;}int addNum (int a,int b) { // function definitionint result;result = a + b;return result; // return statement}[/c++]کدی که در قسمت بالا مشاهده می کنید خروجی زیر را تولید خواهد کرد.Sum = 11تعریف کردن یک تابع در زبان برنامه نویسی Erlangدر ادامه نحوه تعریف کردن یک تابع در زبان برنامه نویسی Erlang را بررسی خواهیم کرد. زبان Erlang یک زبان Functional و یا تابع گرا است.کد زیر این موضوع را نشان می‌دهد.[c++]-module(helloworld).-export([add/2,start/0]).add(A,B) ->C = A + B,io:fwrite(“~w~n”,[C]).start() ->add(5,6).[/c++]خروجی این کد شبیه به قسمت زیر خواهد بود.11بررسی Function Prototypeیک Function Prototype یک تعریف و یا Declaration از یک تابع است که شامل نوع داده ای خروجی و یا Return-Type به همراه نام تابع و همچنین لیست آرگومان های ورودی آن می ‌باشد. به عبارت دیگر، منظور از Function Prototype تعریف کردن قسمت اول تابع بدون لحاظ کردن بدنه آن می باشد. برای مثال، برخی از زبان های برنامه نویسی از function prototyping پشتیبانی و برخی دیگر پشتیبانی نمی کند.در زبان برنامه نویسی ++C می توانیم یک Function Prototype را شبیه به کد زیر تعریف کنیم.[c++]int sum(int a, int b)[/c++]زبان های برنامه نویسی Python و Erlang از مفهوم Function Prototyping پشتیبانی نمی کنند و بنابراین، نیاز است که در این زبان ها توابع به صورت کامل تعریف شوند.کاربرد تکنیک Function Prototyping در چیست؟یک Function Prototype توسط Compiler در زمان فراخوانی یک تابع مورد استفاده قرار می گیرد. Compiler از یک Function Prototype استفاده می‌کند تا صحت تعریف شدن نوع داده خروجی و یا return-type به همراه لیست آرگومان هایی که به عنوان ورودی به تابع داده شده اند را بررسی کند.بررسی امضای یک تابع (Function Signature)منظور از امضای تابع و یا Function Signature یک Function Prototype است که در آن تعداد پارامترها، نوع داده ای پارامترها و ترتیب ظاهر شدن آنها لحاظ می گردد. مثال هایی از Function Signature را در قسمت زیر مشاهده می کنید.[c++]void Sum(int a, int b, int c); // function 1void Sum(float a, float b, float c); // function 2void Sum(float a, float b, float c); // function 3[/c++]در مثال بالا تابع اول و دوم Signature های متفاوتی دارند؛ اما توابع دوم و سوم Signature های یکسانی دارند. دقت کنید که مفهوم دیگری نیز وجود دارد که از آن تحت عنوان Function Overloading و Function Overriding یاد می‌شود.در رابطه با این دو مفهوم در قسمت های بعدی از این آموزش به طور مفصل صحبت خواهیم کرد؛ اما به طور کلی تکنیک Function Overloading امکان این را می‌دهد که چندین تابع با نام یکسان اما Signature های متفاوت داشته باشیم و Function Overriding نیز امکان این را می دهد که در یک کلاس ارث بری کرده و یا اصطلاحاً Derived Class یک تابع، عملکرد متفاوتی نسبت به کلاس پایه و یا Base Class داشته باشند. منبع: وبسایت پرووید