NO. 0205
برنامه‌نویسی و طراحی وب مفاهیم پایه برنامه‌نویسی

تابع

Function

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

چرا تابع لازم است؟

فرض کنید در ده جای برنامه باید مالیات محاسبه کنید. بدون تابع، همان چند خط را ده بار کپی می‌کنید. حالا نرخ مالیات تغییر می‌کند — باید هر ده جا را پیدا و اصلاح کنید و احتمالاً یکی را فراموش می‌کنید.

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

مزایای دیگر:

  • خوانایی. نام calculateTax() بلافاصله می‌گوید چه اتفاقی می‌افتد؛ خواننده لازم نیست جزئیات را بخواند.
  • آزمون‌پذیری. تابع کوچک و مستقل را می‌توان جداگانه آزمود.
  • تقسیم کار. اعضای تیم می‌توانند روی توابع مختلف به‌طور موازی کار کنند.
  • انتزاع. برای استفاده از تابع، لازم نیست بدانید داخلش چه می‌گذرد — فقط ورودی و خروجی مهم است.

ورودی و خروجی

دو واژه که مدام اشتباه گرفته می‌شوند:

  • پارامتر نامی است که هنگام تعریف تابع می‌نویسید — مثل جای خالی در فرم.
  • آرگومان مقدار واقعی است که هنگام فراخوانی می‌فرستید — چیزی که در جای خالی می‌نویسید.

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

عوارض جانبی

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

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

ویژگی‌های یک تابع خوب

  1. یک کار انجام می‌دهد. اصل «مسئولیت واحد». اگر در توصیف کار تابع ناچار به گفتن «و» شدید، احتمالاً باید به دو تابع تقسیم شود.
  2. نامش فعل است. تابع کاری انجام می‌دهد، پس نامش باید فعل باشد: getUser، validateEmail، sendMessage.
  3. کوتاه است. قاعدهٔ سرانگشتی: اگر بدون اسکرول در صفحه جا نمی‌شود، احتمالاً کارهای زیادی می‌کند.
  4. پارامترهای کم دارد. بیش از سه یا چهار پارامتر معمولاً نشانهٔ این است که تابع بیش از حد می‌داند.
  5. غافلگیر نمی‌کند. تابعی به نام getUser نباید چیزی را حذف کند. رفتار باید با نام بخواند.
  6. خطا را پنهان نمی‌کند. اگر کاری شکست خورد، باید مشخص شود — نه اینکه بی‌سروصدا نادیده گرفته شود.

مفاهیم مرتبط

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

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

پرسش‌های متداول دربارهٔ تابع

تفاوت تابع و متد چیست؟

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

تابع باید حتماً چیزی برگرداند؟

خیر. بسیاری از توابع فقط کاری انجام می‌دهند — نمایش پیام، ذخیرهٔ فایل، ارسال درخواست — و مقداری برنمی‌گردانند. اما تابعی که نه مقدار برمی‌گرداند و نه هیچ اثری دارد، عملاً بی‌فایده است.

چند خط برای یک تابع مناسب است؟

عدد قطعی وجود ندارد و قاعدهٔ سختگیرانه می‌تواند به کد بدتری منجر شود. معیار بهتر این است: آیا می‌توانید کار تابع را در یک جملهٔ ساده و بدون «و» توصیف کنید؟ اگر بله، طولش هرچه باشد احتمالاً مناسب است.