Sobes.tech
Middle

Mis on dispetcherimine?

sobes.tech AI

Vastus AI-lt

Distsipčerimine on protsess, mille käigus määratakse, milline konkreetne meetod või funktsioon täidetakse programmi käivitamise ajal.

Swiftis on kolm peamist distsipčerimise tüüpi:

  1. Statiline (Static või Direct Dispatch): Kõige kiirem tüüp. Kompilaator teab täpselt, milline meetod kutsutakse välja kompileerimise ajal. Ei ole lisakulusid meetodi otsimiseks. Kasutatakse:

    • Struktuuridele (struct)
    • Enum-idele
    • Klassidele, millele on märgitud final või private (kui @objc ei ole kasutusel ja ei kasutata dünaamilist distsipčerimist Objective-C runtime kaudu)
    • Globaalsetele ja statilistele funktsioonidele
    • Laiendustele (extension)
  2. Tabelipõhine (Table Dispatch): Kasutatakse klassidele. Iga klassi jaoks luuakse virtuaalne tabel (vtable), mis sisaldab meetodite teostuste viiteid. Meetodi väljakutse ajal otsitakse viidet tabelist. Sellel on väikesed kulud. Kasutatakse:

    • Klasside eksemplarmeetoditele (class methods), mis ei ole märgitud final või private
    • Arvutatud omadustele (computed properties)
    class Animal {
        func speak() { // Tabelipõhine distsipčerimine
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // Ülekirjutatud meetod, samuti tabelipõhine distsipčerimine
            print("Woof")
        }
    }
    
  3. Dünaamiline (Dynamic Dispatch): Kõige aeglasem. Meetodi otsus tehakse jooksvalt Objective-C runtime kaudu. Kasutatakse Objective-C-ga suhtlemiseks. Sellel on märkimisväärsed kulud. Kasutatakse:

    • @objc dynamic märgitud meetoditele
    • @objc dynamic märgitud omadustele
    • KVO (Key-Value Observing)
    • KVC (Key-Value Coding)
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // Dünaamiline distsipčerimine
            print("Performing action")
        }
    }
    

Kokkuvõtte tabel:

Tüüp Kiirus Kulud Kus kasutatakse
Statiline Kõrge Madal Struct, Enum, final või private meetodid klassides, extension
Tabelipõhine Keskmine Keskmine Klasside eksemplarmeetodid (mitte final või private)
Dünaamiline Madal Kõrged @objc dynamic

Tüübi valik distsipčerimise jaoks on oluline jõudluse optimeerimiseks. Swift valib vaikimisi kõige tõhusama tüübi, mis võimaldab säilitada polümorfismi paindlikkust seal, kus see on vajalik (kasutades tabelipõhist distsipčerimist klassidele). final või private kasutamine võib aidata kompilaatoril rakendada statilist distsipčerimist.