Parametri și Receptori de Context în Kotlin: context(LoggingScope, DbContext) în Kotlin

Ghid complet pentru noul mecanism de Receptori și Parametri de Context din Kotlin 2.0+: injectarea declarativă a dependențelor de context, eliminarea poluării parametrilor și modelarea erorilor cu Arrow Raise.

Sintaxă
context(logging: LoggingScope, db: DatabaseContext) fun process() | context(Scope)

Î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.

Definirea unei Funcții cu Receptori Multipli de Context
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)
}
Comunitate & Schimb de cunoștințe

Î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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.