Sobes.tech
Middle

Qanday farq bor bog'liqliklarni teskari aylantirish va bog'liqliklarni kiritish?

sobes.tech AI

AIdan javob

Ba'zi bog'lanishni teskari aylantirish (Dependency Inversion Principle) SOLID tamoyillaridan biridir va quyidagicha aytiladi:

  1. Yuqori darajali modullar past darajali modullarga bog'liq bo'lmasligi kerak. Ikkalasi ham abstraktsiyalarga bog'liq bo'lishi kerak.
  2. Abstraktsiyalar detallar bilan bog'liq bo'lmasligi kerak, detallar abstraktsiyalarga bog'liq bo'lishi kerak.

Dependency Injection (DI) - bu dizayn shabloni bo'lib, bu bog'lanishni teskari aylantirishni ** amalga oshirishning ** usuli. Bu, bog'lanishlarni (bir sinfga bog'liq bo'lgan obyektlar) tashqaridan uzatishni anglatadi, sinf ularni o'zi yaratmasdan.

Asosiy farqlar:

  • DIC - dizayn tamoyili, DI - dizayn shabloni.
  • DIC - yuqori va past darajali modullar o'rtasidagi munosabatlar qanday bo'lishi kerakligini belgilaydi (abstraktsiyalarga bog'liqlik).
  • DI - bu munosabatlarni amalga oshirish uchun usul. Bu obyektga bog'lanishlarni ta'minlash uchun aniq texnikadir.

Bog'lanishni uzatish misollari:

  • Konstruktor orqali uzatish: Bog'lanishlar konstruktor orqali uzatiladi.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Abstraktsiyadan bog'lanish
    
        init(apiService: APIServiceProtocol) { // Konstruktor orqali uzatish
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // apiService dan foydalanish
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Xususiyat orqali uzatish: Bog'lanishlar jamoat xususiyatlari orqali o'rnatiladi (ko'pincha @IBOutlet bilan yoki bog'lanish ixtiyoriy bo'lsa).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Tashqaridan o'rnatilishi mumkin bo'lgan bog'lanish
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Yondashma orqali uzatish: Bog'lanishlar metod parametrlar sifatida uzatiladi.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Metodga bog'lanish uzatiladi
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Shu tarzda, bog'lanishni teskari aylantirish (abstraktsiyalar orqali bog'liqlikni kamaytirish) maqsad bo'lib, bog'lanishni uzatish bu maqsadga erishish uchun vositadir (bu maqsadga erishishning bir usuli).