آموزش مفاهیم تابع در زبان‌های برنامه نویسی

تابع در برنامه نویسی یک قطعه از کدهای ساختاریافته و قابل استفاده است. هر تابع عملیات خاصی را برای ما انجام می‌دهد. به کمک توابع می‌توانیم بخش‌های مختلف برنامه را از هم تفکیک کرده و به آن نظم بیشتری بدهیم. همچنین فهم و اصلاح کدها راحت‌تر انجام می‌شود. در این آموزش با مفهوم تابع برنامه نویسی آشنا خواهیم شد.

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

تقریباً اکثر زبان‌های برنامه‌نویسی و همه زبان‌های پر کاربرد، مفهوم تابع را درون خود دارند. فقط ممکن است نحوه نوشتن آن (syntax آن) در زبان‌های مختلف متفاوت باشد. در برخی زبان‌ها به جای تابع (function) از کلماتی چون متد (method)، زیر روال (ساب‌روتینsub-routine) یا رویه (پروسیژرprocedure) استفاده می‌شود. اما باید بدانید که مفهوم و اصول آن‌ها مشابه هم هستند.

ابتدا در مورد اینکه یک تابع در برنامه نویسی به چه چیزی گفته می‌شود می‌پردازیم و پس از آن نحوه تعریف و بخش‌های فانکشن‌های برنامه‌نویسی را با هم مرور می‌کنیم.

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

کلمه تابع باید برایتان آشنا باشد. همیشه در مباحث ریاضی در مورد توابع می‌خوانیم. به خاطر دارید که به چه چیزی در ریاضیات یک تابع می‌گفتیم ؟

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

تابع برنامه نویسی هم دقیقاً به همین شکل تعریف می‌شود. توابع در برنامه نویسی پس از فراخوانی عملیات‌هایی انجام می‌دهند. هر تابع ممکن است یک یا چند ورودی و خروجی داشته باشد.

عملکرد کلی یک تابع برنامه‌نویسی مشابه ریاضی
عملکرد کلی یک تابع برنامه‌نویسی مشابه ریاضی

مشابه آن چه در تصویر می‌بینید، ما به توابع به شکل یک جعبه (یا قطعه کد) نگاه می‌کنیم که برای ما کارهایی را انجام می‌دهند.

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

فرض کنید می‌خواهیم یک ماشین حساب ساده را برنامه نویسی کنیم. یک راه این است که ابتدا ورودی را گرفته و سپس بر مبنای عملگر مورد نظر و به کمک دستورات برنامه‌نویسی شرطی نتیجه را محاسبه کنیم.

احتمالاً می‌توانید تصور کنید که باید تعداد خط‌های زیادی را پشت سر هم بنویسیم. این کار رفع خطا یا توسعه برنامه را بسیار سخت خواهد کرد.

حال فرض کنید می‌خواهیم یک عملیات پیچیده ریاضی (شامل چندین بار جمع، ضرب یا تقسیم) را هم در آن تعریف کنیم. قبول دارید که برای عملیات جدیدمان مجبور خواهیم بود عملگرهای جمع، ضرب یا تقسیم را دوباره استفاده کنیم؟

این قضیه را مقایسه کنید با زمانی که باید یک عملیات خاص (مثل خواندن فایل) را در برنامه تعریف کنیم. برای خواندن فایل باید ابتدا فایل را باز کنیم و پس از خواندن، آن را ببندیم. اگر بارها و بارها بخواهیم این کار را انجام دهیم، بخش باز کردن و بستن فایل به دفعات تکرار خواهد شد.

برای اینکه برای انجام کارهای یکسان یا تقریباً یکسان مجبور نباشیم قطعه کدهای تکراری بنویسیم، از توابع در برنامه نویسی استفاده می‌کنیم.

بخش‌های اصلی تابع برنامه‌نویسی

یک تابع در برنامه نویسی دارای چهار بخش اصلی است. دقت کنید که این بخش‌ها در تمام زبان‌ها یکسان است. در برخی زبان ها موارد دیگری نیز وجود دارند که در انتها مثالی در این مورد می‌زنم.

