Sobes.tech
Middle

რა განსხვავებაა დამოკიდებულების ინვერსიასა და დამოკიდებულების ინექციას შორის?

sobes.tech AI

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

დამოკიდებულების ინვერსია (Dependency Inversion Principle) — ეს SOLID-ის ერთ-ერთი პრინციპია, რომელიც ამბობს:

  1. მაღალ დონეზე მოდულები არ უნდა იყვნენ დამოკიდებული დაბალ დონეზე მოდულებზე. ორივე უნდა იყოს დამოკიდებული აბსტრაქციებზე.
  2. აბსტრაქციები არ უნდა იყვნენ დამოკიდებული დეტალებზე, დეტალები უნდა იყვნენ დამოკიდებული აბსტრაქციებზე.

დამოკიდებულების ჩართვა (Dependency Injection, DI) — ეს არის პროექტირების ნიმუში, ერთ-ერთი მეთოდი ინვერტირების დამოკიდებულების რეალიზაციისთვის. იგი გულისხმობს დამოკიდებულებების (ობიექტების, რომელზე დამოკიდებულია ამ კლასი) გადაცემას გარედან, ნაცვლად იმისა, რომ კლასი თავად შექმნას ისინი.

ძირითადი განსხვავებები:

  • DIC - პროექტირების პრინციპი, DI - პროექტირების ნიმუში.
  • DIC - განსაზღვრავს, როგორ უნდა იყოს დამოკიდებულებები მაღალი და დაბალი დონის მოდულებს შორის (აბსტრაქციებზე დამოკიდებულება).
  • DI - მეთოდი, რომელიც საშუალებას აძლევს ამ დამოკიდებულებების რეალიზაციას. ეს კონკრეტული ტექნიკა არის დამოკიდებულებების მიწოდებისთვის ობიექტს.

დამოკიდებულების ჩართვის მაგალითები:

  • Constructor Injection: დამოკიდებულებები გადაეცემა კონსტრუქტორით.

    class UserFetcher {
        private let apiService: APIServiceProtocol // აბსტრაქციიდან დამოკიდებულება
    
        init(apiService: APIServiceProtocol) { // ჩართვა კონსტრუქტორით
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // გამოყენება apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Property Injection: დამოკიდებულებები სეტდება საჯარო თვისებებით (ხშირად გამოიყენება @IBOutlet ან თუ საჭიროა ოპციონალური დამოკიდებულება).

    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // დამოკიდებულება შეიძლება იყოს გარედან დაყენებული
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Method Injection: დამოკიდებულებები გადაეცემა მეთოდების პარამეტრებად.

    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // დამოკიდებულება გადაეცემა მეთოდს
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

ამგვარად, დამოკიდებულების ინვერსია — ეს არის მიზანი (耦合-ის შემცირება აბსტრაქციების მეშვეობით), ხოლო ჩართვა — ეს არის საშუალება (ერთი მეთოდი ამ მიზნის მისაღწევად).