«تابع» (Function) یکی از اصلیترین مفاهیم موجود در دنیای برنامه نویسی است. امروزه با توجه به پیچیدهتر شدن منطقهای مورد استفاده در برنامه نویسی و افزایش حجم کدها لزوم استفاده از توابع بیشتر از گذشته حس میشود. توابع با تقسیم برنامه به بخشهای کوچکتر ضمن جلوگیری از تکرار به خوانایی کد نیز کمک میکنند. نحوه استفاده از توابع در کاتلین نیز همانند سایر زبانهای برنامه نویسی است. استفاده از توابع در کاتلین فرایند کد نویسی را کوتاهتر و آسانتر میکند. در این مطلب از مجله تم آف، توابع در کاتلین و انواع آن به همراه مثالهای متعدد از تعریف و فراخوانی مورد بررسی قرار گرفته است.
منظور از توابع در کاتلین چیست؟
توابع در کاتلین مجموعهای از کدهای مرتبط به هم هستند که وظیفه خاصی را انجام میدهند. در برنامه نویسی از توابع برای شکستن کد به بخشهای کوچکتر استفاده میشود که به مدیریت بهتر برنامه کمک میکند.
تقسیم برنامه به بخشهای کوچکتر ضمن ایجاد امکان مدیریت بهتر برنامه از تکرار کدها نیز جلوگیری میکند. در نتیجه، خوانایی برنامه افزایش مییابد.
به عنوان مثال، در برنامهای قرار است که بر اساس دریافتی از کاربر یک دایره ایجاد و سپس رنگ شود. این عملکرد را میتوان در قالب دو تابع پیادهسازی کرد.
- تابع ( )createCircle
: کدهای مربوط به ایجاد دایره در این بخش پیادهسازی میشوند.
- تابع ( )colorCircle
: برای رنگ کردن دایره از این تابع استفاده میشود.
نحوه تعریف توابع در کاتلین به چه صورت است؟
نحوه تعریف توابع در کاتلین بسیار مشابه با سایر زبانهای برنامه نویسی است. برای تعریف تابع در کاتلین از کلمه کلیدی fun
به همراه نام تابع و پارامترهای ورودی آن استفاده میشود. کد زیر پیادهسازی تابع sum()
برای محاسبه مجموع دو عدد را نشان میدهد.
fun sum(a: Int, b: Int): Int {
return a + b
}
در مثال بالا، میتوان تابع sum(x,y)
را به دفعات مختلف فراخوانی کرد و این تابع مجموع دو عدد ورودی را برگشت خواهد داد. بنابراین، توابع ضمن جلوگیری از تکرار، امکان استفاده مجدد از کد را نیز فراهم میکنند.
منظور از توابع بدون مقدار بازگشتی در کاتلین چیست؟
توابع بدون مقدار بازگشتی در کاتلین توابعی هستند که بعد از اتمام دستورات بدنه تابع مقداری را برگشت نمیدهند. در بدنه این توابع کلمه کلیدی Return
دیده نمیشود و خروجی آنها اصطلاحاً از نوع Void
است. قطعه کد زیر تابع بدون مقدار بازگشتی در کاتلین را نشان میدهد.
fun test( ){
print("Faradars Blog")
}
منظور از توابع با مقدار بازگشتی در کاتلین چیست؟
توابع با مقدار بازگشتی در کاتلین توابعی هستند که در صورت فراخوانی مقداری را برگشت میدهند. کلمه کلیدی Return
در بدنه این توابع دیده میشود و با توجه به نوع دادهای بازگشتی باید متغیری برای ذخیره این مقدار در نظر گرفت.
علاوه بر این، در زمان تعریف این توابع نوع دادهای بازگشتی بعد از نام تابع و علامت :
مشخص میشود. قطعه کد زیر تابع با مقدار بازگشتی در کاتلین را نشان میدهد.
fun test( ): String{
return "Faradars Blog"
}
مزایا و معایب استفاده از توابع در کاتلین
در این بخش از نوشته مزایا و معایب استفاده از توابع در کاتلین مورد بررسی قرار گرفته است. در ابتدا مزایای استفاده از توابع آورده شده است.
مزایای توابع در کاتلین
مزایای استفاده از توابع در کاتلین در فهرست زیر آورده شده است.
- ماژولار بودن: استفاده از توابع روشی برای ماژولار کردن کد و تقسیم آن به بخشهای کوچکتر برای مدیریت بهتر محسوب میشود. «برنامه نویسی ماژولار» (Modular Programming) کد نوشته شده را خواناتر میکند و قابلیت نگهداری آن را افزایش میدهد. علاوه بر این، تست و آزمایش کد نیز در این شرایط آسانتر میشود.
- قابلیت استفاده مجدد: یک تابع را میتوان در چندین بخش از کد فراخوانی کرد. این مورد ضمن جلوگیری از تکرار کد امکان استفاده مجدد از آن را نیز فراهم میکند.
- بهبود خوانایی: استفاده از توابع روشی برای کپسوله کردن منطق پیچیده در قالب بلوکهای کد است که خوانایی و درک کد نوشته شده از این طریق افزایش مییابد.
- انتزاع بهبود یافته: از توابع در کاتلین میتوان برای درک منطقهای پیچیده استفاده کرد. با استفاده از توابع درک عملکرد کد بدون نیاز به پیادهسازی جزئیات آن آسانتر میشود.
معایب توابع در کاتلین
معایب استفاده از توابع در کاتلین در فهرست زیر آورده شده است.
- افزایش سربار (Overhead): استفاده از توابع زیاد در برنامه ضمن افزایش اندازه کد، مقدار حافظه مورد نیاز برای اجرای کد را افزایش میدهد. درنتیجه، زمان مورد نیاز برای اجرای کد نیز متعاقباً افزایش مییابد.
- دشواری در اشکالزدایی (Debugging): در صورت پیادهسازی منطقهای پیچیده در قالب توابع تودرتو خطایابی و رفع اشکال از کد دشوار خواهد شد.
انواع توابع در کاتلین
توابع در کاتلین بر اساس تعریف توسط کاربر یا قرار داشتن در کتابخانه استاندارد کاتلین تقسیمبندی میشوند. بر این اساس دو نوع تابع در کاتلین وجود دارد.
- توابع کتابخانه استاندارد کاتلین
- توابع تعریف شده توسط کاربر
توابع کتابخانه استاندارد کاتلین
توابع زیادی در کتابخانه استاندارد کاتلین برای عملکردهای مختلف در دسترس قرار دارند. نحوه استفاده از این توابع در کاتلین بسیار آسان است و تنها با ارسال آرگومانهای مشخص شده میتوان از آنها در برنامه استفاده کرد.
در ادامه چند مورد از پرکاربردترین توابع موجود در کتابخانه استاندارد کاتلین به همراه عملکردشان ارائه شدهاند.
- ()sqrt
: برای محاسبه جذر اعداد از این تابع استفاده میشود.
- ()print
: این تابع برای چاپ پیام در خروجی کاربرد دارد.
- ()rem
: این تابع باقیمانده یک عدد در تقسیم بر عددی دیگر را نمایش میدهد.
- ()toInt
: برای تبدیل یک عدد به عدد صحیح از این تابع استفاده میشود.
- ()readline
: برای دریافت مقادیر از کاربر میتوان از این تابع استفاده کرد.
- ()compareTo
: این تابع نتیجه حاصل از مقایسه دو عدد را نشان میدهد.
مثالی از کاربرد توابع کتابخانه استاندارد کاتلین
در نمونه کد زیر از ۳ تابع arrayOf()
، sum()
، println()
موجود در کتابخانه استاندارد کاتلین استفاده شده است.
fun main(args: Array) {
var sum = arrayOf(1,2,3,4,5,6,7,8,9,10).sum()
println("The sum of all the elements of an array is: $sum")
}
تابع arrayOf()
در مثال بالا چندین آرگومان از نوع «عدد صحیح» (Integers) یا «عدد اعشاری» (Double) را به عنوان ورودی دریافت میکند و آرایه جدیدی را تشکیل میدهد. همچنین، تابع sum()
برای محاسبه مجموع عناصر درون آرایه و تابع println()
برای چاپ متن مشخص شده در خروجی به کار رفتهاند. در ادامه، خروجی حاصل از اجرای قطعه کد بالا آورده شده است.
The sum of all the elements of an array is: 55
توابع تعریف شده توسط کاربر
در زبان برنامه نویسی کاتلین امکان پیادهسازی توابع توسط کاربر وجود دارد. این توابع در کاتلین با عنوان «توابع تعریف شده توسط کاربر» (User-Defined Function) شناخته میشوند.
همان طور که پیشتر نیز عنوان شد، برای تقسیم یک برنامه به بخشهای کوچکتر باید از توابع استفاده کرد. هر تابع دارای ویژگیهای خاصی همچون نام، نوع بازگشتی، تعداد پارامترهای مورد نیاز و سایر موارد است.
نحوه تعریف توابع در کاتلین
برای تعریف توابع در کاتلین برخلاف زبانهای جاوا (Java) و اسکالا (Scala) نیازی به ساخت کلاس جدید برای نگهداری توابع نیست. در کاتلین توابع در قسمت بالایی برنامه تعریف میشوند. ساختار زیر نحوه تعریف توابع در کاتلین را نشان میدهد.
fun fun_name(a: data_type, b: data_type, ......): return_type {
// other codes
return
}
در ادامه به بررسی هر یک از اجزای تابع فوق پرداخته شده است.
- fun: کلمه کلیدی برای تعریف تابع در کاتلین که در ابتدای تعریف قرار میگیرد.
- fun_name: نام دلخواه برای تابع که بعداً برای فراخوانی تابع از آن استفاده میشود.
- data_type: درون پرانتز میتوان به تعداد مورد نیاز آرگومان ورودی تعریف کرد. نوع این آرگومانها با استفاده از data_type مشخص میشود که میتواند از نوع «رشتهای» (String)، «عدد صحیح» (Integer) و سایر موارد باشد.
- return_type: نوع بازگشتی توسط تابع را مشخص میکند.
- {….}: کدهای مربوط به تابع باید درون این بخش تعریف شوند.
تفاوت پارامتر و آرگومان در توابع چیست؟
پارامتر و آرگومان دو مفهوم مهم در تعریف توابع هستند و غالباً این دو اصطلاح به جای یکدیگر نیز به کار میروند. در این بخش با نگاهی دقیقتر این دو اصطلاح مهم در تعریف توابع را مورد بررسی قرار دادهایم.
برای درک بهتر در مثال زیر به تعریف و فراخوانی تابع getFullName()
توجه کنید.
fun getFullName(firstName: String, lastName: String): String {
return "$firstName $lastName"
}
fun main() {
val fullName = getFullName("Michael", "Smith")
println(fullName)
}
پارامترها مقادیر ارسالی به تابع را مشخص میکنند و درون پرانتز در زمان معرفی تابع مشخص میشوند. در مثال بالا، firstName
و lastName
پارامترهای تابع getFullName()
هستند. از سویی دیگر، آرگومانها مقادیری هستند که در زمان فراخوانی به تابع ارسال میشوند. دو مقدار Michael
و Smith
آرگومانهای ارسالی به تابع در مثال بالا هستند.
نکات مهم در خصوص ارسال آرگومان به توابع در کاتلین
زبانهای برنامه نویسی امروزی به توابع امکان داشتن چندین پارامتر را میدهند. هر پارامتر نیز دارای نوع مشخصی است که پیشتر در تعریف تابع مشخص شده است. پارامترها در تعریف توابع به کمک ویرگول از هم جدا شدهاند.
در خصوص ارسال آرگومان به تابع باید ۳ نکته مهم را رعایت کرد که در ادامه این نکات فهرست شدهاند.
- تعداد پارامترها باید با تعداد آرگومانها برابر باشد.
- ترتیب ارسال آٰرگومانها به تابع مهم است.
- نوع دادهای پارامترها و آرگومانهای ارسالی باید یکسان باشد.
آرگومان در برنامه نویسی چیست ؟ — به زبان ساده
چند مثال از تعریف توابع در کاتلین
دامنه استفاده از توابع در برنامه نویسی بسیار گسترده است. از محاسبات ساده گرفته تا انجام عملیاتهای پیچیده همگی به کمک توابع قابل پیادهسازی هستند.
در این بخش ابتدا دو تابع پیادهسازی خواهد شد و سپس، برای استفاده از آنها در برنامه نحوه فراخوانی توابع در کاتلین توضیح داده میشود.
پیادهسازی تابع در کاتلین برای محاسبه حاصلضرب دو عدد
در قطعه کد زیر تابعی به نام mul
برای محاسبه حاصلضرب دو عدد صحیح تعریف شده است.
fun mul(num1: Int, num2: Int): Int {
var number = num1.times(num2)
return number
}
خروجی حاصل از اجرای این تابع یک عدد صحیح است.
پیادهسازی تابع student در کاتلین برای چاپ رشته در خروجی
در قطعه کد زیر تابعی به نام student
همراه با ۳ پارامتر ورودی مختلف از نوعهای رشتهای، عدد صحیح و «کاراکتر» (Char) تعریف شده است.
fun student(name: String , roll_no: Int , grade: Char) {
println("Name of the student is : $name")
println("Roll no of the student is: $roll_no")
println("Grade of the student is: $grade")
}
خروجی حاصل از اجرای تابع فوق چاپ اطلاعات مربوط به دانش آموز همچون نام، شناسه دانش آموزی و پایه تحصیلی است.
نحوه فراخوانی توابع در کاتلین چگونه است؟
هدف از ایجاد توابع در برنامه انجام کار یا وظیفه مشخصی است. برای استفاده از توابع باید آنها را در برنامه فراخوانی کرد. اجرای کدها توسط کامپایلر (Compiler) از اولین خط شروع میشود و به محض رسیدن به تابع فراخوانی شده از بخش فعلی خارج شده و کدهای موجود در بدنه تابع را اجرا میکند.
در ادامه چرخه اجرای مربوط به فراخوانی توابع ارائه شده است.
- رسیدن کامپایلر به خطی که فراخوانی تابع در آن قرار دارد.
- هنگام فراخوانی تابع کنترل به آن خط منتقل میشود.
- دستورات موجود در بدنه تابع به ترتیب اجرا میشوند.
- کنترل زمانی به بخش قبلی منتقل میشود که به کروشه انتهایی تابع یا به «عبارت بازگشتی» (Return Statement) برسد.
- مقادیر برگشتی توسط تابع در بخشهای مشخص شده از کد اصلی مورد استفاده قرار میگیرند.
فراخوانی تابع حاصلضرب دو عدد با ارسال دو آرگومان
در قطعه کد زیر تعریف و فراخوانی تابع mul
برای محاسبه حاصلضرب دو عدد با ارسال دو آرگومان ورودی یعنی اعداد ۳ و ۵ آورده شده است.
fun mul(a: Int, b: Int): Int {
var number = a.times(b)
return number
}
fun main(args: Array) {
var result = mul(3,5)
println("The multiplication of two numbers is: $result")
}
در بدنه تابع main()
با رسیدن کنترل به فراخوانی تابع mul(3,5)
کدهای موجود در این تابع اجرا خواهند شد. درون بدنه این تابع نیز از تابع داخلی times()
استفاده شده است که حاصلضرب دو عدد را محاسبه و در متغیر number
ذخیره میکند. در ادامه به کمک دستور return
مقدار محاسبه شده برگشت داده میشود و کنترل به تابع main()
برمیگردد. بعد از ذخیره مقدار بازگشتی درون متغیر result
دستور println()
عبارت مشخص شده را در خروجی چاپ میکند.
The multiplication of two numbers is: 15
عبارت فوق خروجی حاصل از اجرای کد را نمایش میدهد.
فراخوانی تابع student به همراه تمام آرگومانهای مورد نیاز
در قطعه کد زیر تعریف و فراخوانی تابع student
برای چاپ اطلاعات در خروجی همراه با ارسال تمام آرگومانهای مورد نیاز آورده شده است.
fun student( name: String , grade: Char , roll_no: Int) {
println("Name of the student is : $name")
println("Grade of the student is: $grade")
println("Roll no of the student is: $roll_no")
}
fun main(args: Array) {
val name = "Praveen"
val rollno = 25
val grade = 'A'
student(name,grade,rollno)
student("Gaurav",'B',30)
}
تابع main()
از قطعه کد بالا، تابع student()
را دو مرتبه فراخوانی کرده است. در فراخوانی توابع باید ترتیب آرگومانهای ارسالی با ترتیب پارامترهای موجود در تعریف تابع یکسان باشد و در صورت عدم رعایت این شرط خطای «عدم مطابقت» (Mismatch) توسط کامپایلر در خروجی داده خواهد شد. آرگومانهای ارسالی در اولین فراخوانی تابع student
در قالب «متغیر» (Variable) و در دومین فراخوانی به صورت مستقیم مشخص شدهاند. بنابراین، هر دو روش برای ارسال آرگومان به تابع صحیح هستند. در ادامه خروجی حاصل از اجرای نمونه کد بالا آورده شده است.
Name of the student is : Praveen Grade of the student is: A Roll no of the student is: 25 Name of the student is : Gaurav Grade of the student is: B Roll no of the student is: 30
چند نکته کاربردی استفاده از توابع در کاتلین
در این بخش از نوشته نکاتی کاربردی برای کار با توابع در کاتلین عنوان شده است. دانستن این نکات درک عمیقتری از کار با توابع را به ارمغان میآورد. همچنین، شیوههای مختلف پیادهسازی و فراخوانی توابع در این بخش عنوان شده است.
پارامترها با مقادیر پیش فرض
پارامترهای توابع میتوانند دارای مقادیر پیشفرض باشند. این مقادیر پیشفرض زمانی مورد استفاده قرار میگیرند که آرگومانی هنگام فراخوانی توابع ارسال نشود. مقادیر پیشفرض بعد علامت =
در مقابل نوع دادهای مشخص میشوند. نمونه کد زیر پیادهسازی تابع همراه با پارامترهای پیشفرض را نشان میدهد.
fun read(
b: ByteArray,
off: Int = 0,
len: Int = b.size,
) { /*...*/ }
در صورت ارسال آرگومان مقدار پیشفرض پارامتر نادیده گرفته میشود و آرگومان ارسالی مورد استفاده قرار میگیرد.
آرگومانهای نامگذاری شده
در زمان فراخوانی توابع در کاتلین میتوان نام آرگومانها را بیان کرد. اهمیت استفاده از این شیوه زمانی بیشتر مشخص میشود که تابع دارای آرگومانهای زیادی باشد. به عنوان مثال، تابع زیر را در نظر بگیرید.
fun reformat(
str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ',
) { /*...*/ }
برای فراخوانی تابع بالا نیازی به نامگذاری تمام آرگومانهای آن نیست. علاوه بر این، در زمان فراخوانی تابع با آرگومانهای نامگذاری شده میتوان از ترتیب آنها صرف نظر کرد. قطعه کد زیر فراخوانی تابع بالا را به کمک آرگومانهای نامگذاری شده نمایش میدهد.
reformat(
"String!",
false,
upperCaseFirstLetter = false,
divideByCamelHumps = true,
'_'
)
توابع با مقدار بازگشتی Unit
در کاتلین توابعی با مقدار بازگشتی Unit تعریف میشوند که عملاً مقدار خاصی را برگشت نمیدهند. قرار دادن این نوع بازگشتی کاملاً اختیاری است. قطعه کد زیر تابعی با مقدار بازگشتی Unit را نشان میدهد.
fun printHello(name: String?): Unit {
if (name != null)
println("Hello $name")
else
println("Hi there!")
// `return Unit` or `return` is optional
}
قرار دادن عبارت Unit در تعریف توابع کاملاً اختیاری است. نمونه کد زیر با تابع تعریف شده در بالا تفاوتی ندارد.
fun printHello(name: String?) { ... }
توابع تک خطی در کاتلین
یکی از نکات مثبت در خصوص کاتلین ارائه ویژگیهایی برای خلاصه کردن کد است. در «توابع تک خطی» (Single-expression Functions) میتوان کروشهها را حذف کرد و تنها علامت =
را بعد از نوع داده برگشتی تابع قرار داد. نمونه کد زیر یک تابع تک خطی در کاتلین را نشان میدهد.
fun double(x: Int): Int = x * 2
همچنین، قرار دادن نوع بازگشتی تابع نیز اختیاری است و میتوان به صورت زیر آن را حذف کرد.
fun double(x: Int) = x * 2
آرگومانهای نامحدود توابع در کاتلین
گاهی اوقات در دنیای برنامه نویسی تعداد آرگومانهای ارسالی به صورت دقیق مشخص نیست و هر تعدادی برای آرگومانها امکانپذیر است. به عنوان مثال، توابعی که یک لیست یا آرایه را به عنوان ورودی دریافت میکنند و تعداد عناصر موجود در لیست یا آرایه متغیر است. در این شرایط با قرار دادن کلمه کلیدی vararg
قبل از پارامتر میتوان دریافت مقادیر نامحدود را ممکن کرد.
نمونه کد زیر پیادهسازی تابع با استفاده از آرگومانهای نامحدود در کاتلین را نشان میدهد.
fun asList(vararg ts: T): List {
val result = ArrayList()
for (t in ts) // ts is an Array
result.add(t)
return result
}
در این حالت میتوان تعداد متغیری از آرگومانها را برای این تابع ارسال کرد.
val list = asList(1, 2, 3)
سوالات متداول در خصوص توابع در کاتلین
بعد از بررسی مفاهیم مهمی همچون نحوه تعریف، فراخوانی و انواع توابع در کاتلین در این بخش از نوشته به متداولترین سوالات در این حوزه پاسخ داده شده است.
منظور از تابع اکستنشن در کاتلین چیست؟
در زبان برنامه نویسی کاتلین امکان افزودن قابلیتهای بیشتر به کلاسهای موجود بدون نیاز به ارثبری از سایر کلاسها وجود دارد. این امکان از طریق افزودن تابع اکستنشن در کاتلین فراهم میشود. تابع اکستنشن کد را خلاصهتر و خواناتر میکند. پیشتر در مطلب زیر از مجله تم آف تابع اکستنشن در کاتلین مورد بررسی قرار گرفته است.
تابع اکستنشن در کاتلین — به زبان ساده
آیا کاتلین نیاز به نصب دارد؟
منظور از نصب کاتلین در واقع نصب کامپایلر مربوط به این زبان برنامه نویسی است. امکان نصب کامپایلر زبان کاتلین و اجرای برنامههای آن از طریق خط فرمان ویندوز وجود دارد. علاوه بر این بسیاری از محیطهای توسعه همچون اندروید استودیو (Android Studio)، Eclipse و IntelliJ IDEA به صورت پیشفرض امکان توسعه برنامههای کاتلین را فراهم کردهاند.
نصب کاتلین – آموزش از صفر تا صد
کاربرد تابع لامبدا در کاتلین چیست؟
«توابع لامبدا» (Lambda Function) ابزاری بسیار قدرتمند در زبان کاتلین هستند که امکان مدلسازی توابع را به روشی آسان فراهم میکنند. این توابع شیوه مختصرتری را برای نوشتن ارائه میدهند. قطعه کد زیر نحوه پیادهسازی تابع لامبدا در کاتلین مربوط به محاسبه مجموع دو عدد را نمایش میدهد.
val sum = {a: Int , b: Int -> a + b}
جمعبندی
امروزه با توجه به بزرگ شدن اندازه برنامهها و پیچیده بودن منطقهای مورد استفاده در پیادهسازی، استفاده از توابع در برنامه نویسی اهمیت بسیار بیشتری نسبت به گذشته پیدا کرده است. منطق کلی و نحوه استفاده از توابع در کاتلین و سایر زبانهای برنامه نویسی تقریباً یکسان است. توابع با هدف تقسیم کد به بخشهای کوچکتر در برنامه تعریف میشوند و ضمن جلوگیری از تکرار کد به خوانایی بیشتر کد نیز کمک میکنند.
بر همین اساس در این نوشته از مجله تم آف ضمن بیان چرایی استفاده از توابع در کاتلین، نحوه تعریف و انواع توابع در این زبان برنامه نویسی مورد بررسی قرار گرفت. علاوه بر این، برای آشنایی بیشتر با نحوه تعریف و فراخوانی توابع در کاتلین چندین مثال به همراه توضیحات کامل ارائه شد.