Sobes.tech
Middle

რა არის დისპეტჩერიზაცია?

sobes.tech AI

პასუხი AI-სგან

დისპეტჩერიზაცია — ეს არის პროცესი, რომელიც განსაზღვრავს, რომელი კონკრეტული მეთოდი ან ფუნქცია შესრულდება პროგრამის შესრულების დროს.

Swift-ში არსებობს სამი ძირითადი ტიპის დისპეტჩერიზაცია:

  1. სტატიკური (Static ან პირდაპირი დისპეტჩერიზაცია): ყველაზე სწრაფი ტიპია. კომპილატორი ზუსტად იცის, რომელი მეთოდი იქნება გამოძახებული კომპილაციის დროს. არ არსებობს დამატებითი ხარჯები მეთოდის ძებნისთვის. გამოიყენება:

    • სტრუქტურებზე (struct)
    • enum-ებზე
    • კლასებზე, რომლებიც მონიშნულია როგორც final ან private (თუ @objc არ არის გამოყენებული და დინამიური დისპეტჩერიზაცია არ არის გამოყენებული Objective-C runtime-ის საშუალებით)
    • გლობალურ და სტატიკურ ფუნქციებზე
    • გაფართოებებზე (extension)
  2. ცხრილოვანი (Table Dispatch): გამოიყენება კლასებისთვის. თითოეულ კლასზე ქმნიან ვირტუალურ ცხრილს (vtable), რომელიც შეიცავს მეთოდების რეალიზაციების მითითებებს. მეთოდის გამოძახებისას ეძებს მითითებას ცხრილში. მცირე ხარჯები აქვს. გამოიყენება:

    • კლასის ინстанციის მეთოდებზე (class methods), რომლებიც არ არის მონიშნული როგორც final ან private
    • გამოთვლადი თვისებებზე (computed properties)
    class Animal {
        func speak() { // ცხრილოვანი დისპეტჩერიზაცია
            print("...")
        }
    }
    
    class Dog: Animal {
        override func speak() { // გადაფარებული მეთოდი, ასევე ცხრილოვანი დისპეტჩერიზაცია
            print("Woof")
        }
    }
    
  3. დინამიური (Dynamic Dispatch): ყველაზე ნელი. მეთოდის გადაწყვეტილება ხდება შესრულების დროს Objective-C runtime-ის საშუალებით. გამოიყენება Objective-C-ისთან ინტერკაციისთვის. აქვს მნიშვნელოვანი ხარჯები. გამოიყენება:

    • @objc dynamic ნიშნულით მონიშნული მეთოდებისთვის
    • @objc dynamic ნიშნულით მონიშნული თვისებებისთვის
    • KVO (Key-Value Observing)
    • KVC (Key-Value Coding)
    class SomeClass: NSObject {
        @objc dynamic func performAction() { // დინამიური დისპეტჩერიზაცია
            print("Performing action")
        }
    }
    

საერთო სქემა:

ტიპი სიჩქარე ხარჯები სად გამოიყენება
სტატიკური მაღალი დაბალი Struct, Enum, final/private მეთოდები კლასებზე, extension
ცხრილოვანი საშუალო საშუალო კლასის ინстанციის მეთოდები (არა final/private)
დინამიური დაბალი მაღალი @objc dynamic

ტიპის არჩევა დისპეტჩერიზაციის მნიშვნელოვანია შესრულების ოპტიმიზაციისთვის. Swift-ის დეფოლტად არჩევს ყველაზე ეფექტიან ტიპს, რომელიც საშუალებას აძლევს შეინარჩუნოს პოლიმორფიზმის მოქნილობა, სადაც ეს საჭიროა (გამოყენებით ცხრილოვან დისპეტჩერიზაციას კლასებისთვის). final ან private გამოყენება შეიძლება დაეხმაროს კომპილატორს სტატიკური დისპეტჩერიზაციის გამოყენებაში.