6

تابع‌ها؛ کارگرهای مرتب و قابل اعتماد

هر کاری رو هی تکرار نکن؛ تابع بساز، صداش بزن، بقیه‌ش با اون.

درس 6 از 20

تابع ساده

تابع یعنی یه بسته‌ی کوچک از منطق. اسم خوب براش بذار تا وقتی سه ماه بعد برگشتی، نفهمی خودت با خودت چی کار کردی.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

تعریف تابع
fun greet(name: String) {
    println("سلام $name، خوش اومدی!")
}

fun main() {
    greet("سارا")
}
خروجی یا نتیجه اجرا
سلام سارا، خوش اومدی!
نکته کاربردی: این بخش اسکلت ذهنی درس را می‌سازد. وقتی بدانی این قطعه دقیقاً چه مسئله‌ای را حل می‌کند، بعداً موقع پروژه فقط syntax حفظی تحویل نمی‌دهی؛ تصمیم درست می‌گیری. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

تابع با خروجی

اگر تابع باید نتیجه بده، نوع خروجی رو بعد از پرانتز می‌نویسی. برای تابع‌های کوتاه می‌تونی expression body بزنی؛ تمیز مثل ماشین تازه کارواش رفته.

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

return و expression body
fun sum(a: Int, b: Int): Int {
    return a + b
}

fun multiply(a: Int, b: Int) = a * b
خروجی یا نتیجه اجرا
خروجی مستقیم ندارد؛ اما sum(2, 3) مقدار 5 و multiply(2, 3) مقدار 6 برمی‌گرداند.
نکته کاربردی: اینجا باید به رفتار کد نگاه کنی، نه فقط ظاهرش. مقدارها را عوض کن و دوباره اجرا بگیر تا دستت بفهمد برنامه چطور واکنش نشان می‌دهد. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

پارامتر پیش‌فرض و نام‌دار

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

مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامه‌نویسی با نگاه کردن یاد گرفته نمی‌شود، با خراب کردن و درست کردن جا می‌افتد.

default و named arguments
fun createUser(name: String, role: String = "user", active: Boolean = true) {
    println("$name / $role / $active")
}

fun main() {
    createUser(name = "مهدی", active = false)
}
خروجی یا نتیجه اجرا
مهدی / user / false
نکته کاربردی: این الگو در پروژه واقعی زیاد تکرار می‌شود. از همین حالا تمیز و خوانا بنویس تا بعداً موقع دیباگ، خودت به خودت فحش ندهی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

نتیجه این درس 🎯

تابع یعنی یک کار مشخص را بسته‌بندی کنی و هرجا لازم شد صدا بزنی. از اینجا به بعد باید به جای کد تکراری، تابع تمیز بسازی.

تمرین! 🧠

تابعی بنویس که قیمت و درصد تخفیف را بگیرد و قیمت نهایی را برگرداند.

جواب تمرین
fun finalPrice(price: Double, discountPercent: Double): Double {
    val discount = price * discountPercent / 100
    return price - discount
}

fun main() {
    println(finalPrice(500000.0, 20.0))
}
خروجی جواب
400000.0