در برنامهنویسی، تابع به گروهی از دستورات گفته میشود که کار خاصی را انجام میدهند. با استفاده از توابع یک برنامۀ بزرگ را میتوان به مجموعهای از قطعات کوچکتر تقسیم کرد. به عنوان مثال میخواهیم دایرههایی را رنگ کنیم. اینجا میتوانیم دو تابع ()createCircle و ()colorCircle تعریف کنیم. تقسیم یک برنامۀ پیچیده به کامپوننتهای کوچکتر باعث میشود تا برنامه را راحتتر مدیریت کنیم. بعلاوه از تکرار جلوگیری کرده و باعث میشود یک کد را چندین بار در قسمتهای مختلف استفاده کنیم. زبان کاتلین انعطاف زیادی در تعریف توابع دارد که طی این درس و درسهای آینده با گوشهای از آن آشنا خواهید شد.
انواع توابع
بسته به اینکه تابع متعلق به کتابخانهی استاندارد زبان باشد یا توسط برنامهنویس ساخته شده باشد دو نوع تابع داریم:
- توابع استاندارد کتابخانهی کاتلین؛
- توابعی که توسط کاربر تعریف میشوند.
توابع استاندارد کاتلین
توابع استاندارد کاتلین به دستهای از توابع گفته میشود که به صورت توکار (Built-In Function) در این زبان تعبیه شده تا توسعهدهندگان به راحتی در کدهای خود از آنها استفاده کنند. نمونهاش تابع ()print که پیغامی را در مانیتور (خروجی استاندارد) چاپ میکند یا تابع ()sqrt که جذر عدد داده شده را محاسبه میکند.
fun main(args: Array<String>) { var number = 5.5 print("Result = ${Math.sqrt(number)}") }
خروجی:
Result = 2.345207879911715
سایر توابع موجود در کتابخانهی استاندارد کاتلین
توابع تعریف شده توسط کاربر
همانطور که اشاره شد، خودتان هم میتوانید توابع مورد نیازتان را بسازید. به چنین توابعی، توابع تعریف شده توسط کاربر (User-Defined Function) گفته میشود. قبل از فرخوانی این توابع ابتدا باید آنها را بسازید. شکل تعریف تابع در کاتلین به صورت زیر است:
fun callMe() {
// function body
}
برای تعریف یک تابع در کاتلین از کلیدواژۀ fun در ابتدای آن استفاده میشود. سپس نام تابع یا identifier آن را میآوریم که در اینجا callMe است. در برنامۀ بالا داخل پرانتز خالی است، این یعنی تابع callMe هیچ آرگومانی نمیگیرد. در ادامهی همین مقاله آرگومانها را توضیح میدهم. هرآنچه داخل آکولاد نوشته میشود، کدهای آن تابع محسوب شده که با فرخوانیاش خط به خط اجرا میشوند.
برای فراخوانی توابع کافی است در هر جایی از برنامه، عنوان تابع به همراه پرانتز آورده شود.
callme()
این دستور تابع ()callMe را به شکل زیر فرخوانی میکند:
یک تابع ساده بدون آرگومان و مقدار برگشتی
fun callMe() { println("Printing from callMe() function.") println("This is cool (still printing from inside).") } fun main(args: Array<String>) { callMe() println("Printing outside from callMe() function.") }
خروجی:
Printing from callMe() function. This is cool (still printing from inside). Printing outside from callMe() function.
تابع ()callMe در مثال بالا هیچ آرگومانی نمیگیرد. همچنین مقداری را هم برنمیگرداند.
تابعی برای محاسبهی جمع دو عدد
این تابع دو عدد به عنوان آرگومانهای ورودی میگیرد و بعد از جمع کردن آنها، نتیجه را برمیگرداند.
fun addNumbers(n1: Double, n2: Double): Int { val sum = n1 + n2 val sumInteger = sum.toInt() return sumInteger } fun main(args: Array<String>) { val number1 = 12.2 val number2 = 3.4 val result: Int result = addNumbers(number1, number2) println("result = $result") }
خروجی:
result = 15
طرز کار توابعی که آرگومان و مقدار برگشتی دارند
در حین فراخوانی تابع ()addNumbers دو آرگومان number1 و number2 از نوع Double به آن پاس داده میشوند که آرگومانهای واقعی نام دارند.
result = addNumbers(number1, number2)
پارامترهای n1 و n2 آرگومانهای پاس داده شده را دریافت میکنند. این آرگومانها اکنون آرگومان رسمی یا پارامتر نامیده میشوند.
در کاتلین، آرگومانها با ویرگول (کاما) از یکدیگر جدا میشوند. همچنین نوع آرگومانها صریحاً باید تعریف شوند. توجه داشته باشید که نوع دادههای انتقالی آرگومانهای واقعی و رسمی کاملاً باید با هم تطابق داشته باشند. مثلاً اگر تابع شما مقادیر Double میگیرد نباید هنگام فرخوانیاش مقادیر String ارسال کنید.
در خط پایانی، جمع دو عدد بازگردانده میشود:
return sumInteger
این خط به تابع ()addNumbers پایان میدهد و کنترل برنامه را به تابع ()main یا جایی که از آنجا فرخوانی شده هدایت میکند. مقدار برگشتی sumInteger در متغیر result ذخیره شده است.
توجه:
- هم متغیر result و هم sumInteger از نوع Int هستند؛
- نوع برگشتی تابع در تعریف آن مشخص شده است.
// return type is Int fun addNumbers(n1: Double, n2: Double): Int { ... .. ... }
اگر تابع هیچ مقداری را برنگرداند، نوع برگشتی Unit خواهد بود و ذکر نوع چنین توابعی اختیاری است.
مثال : نمایش نام
fun main(args: Array<String>) { println(getName("John", "Doe")) } fun getName(firstName: String, lastName: String): String = "$firstName $lastName"
خروجی:
John Doe
در اینجا تابع ()getName دو آرگومان از نوع String میگیرد و مقداری از نوع String بازپس میدهد. وقتی تابع فقط یک دستور داشته باشد به راحتی میتوان آکولادها را حذف کرد و به جای آن علامت مساوی قرار داد. در چنین شرایطی میتوان نوع بازگشتی را هم حذف کرد چرا که خودِ کامپایلر قادر به شناسایی نوع تابع هست (دقت کنید فقط برای توابعی که یک دستور دارند و بدون آکولاد هستند.) یعنی میتوانیم تابع بالا را اینگونه بازنویسی کنیم:
fun getName(firstName: String, lastName: String) = "$firstName $lastName"
1 دیدگاه
ممنون و تشکر از زحمات ی دریغتان