În mod tradițional, funcțiile de extensie din Kotlin puteau avea un singur receptor (Receiver), de exemplu: fun String.curata(): String. Dacă o funcție avea nevoie concomitent de un context de tranzacție de baze de date, de un context de logare și de un scope de corutine, dezvoltatorii trebuiau să paseze toate aceste obiecte ca parametri expliciți în fiecare apel de metodă:
Facilitatea Context Receivers / Context Parameters revoluționează acest tipar: ea permite declararea dependențelor contextuale prin clauza context(...), oferind acces direct la proprietățile și metodele receptorilor fără a polua lista de argumente a funcției.
interface Jurnalizator {
fun info(mesaj: String)
}
interface TranzactieBazaDate {
fun persista(entitate: String)
}
// Funcția cere ca în scope-ul de apel să existe obligatoriu ambele contexte:
context(Jurnalizator, TranzactieBazaDate)
fun creeazaUtilizatorNou(nume: String, email: String) {
// Avem acces direct la metodele din Jurnalizator și TranzactieBazaDate:
info("Se inițiază crearea utilizatorului: $nume")
persista("UTILIZATOR: $email")
info("Utilizatorul a fost salvat cu succes în baza de date.")
}
// Consumul în aplicație:
class ServiciuAplicatie : Jurnalizator, TranzactieBazaDate {
override fun info(mesaj: String) = println("[LOG] $mesaj")
override fun persista(entitate: String) = println("[DB] Inserat: $entitate")
fun executa() {
// În interiorul acestei clase, ambele contexte sunt active:
creeazaUtilizatorNou("Dexter", "contact@dexblog.ro")
}
}
Aplicație Majoră: Gestiunea Funcțională a Erorilor cu Arrow Raise
În biblioteca Arrow, receptorii de context permit scrierea de cod fără excepții folosind DSL-ul Raise:
context(Raise)
fun parseazaVarsta(text: String): Int {
return text.toIntOrNull() ?: raise(EroareDomeniu.FormatNumericInvalid)
}
Întrebări & Exemple de Cod:
Parametri și Receptori de Context în Kotlin: context(LoggingScope, DbContext)Ai o nelămurire despre utilizarea comenzii
Parametri și Receptori de Context în Kotlin: context(LoggingScope, DbContext)sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.