Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

معدِّلات الرؤية

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 8 من 57.

التغليف يعني أن الفئة تتحكم في كيفية استخدام بياناتها. تحدد معدِّلات مستوى الرؤية من يمكنه رؤية أحد الأعضاء. يخفيه private عن كل ما هو خارج الفئة، لذا تكون أساليب الفئة نفسها هي الطريقة الوحيدة للوصول إليه:

class Account {
    private var balance = 0

    fun deposit(amount: Int) {
        if (amount > 0) balance += amount
    }

    fun report() = "balance: $balance"
}

داخل main:

val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000    // خطأ: لا يمكن الوصول إلى 'balance': إنه private

الناتج:

balance: 50

لدى Kotlin أربعة مُعدِّلات. من دون أحدها يكون التصريح public، ومرئيًا في كل مكان:

public      // افتراضي: مرئي في كل مكان
internal    // مرئي في نفس الوحدة (تطبيق أو مكتبة)
protected   // مرئي في الصنف وأصنافه الفرعية
private     // مرئي داخل الصنف (أو الملف، للإعلانات على المستوى الأعلى)

تحافظ الدوال المساعدة الخاصة على صِغر الواجهة العامة. يرى المستدعون ما تفعله الفئة، وليس كيف تفعله:

class Password(private val text: String) {
    val isStrong: Boolean
        get() = hasDigit() && text.length >= 8

    private fun hasDigit() = text.any { it.isDigit() }
}

داخل main:

println(Password("secret123").isStrong)
println(Password("short1").isStrong)

الناتج:

true
false

تأخذ خصائص المُنشئ معدِّلات أيضًا: يخزّن private val قيمةً لا يمكن للكود الخارجي قراءتها. إن إخفاء البيانات هو ما يتيح للفئة التحقق من كل تغيير والحفاظ على قواعدها:

class Locker(private val code: String) {
    private val items = mutableListOf<String>()
    fun store(item: String, code: String): Boolean {
        if (code != this.code) return false
        items.add(item)
        return true
    }
}
challenge icon

التحدي

سهل

أكمل الصنف Locker(private val code: String). قائمته items خاصة. تضيف store(item, code) العنصر فقط عندما يتطابق الرمز، وتُرجع ما إذا كانت الإضافة قد تمت؛ وتُرجع open(code) العناصر مفصولة باستخدام , (أو empty) عندما يتطابق الرمز، وتُرجع wrong code خلاف ذلك.

يقرأ الكود المتوفَّر رمز الخزانة، ثم الأوامر put <code> <item> أو open <code>. ويطبع stored أو denied لكل أمر put، ونتيجة كل أمر open.

يجب وضع كودك في Locker.kt. يحتوي Main.kt على كود الإدخال/الإخراج المتوفَّر، ولا يمكن تعديله.

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    val input = generateSequence(::readLine).toList()
    val locker = Locker(input[0])
    for (cmd in input.drop(1)) {
        val p = cmd.split(" ")
        if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
        else println(locker.open(p[1]))
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin