Menu
Coddy logo textTech

משני נראות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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': הוא פרטי

פלט:

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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין