9

کلاس، آبجکت و Data Class؛ ساخت آدمک‌های کدی

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

درس 9 از 20

کلاس ساده

کلاس قالب ساخت آبجکته. مثل قالب شیرینی؛ هر آبجکت یه شیرینی جداست، فقط امیدواریم نسوزه.

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

class
class User(val name: String, var age: Int) {
    fun introduce() {
        println("من $name هستم و $age سالمه")
    }
}

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

Data class برای مدل داده

وقتی کلاس فقط برای نگهداری داده‌ست، `data class` بزن. خودش `toString`, `equals`, `copy` و چندتا چیز خوشگل دیگه رو می‌سازه. یعنی کاتلین می‌گه تو بشین چایی بخور، این کارهای تکراری با من.

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

data class
data class Product(
    val id: Int,
    val title: String,
    val price: Int
)

fun main() {
    val keyboard = Product(1, "Keyboard", 200)
    val cheaper = keyboard.copy(price = 150)
    println(cheaper)
}
خروجی یا نتیجه اجرا
Product(id=1, title=Keyboard, price=150)
نکته کاربردی: اینجا باید به رفتار کد نگاه کنی، نه فقط ظاهرش. مقدارها را عوض کن و دوباره اجرا بگیر تا دستت بفهمد برنامه چطور واکنش نشان می‌دهد. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

object برای Singleton

اگر فقط یک نمونه از چیزی لازم داری، `object` عالیه؛ مثلاً تنظیمات برنامه یا Logger. البته همه‌چی رو singleton نکن؛ دنیا به اندازه کافی شلوغه.

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

object
object AppConfig {
    const val appName = "DiCode"
}

fun main() {
    println(AppConfig.appName)
}
خروجی یا نتیجه اجرا
DiCode
نکته کاربردی: این الگو در پروژه واقعی زیاد تکرار می‌شود. از همین حالا تمیز و خوانا بنویس تا بعداً موقع دیباگ، خودت به خودت فحش ندهی. اگر خروجی با چیزی که انتظار داشتی فرق کرد، اول مقدار متغیرها و مسیر اجرا را چک کن؛ ۹۰٪ باگ‌های اول راه همین‌جا قایم شده‌اند.

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

کلاس‌ها مدل ذهنی برنامه‌ات را می‌سازند. data class برای داده عالی است، object برای singleton تمیز است، و کلاس معمولی برای رفتار و وضعیت کنار هم.

تمرین! 🧠

یک data class برای Article بساز که title، category و views داشته باشد، بعد یک نمونه بساز و چاپ کن.

جواب تمرین
data class Article(
    val title: String,
    val category: String,
    val views: Int
)

fun main() {
    val article = Article("آموزش Kotlin", "برنامه‌نویسی", 1200)
    println(article)
}
خروجی جواب
Article(title=آموزش Kotlin, category=برنامه‌نویسی, views=1200)