Sobes.tech
Middle

Kas yra dispečerizacija?

sobes.tech AI

Atsakymas iš AI

Dispečerisacija yra procesas, kuriuo nustatoma, kuri konkreti metodas ar funkcija bus vykdoma programos vykdymo metu.

Swift turi tris pagrindinius dispečerio tipus:

  1. Statinė (Static arba Direct Dispatch): Patikimiausias ir greičiausias. Kompiliatorius tiksliai žino, kuris metodas bus iškviestas kompiliacijos metu. Nėra papildomų išlaidų metodo paieškai. Naudojama:

    • Struktūroms (struct)
    • Enum-ams
    • Klasėms, pažymėtoms kaip final arba private (jei nėra @objc ir nenaudojama dinaminė dispečerinė per Objective-C runtime)
    • Globalios ir statinės funkcijos
    • Plėtiniai (extension)
  2. Lentelės (Table Dispatch): Naudojama klasėms. Kiekvienai klasei sukuriama virtuali lentelė (vtable), kurioje yra nuorodos į metodų įgyvendinimus. Kviečiant metodą, ieškoma nuoroda lentelėje. Maži išlaidos. Naudojama:

    • Klasės instancijų metodams (class methods), kurie nėra pažymėti kaip final arba private
    • Skaičiuojamoms savybėms (computed properties)
    class Animal {
        func speak() { // Lentelės dispečeris
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Perrašytas metodas, taip pat lentelės dispečeris
            print("Woof")
        }
    }
    
  3. Dinaminė (Dynamic Dispatch): Lėčiausia. Metodas sprendžiamas vykdymo metu per Objective-C runtime. Naudojama sąveikai su Objective-C. Reikalauja didelių išlaidų. Naudojama:

    • Pažymėti kaip @objc dynamic metodai
    • Pažymėtos kaip @objc dynamic savybės
    • KVO (Key-Value Observing)
    • KVC (Key-Value Coding)
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dinaminė dispečeris
            print("Performing action")
        }
    }
    

Apibendrinama lentelė:

Tipas Greitis Išlaidos Kur naudojama
Statinė Aukšta Žema Struct, Enum, final/private metodai klasėse, extension
Lentelės Vidutinė Vidutinės Klasės metodai (ne final/private)
Dinaminė Žema Aukštos @objc dynamic

Pasirinkimas dispečerio tipui yra svarbus našumo optimizavimui. Swift pagal numatytuosius nustatymus pasirenka efektyviausią tipą, leidžiantį išlaikyti polimorfizmo lankstumą ten, kur to reikia (naudojant lentelės dispečerių klasėms). final arba private naudojimas gali padėti kompiliatoriui taikyti statinę dispečerinę.