Kotlin Academy · Ders

Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler

Temsilcileri SharedPreferences, Map depolama alanı ve denetim günlüklemesine uygulayın.

4. ders / 413 adım

Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Eşleme Destekli Özellikler

Kotlin, özellikleri doğrudan bir Map'e delege etmenize olanak tanır. Özelliğin okunması, eşleme içinde adının aranmasını sağlar.

class User(map: Map<String, Any?>) {
    val name: String by map
    val age: Int by map
}
fun main() {
    val u = User(mapOf("name" to "Alice", "age" to 30))
    println(u.name) // Alice
    println(u.age)  // 30
}

MutableMap Delegate Kalıbı

Değiştirilebilir özellikler için bir MutableMap'e delege edin; yapılan değişiklikler temel eşlemeyi günceller.

class Settings(private val map: MutableMap<String, Any?> = mutableMapOf()) {
    var theme: String by map
    var fontSize: Int by map
}
fun main() {
    val s = Settings()
    s.theme = "dark"
    s.fontSize = 16
    println(s.theme)    // dark
    println(s.fontSize) // 16
}

Eşleme Delegate ile JSON Serileştirmesini Çözme

JSON benzeri bir eşlemeyi ayrıştırın ve alanlarını eşleme delegasyonu kullanarak türü belirli özellikler olarak sunun — dinamik veriler için idealdir.

class ApiResponse(data: Map<String, Any?>) {
    val id: Int by data
    val title: String by data
    val published: Boolean by data
}
fun main() {
    val response = ApiResponse(mapOf("id" to 1, "title" to "Kotlin Rocks", "published" to true))
    println(response.title)     // Kotlin Rocks
    println(response.published) // true
}

Günlükleme için Delegate Kalıbı

Her delege edilmiş özellikteki tüm okuma ve yazma işlemlerini şeffaf biçimde izlemek için herhangi bir delegeyi günlükleme ile sarmalayın.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class Logged<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(t: Any?, p: KProperty<*>): T {
        println("[READ]  ${p.name} = $v"); return v
    }
    override fun setValue(t: Any?, p: KProperty<*>, value: T) {
        println("[WRITE] ${p.name}: $v -> $value"); v = value
    }
}
var config: String by Logged("default")
fun main() { println(config); config = "production" }

Eşleme + Günlüklemeyi Birleştirme

Dinamik özellik erişimini eksiksiz biçimde denetlenebilir kılmak için eşleme delegasyonunun çevresine bir günlükleme sarmalayıcısı katmanı ekleyin.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class TrackedMap(private val map: MutableMap<String,Any?> = mutableMapOf()) {
    inner class Delegate<T> : ReadWriteProperty<Any?,T> {
        @Suppress("UNCHECKED_CAST")
        override fun getValue(t:Any?,p:KProperty<*>): T {
            val v = map[p.name] as T; println("read ${p.name}=$v"); return v
        }
        override fun setValue(t:Any?,p:KProperty<*>,value:T) {
            println("write ${p.name}=$value"); map[p.name]=value
        }
    }
    var host: String by Delegate()
}
fun main() { val m=TrackedMap(); m.host="localhost"; println(m.host) }

SharedPreferences Tarzı Delegate

Değerleri SharedPreferences'ı taklit eden temel bir eşlemede depolayan bir delege kullanın — eşlemeyi gerçek tercihler çağrılarıyla değiştirerek gerçek Android tercihlerine uyarlayabilirsiniz.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val prefs = mutableMapOf<String, Any?>()
fun <T> pref(default: T): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t: Any?, p: KProperty<*>): T = prefs.getOrDefault(p.name, default) as T
    override fun setValue(t: Any?, p: KProperty<*>, value: T) { prefs[p.name] = value }
}
object UserPrefs {
    var username: String by pref("Guest")
    var isDarkMode: Boolean by pref(false)
}
fun main() {
    println(UserPrefs.username)   // Guest
    UserPrefs.username = "Alice"
    println(UserPrefs.username)   // Alice
}

Türü Belirli Tercih Yardımcıları

