iOS Interview Prep 6 — Dependency Injection
Câu hỏi phỏng vấn
- Tiêm phụ thuộc là gì và tại sao nó hữu ích?
- Bạn có thể đưa ra một ví dụ về cách sử dụng phép nội xạ phụ thuộc trong iOS không?
- Các loại tiêm phụ thuộc khác nhau (tiêm hàm xây dựng, tiêm setter, v.v.) và khi nào nên sử dụng từng loại?
- Làm cách nào để sử dụng phép nội xạ phụ thuộc để cải thiện khả năng kiểm tra của ứng dụng iOS?
- Bạn có thể thảo luận về một số thách thức hoặc cạm bẫy phổ biến phát sinh khi sử dụng phép nội xạ phụ thuộc trong quá trình phát triển iOS và cách tránh chúng không?
- Một số khung công tác tiêm phụ thuộc iOS phổ biến là gì và các tính năng và ưu điểm chính của chúng là gì?
- Bạn có thể thảo luận về một số phương pháp hay nhất để sử dụng phép nội xạ phụ thuộc trong quá trình phát triển iOS không?
Đảo ngược quyền kiểm soát là một mẫu thiết kế phần mềm tập trung vào việc chuyển quyền kiểm soát từ nhà phát triển sang khung. Sau đó, khung chịu trách nhiệm tạo và quản lý các phiên bản đối tượng, trong khi nhà phát triển chịu trách nhiệm cung cấp các cấu hình dành riêng cho ứng dụng.
Đó là một mẫu cho phép bạn đảo ngược luồng điều khiển. Để đạt được điều này, bạn di chuyển tất cả các trách nhiệm của một lớp, ngoại trừ trách nhiệm chính của nó ra bên ngoài, biến chúng thành các phần phụ thuộc của nó. Do đó, đối tượng của bạn không biết cách tạo chúng. Điều này làm cho mã có thể kiểm tra và bảo trì được bằng cách loại bỏ các mối quan hệ chặt chẽ giữa các lớp.
Tiêm phụ thuộc
Dependency Injection là một trong số ít mẫu giúp áp dụng các nguyên tắc của Inversion of Control. Bạn có thể triển khai DI theo nhiều cách
Xây dựng tiêm
Trong Constructor Injection, chúng tôi chuyển tất cả các phụ thuộc thông qua hàm tạo dưới dạng tham số.
protocol EngineProtocol {
func start()
func stop()
}
protocol TransmissionProtocol {
func changeGear(gear: Gear)
}
final class Car {
private let engine: EngineProtocol
private let transmission: TransmissionProtocol
init(engine: EngineProtocol, transmission: TransmissionProtocol) {
self.engine = engine
self.transmission = transmission
}
}
final class Car {
private var engine: EngineProtocol?
private var transmission: TransmissionProtocol?
func setEngine(engine: EngineProtocol) {
self.engine = engine
}
func setTransmission(transmission: TransmissionProtocol) {
self.transmission = transmission
}
}
Ý tưởng chính là một đoạn mã yêu cầu một số phụ thuộc sẽ không tự tạo ra chúng, thay vào đó, quyền kiểm soát việc cung cấp các phụ thuộc này được chuyển sang một số trừu tượng cao hơn.
Lợi ích chính của Inversion of Control là
- DI giúp cải thiện tính mô đun của mã của bạn, dễ hiểu và dễ bảo trì hơn
- Dễ dàng chèn các phụ thuộc giả hoặc giả trong quá trình thử nghiệm
- Tính linh hoạt và khả năng mở rộng của ứng dụng của bạn, bằng cách cho phép bạn dễ dàng thay thế hoặc hoán đổi các thành phần phụ thuộc được sử dụng bởi các thành phần của bạn.