در این بخش از مقاله آموزش کاتلین به بررسی تابعها، ماهیت و ساختار آنها و شیوه ایجاد یک تابع تعریف شده کاربر در این زبان برنامهنویسی میپردازیم.
تابع در برنامهنویسی به گروهی از گزارههای مرتبط با هم گفته میشود که یک وظیفه خاص را اجرا میکنند.
تابعها برای تجزیه یک برنامه بزرگ به اجزای کوچکتر و ایجاد حالت ماژولار مورد استفاده قرار میگیرند. برای نمونه فرض کنید باید یک دایره را بر اساس ورودی از سوی کاربر ایجاد و رنگآمیزی کنید. به این منظور میتوانید دو تابع بنویسید که به ترتیب عملیات ایجاد دایره و رنگآمیزی آن را اجرا میکنند:
- تابع ()createCircle
- تابع ()colorCircl
تقسیم یک برنامه بزرگ به کامپوننتهای کوچکتر، موجب میشود که برنامه قابلیت سازماندهی و مدیریت بیشتری پیدا کند.
انواع تابعها
بسته به این که یک تابع از سوی کاربر تعریف شده باشد یا در کتابخانه استاندارد موجود باشد، دو نوع تابع وجود دارد:
- تابع کتابخانه استاندارد کاتلین
- تابعهای تعریف شده از سوی کاربر
تابعهای کتابخانه استاندارد کاتلین
تابعهای کتابخانه استاندارد کاتلین، تابعهای داخلی این زبان برنامهنویسی هستند که به صورت آماده میتوان از آنها استفاده کرد. برای نمونه به مثال زیر توجه کنید. در این مثال تابع ()print یک تابع کتابخانه استاندارد است که در استریم خروجی استاندارد (نمایشگر) پرینت میکند. همچنین تابع ()sqrt جذر عدد را با مقدار از نوع Double بازگشت میدهد:
fun main(args: Array<String>) {
var number = 5.5 print("Result = ${Math.sqrt(number)}")
}
خروجی برنامه فوق به صورت زیر است:
Result = 2.345207879911715
تابعهای تعریف شده کاربر
همان طور که پیشتر اشاره کردیم، شما میتوانید تابعها را خودتان نیز ایجاد کنید. چنین تابعهایی به نام تابعهای تعریفشدهی کاربر شناخته میشوند.
شیوه ایجاد تابع تعریف شده کاربر در کاتلین چگونه است؟
پیش از آن که بتوانیم از تابع استفاده (آن را فراخوانی) کنیم، باید آن را تعریف نماییم. روش تعریف تابع در کاتلین به صورت زیر است:
fun callMe() { // function body
}
برای تعریف یک تابع در کاتلین از کلیدواژه fun استفاده میکنیم. سپس نام تابع (شناسه) میآید. در مثال فوق نام تابع callMe است. در برنامه فوق، پرانتزها خالی هستند. این بدان معنی است که این تابع هیچ آرگومانی نمیگیرد. در مورد آرگومانهای تابع در ادامه بیشتر توضیح خواهیم داد.
کدهای درون آکولاد، بدنه تابع را تشکیل میدهند.
شیوه فراخوانی تابع چگونه است؟
برای اجرای کدهای درون بدنه تابع باید آن را فراخوانی (Call) کنیم. روش انجام این کار به صورت زیر است:
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
طرز کار تابعهای دارای آرگومان و مقدار بازگشتی در کاتلین چگونه است؟
در مثال فوق دو عدد number1 و number2 از نوع Double در طی فراخوانی تابع، به آن ارسال میشوند. این آرگومانها به نام آرگومانهای واقعی شناخته میشوند.
result = addNumbers(number1, number2)
پارامترهای n1 و n2 آرگومانهای ارسالی را میگیرند. این آرگومانها به نام آرگومانهای صوری (یا پارامتر) شناخته میشوند.
آرگومانها در زبان کاتلین با استفاده از کاما از هم جدا میشوند. همچنین نوع آرگومان صوری باید به صورت صریح نوعبندی شده باشد. توجه کنید که نوع داده آرگومانهای واقعی و صوری باید با هم مطابقت داشته باشند، یعنی نوع داده آرگومان واقعی اول باید با نوع آرگومان صوری نخست یکسان باشد. به طور مشابه نوع آرگومان واقعی دوم نیز باید با نوع آرگومان صوری دوم مطابق بوده و باقی موارد نیز به همین ترتیب با هم منطبق باشند.
گزاره بازگشتی این تابع به صورت return sumInteger است. این کد موجب خاتمه یافتن تابع ()addNumbers میشود و بدین ترتیب کنترل برنامه به تابع ()main بازمیگردد. در این برنامه sumInteger از تابع ()addNumbers بازگشت مییابد. این مقدار به متغیر result انتساب مییابد.
توجه کنید که هر دو متغیر sumInteger و result از نوع Int هستند. همچنین نوع بازگشتی تابع در تعریف تابع تعریف میشود:
// return type is Int
fun addNumbers(n1: Double, n2: Double): Int { ... .. ...
}
اگر تابع هیچ مقداری بازگشت ندهد، نوع بازگشتی آن Unit خواهد بود. در صوتی که نوع بازگشتی به صورت 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): String = "$firstName $lastName"
با شیوه زیر جایگزین کرد:
fun getName(firstName: String, lastName: String) = "$firstName $lastName"
در این بخش از مقاله آموزش کاتلین توضیح مختصری در خصوص تابعهای کاتلین و ماهیت و طرز کار آنها ارائه کردیم. در بخشهای بعدی در این خصوص بیشتر صحبت خواهیم کرد.