نام فانکشن

هر تابع باید یک نام داشته باشد. این نام باید در هر برنامه یکتا (unique) باشد. برای فراخوانی توابع باید از نام آن‌ها استفاده کنیم. هر زبان برنامه‌نویسی قواعد خاصی برای کاراکترهای مجاز در تعریف نام تابع در نظر می‌گیرد؛ اما در حالت کلی می‌توان از حروف کوچک و بزرگ انگلیسی، اعداد و علامت _ (underline) استفاده کرد.

برای اینکه مطمئن شوید زبان برنامه‌نویسی‌ای که با آن کار می‌کنید از چه کاراکترها و ساختاری پشتیبانی می‌کند، حتماً مستندات توابع آن را بخوانید. برای ثمال، برخی از زبان‌ها امکان قرار دادن عدد در ابتدای نام تابع را نمی‌دهند!

معمولاً قبل از نام تابع، کلمه‌ای برای اینکه مشخص کنیم در حال تعریف تابع هستیم آورده می‌شود. این کلمه در زبان‌های مختلف، متفاوت است. مثلاً در پایتون از def و در زبان php از function استفاده می‌کنیم.

بدنه فانکشن

هر تابع یک بدنه دارد. بدنه تابع در برنامه نویسی دقیقاً همان قطعه کدهایی است که به وجود function معنا می‌دهد. کارهایی که تابع انجام می‌دهد توسط کدهایی که در بدنه آن قرار گرفته مشخص می‌شود.

هیچ معیار خاصی برای اندازه بدنه توابع وجود ندارد. میزان کدهای تابع می‌تواند یک خط یا هزاران خط باشد. اما معمولاً پیشنهاد می‌شود بدنه را به گونه‌ای بنویسید که زیاد طولانی نشود.

پیشنهاد می‌شود اگر یک تابع با 100 خط کد که دو کار مختلف انجام می‌دهند دارید، بهتر است آن را به دو تابع کوچک‌تر اما با کارهای مشخص و یکتا تبدیل کنید.

خروجی تابع و نوع آن

در ریاضیات خروجی یک تابع، همان مقدار نهایی بود که محاسبه می‌شد. تابع در برنامه نویسی می‌تواند خروجی داشته یا نداشته باشد! اجازه دهید این مورد را با یک مثال ساده برایتان شفاف کنم:

اگر تابعی بنویسیم که تعداد تکرار یک کلمه در متن ما را محاسبه کند، قطعاً آن تابع خروجی خواهد داشت. خروجی تابع همان عدد دفعات تکرار است.

اما اگر تابعی داشته باشیم که مقدار مورد نظر ما را در پایگاه داده ذخیره کند، ممکن است به نتیجه (موفقیت یا شکست در ذخیره) احتیاجی نداشته باشیم. اگر اینطور باشد، تابع ما خروجی ندارد.

توجه داشته باشید که خروجی نداشتن یک تابع به این معنا نیست که هیچ کار خاصی انجام نمی‌دهد! در همین مثال پایگاه داده، خروجی برای ما مهم نیست وگرنه تابع یک کار مهم انجام داده است.

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

توابع در برنامه نویسی می‌توانند صفر یا چند ورودی داشته باشند. به این مقادیر ورودی اصطلاحاً «پارامترهای ورودی تابع» نیز گفته می‌شود. در اکثر زبان‌های برنامه‌نویسی در هنگام تعریف تابع، می‌توانیم به تعداد دلخواه ورودی با نام‌های مختلف در نظر بگیریم.

در حالت عادی، وقتی می‌گوییم تابع add(x ,y) دو ورودی دارد، این دو ورودی به صورت اجباری تعریف شده‌اند. یعنی اگر تابع را به صورت add(5) صدا بزنیم، با خطا مواجه خواهیم شد. همچنین اگر add(5,7,9) را صدا بزنیم هم اشتباه است.

