13

Package، Import، Exception و فایل؛ نظم پروژه واقعی

کد واقعی فقط چند خط فان نیست؛ باید پوشه‌بندی، خطا و فایل هم بلد باشی.

درس 13 از 20

Package و Import

پکیج‌ها برای مرتب کردن کدن. اگر همه‌چی رو بریزی تو یه فایل، پروژه‌ات می‌شه انباری آخر سال؛ پیدا کردن یک چیز هم مصیبت.

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

package/import
package ir.dicode.app

import kotlin.math.max

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

مدیریت خطا

با `try-catch` جلوی ترکیدن برنامه رو می‌گیری. خطا رو قایم نکن؛ هندل کن. برنامه حرفه‌ای وقتی مشکل می‌بینه، با شخصیت برخورد می‌کنه.

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

try-catch
fun main() {
    print("عدد بده: ")
    val number = try {
        readln().toInt()
    } catch (e: NumberFormatException) {
        0
    }

    println("عدد نهایی: $number")
}
خروجی یا نتیجه اجرا
عدد بده: abc
عدد نهایی: 0
نکته کاربردی: اینجا باید به رفتار کد نگاه کنی، نه فقط ظاهرش. مقدارها را عوض کن و دوباره اجرا بگیر تا دستت بفهمد برنامه چطور واکنش نشان می‌دهد. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

require و check

برای اعتبارسنجی ورودی از `require` و برای وضعیت داخلی از `check` استفاده کن. اینا مثل نگهبان در ورودی‌ان؛ ورودی خراب رو نذار داخل مهمونی.

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

validation
fun setAge(age: Int) {
    require(age >= 0) { "سن نمی‌تونه منفی باشه" }
    println("سن ثبت شد: $age")
}
خروجی یا نتیجه اجرا
اگر setAge(20) اجرا شود:
سن ثبت شد: 20
اگر عدد منفی بدهی، برنامه با پیام مشخص خطا می‌دهد.
نکته کاربردی: این الگو در پروژه واقعی زیاد تکرار می‌شود. از همین حالا تمیز و خوانا بنویس تا بعداً موقع دیباگ، خودت به خودت فحش ندهی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

فایل‌خوانی ساده

روی JVM می‌تونی با `java.io.File` فایل بخونی و بنویسی. برای پروژه جدی‌تر باید مسیر و خطاها رو درست مدیریت کنی.

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

File
import java.io.File

fun main() {
    val file = File("notes.txt")
    file.writeText("سلام از کاتلین")
    println(file.readText())
}
خروجی یا نتیجه اجرا
سلام از کاتلین
نکته کاربردی: نکته حرفه‌ای این است که Kotlin معمولاً راه کوتاه‌تر دارد، ولی کوتاه‌تر همیشه بهتر نیست. اول خوانایی، بعد زرنگ‌بازی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

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

پروژه واقعی بدون package، import، مدیریت خطا و فایل مثل مغازه بدون قفسه است. این درس نظم و امنیت اجرای برنامه را وارد بازی کرد.

تمرین! 🧠

تابعی بنویس که اگر سن منفی بود خطا بده وگرنه پیام تأیید چاپ کند.

جواب تمرین
fun validateAge(age: Int) {
    require(age >= 0) { "سن منفی؟ داداش داریم انسان ثبت می‌کنیم نه عدد بدهی!" }
    println("سن معتبره: $age")
}

fun main() {
    validateAge(21)
}
خروجی جواب
سن معتبره: 21