Sobes.tech
Senior

Mis on 'context receivers' ja kuidas nad Kotlinis toimivad?

sobes.tech AI

Vastus AI-lt

Konteksti vastuvõtjad — see on eksperimentaalne Kotlin'i võimalus, mis võimaldab funktsioonidel, omadustel või klassidel nõuda teatud tüüpide eksemplaride olemasolu kutsumise kontekstis. See on mehhanism, mis võimaldab varjatult sõltuvusi edasi anda.

Kuidas nad toimivad:

  1. Deklaratsioon: Lisatakse liikme deklaratsioonile kasutades süntaksit context(...) before ....

    // Funktsiooni deklaratsioon, mis nõuab Logger ja Analytics tüüpi kontekste
    context(Logger, Analytics)
    fun processData(data: String) {
        // Võib kasutada Logger ja Analytics ilma otsese edastamiseta
        log("Processing data: $data")
        trackEvent("DataProcessed", mapOf("size" to data.length))
    }
    
    class Logger { fun log(message: String) { println(message) } }
    class Analytics { fun trackEvent(name: String, params: Map<String, Any>) { println("$name: $params") } }
    
  2. Kutse: Funktsiooni kutsumiseks kontekstivõtjad, peavad kutsu kontekstis olema saadaval nõutavate tüüpide eksemplarid. Seda saab saavutada:

    • Selge eksemplaride loomisega.
    • Välise funktsiooni või klassi kontekstivõtjatena olemasoluga.
    • Kasutades with või muid scope'e konteksti pakkumiseks.
    fun main() {
        // Vajalikud kontekstide eksemplarid
        val myLogger = Logger()
        val myAnalytics = Analytics()
    
        // Kontekstide pakkumine `with` abil
        with(myLogger) {
            with(myAnalytics) {
                // Selles kontekstis on saadaval myLogger ja myAnalytics
                processData("some important data")
            }
        }
    }
    
  3. Juurdepääs sees: Sõltuvalt kontekstivõtjatest deklareeritud liikme sees on nende tüüpide eksemplarid otse kättesaadavad, nagu oleksid need tavalised võtjad või muutujad.

Eelised:

  • Vähendab boilerplate'i: Eemaldab vajaduse selgelt edastada ühiseid sõltuvusi funktsioonide parameetrite kaudu.
  • Lugemise parandamine: Võimaldab keskenduda äriloogikale, mitte infrastruktuuri sõltuvustele.
  • Inkapssulatsioon: Selgelt näitab, millised kontekstid on liikmele vajalikud tema ülesande täitmiseks.

Oluline on märkida, et context receivers on endiselt eksperimentaalne funktsioon ja võib muutuda Kotlin'i tulevaste versioonide jooksul.