در اکثر زبان‌ها امکان تعریف پارامترهای ورودی اختیاری نیز وجود دارد. یعنی یک تابع می‌تواند تعدادی ورودی اجباری و تعدادی هم اختیاری داشته باشد.

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

بخش‌های دیگر ساختار توابع

در زبان‌های مختلف برنامه‌نویسی بعضاً ویژگی های منحصر به فردی که در آن زبان وجود دارند را باید برای تعریف توابع استفاده کنیم.

برای مثال، در زبان جاوا باید سطح دسترسی توابع (متدها) را مشخص کنیم. منظور از سطح دسترسی همان وضعیت public و private و protected در برنامه‌نویسی شئ‌گراست.

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

شناخت بخش‌های مختلف یک تابع برنامه نویسی به ما کمک می‌کند ساختار تعریف تابع را در هر زبانی که بخواهیم تشخیص دهیم. به طور کلی اگر بخواهیم این بخش‌ها را کنار هم قرار دهیم، ساختاری شبیه زیر خواهیم داشت:

return_type function_name( parameters ){
     //function body
    return exp;
 }

این نوع تعریف فقط یک نمونه است و همان‌طور که چندین بار متذکر شدم، syntax تعریف تابع در هر زبانی متفاوت است.

در این قطعه کد از چند کلیدواژه استفاده کرده‌ام که معنی و کاربرد هر کدام به صورت زیر است:

  • return_type : نوع داده خروجی را مشخص می‌کند. در صورتی که تابع ما خروجی نداشته باشد، معمولاً از void استفاده می‌کنیم.
  • function_name : نام تابع باید یکتا و در طول برنامه منحصر به فرد باشد. همچنین معمولاً نمی‌توان تابعی با نام توابع از پیش تعریف شده داشت.
  • parameters : پارامترهای ورودی در این قسمت تعریف می‌شوند.
  • function body : در این بخش بدنه و کدهای تابع قرار می‌گیرد.
  • return exp : با این دستور در هر بخشی از بدنه تابع، مقدار exp که می‌تواند یک متغیر، یک پیام یا هر چیز دیگری باشد را به عنوان خروجی تابع برمی‌گردانیم.

در تعریف پارامترهای ورودی، در برخی زبان‌ها نیاز است نوع هر داده را مشخص کنیم. اما در بعضی زبان‌ها فقط نوشتن نام متغیر ورودی کافی است. برای اینکه چند پارامتر ورودی در تابع تعریف کنیم، آن‌ها را با علامت کاما (,) از هم جدا می‌کنیم.

برای مثال، در قطعه کد زیر، یک تابع با سه ورودی در پایتون تعریف کرده‌ایم:

def my_function( message, name, age ):
     //do something
انواع داده ها در برنامه نویسی مستقل از زبان

انواع داده ها در برنامه نویسی مستقل از زبان

فراخوانی توابع برنامه نویسی

برای فراخوانی یا صدا زدن تابع در برنامه نویسی کافی است در هر جایی که نیاز داریم، نام آن را آورده و در صورت نیاز پارامترهای ورودی را برایش تعریف کنیم.

برای درک بهتر، فرض کنید تابع power(x ,y) را در زبان PHP به صورت زیر تعریف می‌کنیم تا عدد x را به توان y رسانده و به عنوان خروجی به ما بدهد.

function power(x ,y){
     return x**y;
 }

حا هر کجای برنامه که نیاز داریم، باید power() را نوشته و دو مقدار ورودی آن را تعریف کنیم.

power(2 ,8);

خروجی این فراخوانی عدد 256 را به ما خواهد داد.

هر برنامه می‌تواند دارای هیچ یا چندین تابع باشد. اینکه کجا باید از تابع استفاده کنید یا چه جایی نیاز به تعریف تابع در برنامه‌نویسی نیست، بسته به نیاز و خلاقیت شما دارد.

اما در مجموع، اگر برنامه شما طولانی است و از قسمت‌های مختلفی تشکیل شده که می‌توانید آن را به توابع کوچک‌تری تقسیم کنید، پیشنهاد می‌شود این کار را انجام دهید!