Daha temiz çağrı noktaları için her ilkel tercih türüne yönelik türü belirli yardımcı işlevler oluşturun.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val store = mutableMapOf<String,Any?>()
fun stringPref(default: String) = object : ReadWriteProperty<Any?,String> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as String
    override fun setValue(t:Any?,p:KProperty<*>,v:String) { store[p.name]=v }
}
fun intPref(default: Int) = object : ReadWriteProperty<Any?,Int> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as Int
    override fun setValue(t:Any?,p:KProperty<*>,v:Int) { store[p.name]=v }
}
object Prefs {
    var name: String by stringPref("default")
    var count: Int by intPref(0)
}
fun main() { Prefs.name="Bob"; Prefs.count=5; println("${Prefs.name}: ${Prefs.count}") }

Denetim Günlüğü Delegate

Uyumluluk veya hata ayıklama senaryoları için her özellik değişikliğini zaman damgasıyla birlikte bir denetim listesine kaydedin.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val audit = mutableListOf<String>()
class AuditDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(t:Any?,p:KProperty<*>) = v
    override fun setValue(t:Any?,p:KProperty<*>,value:T) {
        audit += "[${System.currentTimeMillis()}] ${p.name}: $v -> $value"
        v = value
    }
}
var price: Double by AuditDelegate(9.99)
fun main() {
    price = 12.99
    price = 11.49
    audit.forEach(::println)
}

Doğrulama + Eşleme Depolaması

Eşleme depolamasını doğrulamayla birleştirin: Geçersiz değerleri eşlemeye yazmadan önce reddedin.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val data = mutableMapOf<String, Any?>()
fun positiveInt(default: Int): ReadWriteProperty<Any?,Int> = object : ReadWriteProperty<Any?,Int> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>)=data.getOrDefault(p.name,default) as Int
    override fun setValue(t:Any?,p:KProperty<*>,v:Int){
        require(v>=0){"${p.name} must be >= 0"}
        data[p.name]=v
    }
}
object Inventory { var stock: Int by positiveInt(100) }
fun main(){
    Inventory.stock=50; println(Inventory.stock)
    try { Inventory.stock=-1 } catch(e:Exception){ println(e.message) }
}

Delegate Birleştirme Kalıbı

Bir oluşturucu tarzı API kullanarak birden çok delege davranışını birleştirin: Temel bir delegeyle başlayıp günlükleme, doğrulama veya önbelleğe alma katmanları ekleyin.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
fun <T> ReadWriteProperty<Any?,T>.withLogging(): ReadWriteProperty<Any?,T> {
    val base = this
    return object : ReadWriteProperty<Any?,T> {
        override fun getValue(t:Any?,p:KProperty<*>): T {
            val v = base.getValue(t,p); println("get ${p.name}=$v"); return v
        }
        override fun setValue(t:Any?,p:KProperty<*>,v:T){
            println("set ${p.name}=$v"); base.setValue(t,p,v)
        }
    }
}

Gerçek Dünya: Yapılandırma Nesnesi Kalıbı

Ortam değişkenleri veya bir JSON yapılandırma dosyası gibi harici kaynaklardan bir yapılandırma nesnesi oluşturmak için eşleme delegasyonunu kullanın.

class AppConfig(private val raw: Map<String, Any?>) {
    val host: String by raw
    val port: Int by raw
    val debug: Boolean by raw
}
fun main() {
    val env = mapOf("host" to "0.0.0.0", "port" to 8080, "debug" to true)
    val cfg = AppConfig(env)
    println("${cfg.host}:${cfg.port} debug=${cfg.debug}")
}

Kısa Kontrol

Bir özelliği bir Map'e delege ettiğinizde ne olur?

Özet

Delegeler güçlü kalıpların önünü açar: Dinamik/JSON verileri için eşleme delegasyonu, SharedPreferences tarzı kalıcılık, uyumluluk için denetim günlüğü ve birleştirilebilir doğrulama — bunların tümü çağrı noktalarını değiştirmeden kullanılabilir.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersi ücretsiz mi?

Evet — “Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersinde ne öğreneceğim?

Temsilcileri SharedPreferences, Map depolama alanı ve denetim günlüklemesine uygulayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. by lazy: Ertelenmiş Başlatmaya Derinlemesine Bakış
  2. observable ve vetoable Temsilcileri
  3. Özel ReadWriteProperty Temsilcisi Yazma
  4. Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler
← Kotlin Academy Sayfasına Dön