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

تعبيرات الكائنات

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

ينشئ تعبير الكائن كائنًا لمرة واحدة من فئة غير مُسمّاة، في المكان الذي تكون هناك حاجة إليه فيه. وتتم كتابته بالشكل object : Type { ... }، وعادةً ما ينفّذ واجهة. تسرد الواجهة الأساليب دون توضيح كيفية عملها؛ ويتناول الفصل 5 الواجهات بالتفصيل:

interface Greeter {
    fun greet(name: String): String
}

داخل main:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

الناتج:

Good morning, Ada.

يُوجد تصريح الكائن مرة واحدة. ويُقيَّم تعبير الكائن في كل مرة تُنفَّذ فيها شفرته، وينشئ كل تنفيذ كائنًا جديدًا. ويمكنه قراءة المتغيرات المحلية المحيطة به وتغييرها:

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

داخل main:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

الناتج:

10 11 1

من الاستخدامات الشائعة تمرير سلوك إلى دالة مكتبة. تأخذ sortedWith كائنًا من نوع Comparator، وهي واجهة تُرجع طريقتها compare(a, b) عددًا سالبًا عندما يأتي a أولًا، وصفرًا عند التعادل، وعددًا موجبًا خلاف ذلك:

داخل main:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

الناتج:

[fig, kiwi, apple, banana]

يُجمّع تعبير الكائن من دون نوع فائق بعض القيم في كائن محلي؛ ويمكن استخدام خصائصه داخل الدالة نفسها. عندما تكون للواجهة طريقة واحدة، يكون تعبير lambda غالبًا أقصر من تعبير الكائن. تناسب تعبيرات الكائن الحالات التي توجد فيها عدة طرق أو بعض الحالة التي يجب الاحتفاظ بها.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // شكل لامدا
challenge icon

التحدي

سهل

تحتوي الواجهة Validator على طريقة واحدة، وهي check(text)، التي تُرجع رسالة خطأ أو null عندما يجتاز النص الاختبار. أكمل الدالة rules(minLength) بحيث تُرجع ثلاثة مُحقِّقات مُنشأة باستخدام تعبيرات الكائنات، بالترتيب التالي: يجب أن يحتوي النص على minLength حرفًا على الأقل (too short)، وأن يحتوي على رقم (needs a digit)، وألا يحتوي على مسافات (no spaces allowed).

يقرأ الكود المُزوَّد الحد الأدنى للطول، ثم كلمة مرور واحدة في كل سطر. ويطبع ok، أو كل رسالة خطأ تخص كلمة المرور، مع ضمّها باستخدام ; .

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

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    val input = generateSequence(::readLine).toList()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
quiz iconاختبر نفسك

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

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

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