Sobes.tech
Senior

Kas yra 'context receivers' ir kaip jie veikia Kotlin?

sobes.tech AI

Atsakymas iš AI

Konteksto priimėjai — tai eksperimentinė Kotlin galimybė, leidžianti funkcijoms, savybėms ar klasėms reikalauti tam tikrų tipų egzempliorių buvimo iškvietimo srityje. Tai mechanizmas, leidžiantis netiesiogiai perduoti priklausomybes.

Kaip jie veikia:

  1. Deklaravimas: Pridedama prie nario deklaracijos naudojant sintaksę context(...) before ....

    // Funkcijos, kuri reikalauja Logger ir Analytics tipo kontekstų, deklaravimas
    context(Logger, Analytics)
    fun processData(data: String) {
        // Gali naudoti Logger ir Analytics be aiškaus perdavimo
        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. Paskambinimas: Norint iškviesti funkciją su kontekstiniais priimančiais, iškvietimo srityje turi būti prieinami reikiamų tipų egzemplioriai. Tai galima pasiekti keliais būdais:

    • Aiškiai sukuriant egzempliorius.
    • Egzempliorių buvimas kaip išorinės funkcijos ar klasės kontekstiniai priimančiosios.
    • Naudojant with ar kitus scope'us konteksto suteikimui.
    fun main() {
        // Sukuriame būtinus kontekstų egzempliorius
        val myLogger = Logger()
        val myAnalytics = Analytics()
    
        // Suteikiame kontekstus naudojant `with`
        with(myLogger) {
            with(myAnalytics) {
                // Šioje srityje prieinami myLogger ir myAnalytics kaip kontekstai
                processData("some important data")
            }
        }
    }
    
  3. Prieiga viduje: Viduje nario, paskelbto su kontekstiniais priimančiais, šių tipų egzemplioriai yra tiesiogiai prieinami, tarsi jie būtų įprasti priimančiosios ar kintamieji srityje.

Privalumai:

  • Mažesnis boilerplate: Pašalina poreikį aiškiai perduoti bendras priklausomybes per funkcijų parametrus.
  • Skaitymo gerinimas: Leidžia sutelkti dėmesį į verslo logiką, o ne į infrastruktūros priklausomybių perdavimą.
  • Inkapsculiacija: Aiškiai nurodo, kokie kontekstai yra reikalingi nariui savo užduočiai atlikti.

Svarbu pažymėti, kad context receivers vis dar yra eksperimentinė funkcija ir gali keistis būsimose Kotlin versijose.