Sobes.tech
Middle

Ի՞նչ է դիսպետչերիզացիան։

sobes.tech AI

Պատասխան AI-ից

Դիսպետչերիզացիան՝ դա գործընթաց է, որը որոշում է, թե կոնկրետ որ մեթոդը կամ ֆունկցիան կիրականացվի ծրագրի գործարկման ժամանակ:

Swift-ում կան երեք հիմնական դիսպետչերիզացիայի տեսակներ՝

  1. Ստատիկ (Static կամ Direct Dispatch): Ամենահետաքրքիր տեսակն է։ Կոմպիլատորը հստակ գիտի, թե որ մեթոդն է կանչվելու կոմպիլյացիայի ժամանակ։ Չկա լրացուցիչ ծախս մեթոդի որոնման համար։ Կիրառվում է՝

    • կառուցվածքների (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 օգտագործումը կարող է օգնել կոմպիլյատորին կիրառել ստատիկ դիսպետչերիզացիա։