observable ve vetoable Temsilcileri
observable ile özellik değişikliklerine tepki verin, vetoable ile bunları koşullu olarak reddedin.
observable ve vetoable Temsilcileri, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. 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.
Özellik Temsilcilerini Hatırlama
Kotlin özellik temsilcileri, ayrı bir nesnenin getValue ve setValue işleçlerini ele almasını sağlar. Delegates.observable ve Delegates.vetoable, standart kitaplıkta yerleşik temsilcilerdir.
import kotlin.properties.Delegates
var name: String by Delegates.observable("initial") { prop, old, new ->
println("${prop.name}: $old -> $new")
}
fun main() { name = "Alice"; name = "Bob" }observable Sözdizimi
observable, bir başlangıç değeri ve her değişiklikten sonra özellik, eski değer ve yeni değer ile çağrılan bir geri çağırma işlevi alır.
import kotlin.properties.Delegates
var score: Int by Delegates.observable(0) { _, old, new ->
println("Score changed from $old to $new")
}
fun main() {
score = 10
score = 25
score = 0
}Kullanıcı Arayüzü Güncellemelerini Tetikleme
Gözlemlenebilir temsilciler, tam bir LiveData kurulumu olmadan destekleyici özellik değiştiğinde kullanıcı arayüzünün yenilenmesini tetiklemek için harikadır.
import kotlin.properties.Delegates
class ViewModel {
var title: String by Delegates.observable("Loading") { _, _, new ->
println("Render: $new") // pretend this updates UI
}
}
fun main() {
val vm = ViewModel()
vm.title = "Home"
vm.title = "Settings"
}vetoable Sözdizimi
vetoable, atamadan önce bir geri çağırma işlevi çağırır. Geri çağırma işlevi false döndürürse yeni değer reddedilir ve eski değer korunur.
import kotlin.properties.Delegates
var age: Int by Delegates.vetoable(0) { _, old, new ->
new >= 0 // reject negative ages
}
fun main() {
age = 25; println(age) // 25
age = -1; println(age) // 25 (rejected)
age = 30; println(age) // 30
}Doğrulamayı vetoable ile Birleştirme
Harici doğrulama mantığı kullanmadan alan değişmezlerini özellik düzeyinde zorunlu kılmak için vetoable kullanın.
import kotlin.properties.Delegates
var email: String by Delegates.vetoable("") { _, _, new ->
new.contains("@")
}
fun main() {
email = "user@example.com"; println(email) // set
email = "invalid"; println(email) // still previous
}Değişiklikleri observable ile Günlüğe Kaydetme
Denetim günlüğü için observable kullanın: iş mantığına dokunmadan her durum geçişini otomatik olarak kaydedin.
import kotlin.properties.Delegates
val log = mutableListOf<String>()
var status: String by Delegates.observable("IDLE") { _, old, new ->
log.add("$old -> $new")
}
fun main() {
status = "RUNNING"
status = "DONE"
println(log)
}Bir Sınıfta observable
Her iki temsilci de tıpkı diğer özellikler gibi sınıf gövdeleri içinde çalışır.
import kotlin.properties.Delegates
class Counter {
var count: Int by Delegates.observable(0) { _, old, new ->
if (new > old) println("Incremented to $new")
else println("Decremented to $new")
}
}
fun main() {
val c = Counter()
c.count = 5
c.count = 3
}Aralık Kısıtlaması için vetoable
vetoable kullanarak sayısal bir özelliği geçerli bir aralıkla sınırlayın.
import kotlin.properties.Delegates
var volume: Int by Delegates.vetoable(50) { _, _, new ->
new in 0..100
}
fun main() {
volume = 80; println(volume) // 80
volume = 150; println(volume) // 80 (rejected)
volume = 0; println(volume) // 0
}Temsilcileri Zincirleme
Gözlemlenebilir mantığı, arka planda observable çağıran özel bir temsilci yazarak elle birleştirebilir ve her adıma ek mantık katabilirsiniz.
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class LoggedDelegate<T>(initial: T) : ReadWriteProperty<Any?, T> {
private var value: T = initial
override fun getValue(t: Any?, p: KProperty<*>) = value
override fun setValue(t: Any?, p: KProperty<*>, v: T) {
println("Setting ${p.name} = $v"); value = v
}
}
var x: Int by LoggedDelegate(0)
fun main() { x = 10; x = 20 }İş Parçacığı Güvenliği Notu
observable ve vetoable, varsayılan olarak iş parçacığı güvenli değildir. Eşzamanlı erişim için değişiklikleri bir Mutex ile koruyun veya dışarıdan eşzamanlayın.
import kotlin.properties.Delegates
// Not thread-safe as-is:
var sharedState: String by Delegates.observable("start") { _, old, new ->
println("$old -> $new")
}
// In coroutines, wrap access with Mutex if neededUygulamalı Kalıp: Form Doğrulama
Bildirime dayalı form doğrulaması için her alan başına vetoable kullanın: her alan, atama sırasında kendini doğrular.
import kotlin.properties.Delegates
data class Form(
var username: String = "",
var password: String = ""
) {
var validUsername: String by Delegates.vetoable("") { _,_,v -> v.length >= 3 }
var validPassword: String by Delegates.vetoable("") { _,_,v -> v.length >= 8 }
}
fun main() {
val f = Form()
f.validUsername = "ab"; println(f.validUsername) // ""
f.validUsername = "alice"; println(f.validUsername) // "alice"
f.validPassword = "short"; println(f.validPassword) // ""
f.validPassword = "secure123";println(f.validPassword) // "secure123"
}Hızlı Kontrol
vetoable, geri çağırma işlevini ne zaman çağırır?
Özet
observable, her değişiklikten sonra bildirim gönderir; vetoable, atamadan önce çalışır ve yeni değeri reddedebilir. Her ikisi de harici kitaplıklar olmadan günlük kaydı, doğrulama ve tepkisel özellik kalıpları için harikadır.
Sıkça Sorulan Sorular
“observable ve vetoable Temsilcileri” dersi ücretsiz mi?
Evet — “observable ve vetoable Temsilcileri” 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.
“observable ve vetoable Temsilcileri” dersinde ne öğreneceğim?
observable ile özellik değişikliklerine tepki verin, vetoable ile bunları koşullu olarak reddedin. 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 2. dersidir.
“observable ve vetoable Temsilcileri” 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
- by lazy: Ertelenmiş Başlatmaya Derinlemesine Bakış
- observable ve vetoable Temsilcileri
- Özel ReadWriteProperty Temsilcisi Yazma
- Tercihler, Map Destekli Özellikler ve Günlükleme için Temsilciler