تابع
Functionتابع بلوکی نامدار از کد است که یک کار مشخص انجام میدهد و میتوان آن را بارها فراخوانی کرد. تابع معمولاً ورودی میگیرد، پردازشی انجام میدهد و خروجی برمیگرداند — و مهمتر از همه، از تکرار کد جلوگیری میکند.
چرا تابع لازم است؟
فرض کنید در ده جای برنامه باید مالیات محاسبه کنید. بدون تابع، همان چند خط را ده بار کپی میکنید. حالا نرخ مالیات تغییر میکند — باید هر ده جا را پیدا و اصلاح کنید و احتمالاً یکی را فراموش میکنید.
با تابع، منطق در یک جا نوشته میشود و ده بار فراخوانی. تغییر در یک نقطه، همهجا اعمال میشود.
مزایای دیگر:
- خوانایی. نام
calculateTax()بلافاصله میگوید چه اتفاقی میافتد؛ خواننده لازم نیست جزئیات را بخواند. - آزمونپذیری. تابع کوچک و مستقل را میتوان جداگانه آزمود.
- تقسیم کار. اعضای تیم میتوانند روی توابع مختلف بهطور موازی کار کنند.
- انتزاع. برای استفاده از تابع، لازم نیست بدانید داخلش چه میگذرد — فقط ورودی و خروجی مهم است.
ورودی و خروجی
دو واژه که مدام اشتباه گرفته میشوند:
- پارامتر نامی است که هنگام تعریف تابع مینویسید — مثل جای خالی در فرم.
- آرگومان مقدار واقعی است که هنگام فراخوانی میفرستید — چیزی که در جای خالی مینویسید.
تابع میتواند مقداری برگرداند یا صرفاً کاری انجام دهد و چیزی برنگرداند. اولی مثل ماشینحساب است و دومی مثل چاپگر.
وقتی تابعی علاوه بر برگرداندن مقدار، چیزی بیرون از خودش را هم تغییر میدهد — مثل نوشتن در فایل یا تغییر یک متغیر سراسری — میگویند عارضهٔ جانبی دارد.
تابعی که فقط به ورودیهایش وابسته است و هیچ چیز بیرونی را تغییر نمیدهد، تابع خالص نامیده میشود. چنین توابعی بسیار راحتتر آزموده و اشکالزدایی میشوند، چون رفتارشان همیشه قابل پیشبینی است.
ویژگیهای یک تابع خوب
- یک کار انجام میدهد. اصل «مسئولیت واحد». اگر در توصیف کار تابع ناچار به گفتن «و» شدید، احتمالاً باید به دو تابع تقسیم شود.
- نامش فعل است. تابع کاری انجام میدهد، پس نامش باید فعل باشد:
getUser،validateEmail،sendMessage. - کوتاه است. قاعدهٔ سرانگشتی: اگر بدون اسکرول در صفحه جا نمیشود، احتمالاً کارهای زیادی میکند.
- پارامترهای کم دارد. بیش از سه یا چهار پارامتر معمولاً نشانهٔ این است که تابع بیش از حد میداند.
- غافلگیر نمیکند. تابعی به نام
getUserنباید چیزی را حذف کند. رفتار باید با نام بخواند. - خطا را پنهان نمیکند. اگر کاری شکست خورد، باید مشخص شود — نه اینکه بیسروصدا نادیده گرفته شود.
مفاهیم مرتبط
| اصطلاح | معنی |
|---|---|
| متد | تابعی که متعلق به یک کلاس است |
| تابع بازگشتی | تابعی که خودش را فراخوانی میکند |
| تابع بینام | تابعی بدون نام، معمولاً برای استفادهٔ یکبار |
| تابع درجه بالا | تابعی که تابع دیگری را بهعنوان ورودی میگیرد یا برمیگرداند |
| فراخوان | تابعی که پس از پایان کاری اجرا میشود |
تابع بازگشتی باید حتماً یک شرط پایان داشته باشد — حالتی که در آن دیگر خودش را صدا نمیزند. بدون آن، برنامه تا پرشدن حافظه ادامه میدهد و متوقف میشود. این یکی از رایجترین خطاهای تازهکارها در کار با بازگشت است.
پرسشهای متداول دربارهٔ تابع
تفاوت تابع و متد چیست؟
متد در واقع تابعی است که درون یک کلاس تعریف شده و به شیء آن کلاس تعلق دارد. تفاوت عملی این است که متد معمولاً به دادههای همان شیء دسترسی دارد، در حالی که تابع مستقل فقط با ورودیهایش کار میکند.
تابع باید حتماً چیزی برگرداند؟
خیر. بسیاری از توابع فقط کاری انجام میدهند — نمایش پیام، ذخیرهٔ فایل، ارسال درخواست — و مقداری برنمیگردانند. اما تابعی که نه مقدار برمیگرداند و نه هیچ اثری دارد، عملاً بیفایده است.
چند خط برای یک تابع مناسب است؟
عدد قطعی وجود ندارد و قاعدهٔ سختگیرانه میتواند به کد بدتری منجر شود. معیار بهتر این است: آیا میتوانید کار تابع را در یک جملهٔ ساده و بدون «و» توصیف کنید؟ اگر بله، طولش هرچه باشد احتمالاً مناسب است.
اصطلاحات همخانوادهٔ مفاهیم پایه برنامهنویسی
مشاهدهٔ همه ←- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.
- الگوریتمالگوریتم دنبالهای متناهی از گامهای دقیق و بدون ابهام است که مسئلهای را حل میکند. الگوریتم مستقل از زبان برنامهنویسی است: یک الگوریتم واحد را میتوان در هر زبانی پیاده کرد، درست مثل دستور پختی که با هر اجاقی قابل اجراست.
- فلوچارتفلوچارت یا نمودار گردش کار، نمایش تصویری یک فرایند یا الگوریتم با شکلهای استاندارد است. هر شکل معنای مشخصی دارد و فلشها مسیر اجرا را نشان میدهند. کاربردش فراتر از برنامهنویسی است و در طراحی هر فرایندی به کار میآید.
- متغیرمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
- شیگرایی OOPشیگرایی سبکی از برنامهنویسی است که در آن برنامه از مجموعهای از اشیاء ساخته میشود؛ هر شیء دادههای خودش را نگه میدارد و رفتارهای مربوط به آن دادهها را انجام میدهد. هدف اصلیاش مدیریت پیچیدگی در نرمافزارهای بزرگ است.
برای درک کاملتر، اینها را هم بخوانید
- متغیرمتغیر نامی است که به یک مقدار در حافظه اشاره میکند. بهجای اینکه با آدرسهای عددی حافظه کار کنید، به مقدار نامی معنادار میدهید و از آن پس با همان نام به آن دسترسی دارید.
- کلاسکلاس نقشه یا قالبی است که تعیین میکند یک نوع شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. از روی یک کلاس میتوان بینهایت شیء ساخت که هر کدام دادههای خودشان را دارند اما رفتار مشترکی نشان میدهند.
- برنامهنویسیبرنامهنویسی یعنی تبدیل یک راهحل به دنبالهای از دستورهای دقیق که کامپیوتر بتواند اجرا کند. نکتهای که اغلب نادیده گرفته میشود: بخش سخت برنامهنویسی نوشتن کد نیست، بلکه فهمیدن دقیق مسئله و طراحی راهحل است.