Preparação de entrevista para iOS 6 — Injeção de dependência
Questões de entrevista
- O que é injeção de dependência e por que ela é útil?
- Você pode dar um exemplo de como a injeção de dependência é usada no iOS?
- Quais são os diferentes tipos de injeção de dependência (injeção de construtor, injeção de setter, etc.) e quando cada tipo deve ser usado?
- Como a injeção de dependência pode ser usada para melhorar a capacidade de teste de um aplicativo iOS?
- Você pode discutir alguns desafios ou armadilhas comuns que surgem ao usar a injeção de dependência no desenvolvimento do iOS e como evitá-los?
- Quais são algumas estruturas populares de injeção de dependência do iOS e quais são seus principais recursos e vantagens?
- Você pode discutir algumas práticas recomendadas para usar a injeção de dependência no desenvolvimento do iOS?
Inversão de controle é um padrão de projeto de software que se concentra na transferência de controle do desenvolvedor para a estrutura. O framework é então responsável por criar e gerenciar as instâncias dos objetos, enquanto o desenvolvedor é responsável por fornecer as configurações específicas do aplicativo.
É um padrão que permite inverter o fluxo de controle. Para conseguir isso, você move todas as responsabilidades de uma classe, exceto a principal para fora, tornando-as suas dependências. Assim, seu objeto não sabe como criá-los. Isso torna o código testável e de fácil manutenção, eliminando relacionamentos rígidos entre as classes.
Injeção de dependência
A injeção de dependência é um dos poucos padrões que ajuda a aplicar princípios de inversão de controle. Você pode implementar DI de várias maneiras
Injeção de Construtor
No Constructor Injection, passamos todas as dependências através do construtor como parâmetros.
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
}
}
A ideia principal é que um trecho de código que requer algumas dependências não as criará para si mesmo, mas o controle sobre o fornecimento dessas dependências é adiado para alguma abstração superior.
O principal benefício da Inversão de Controle é que
- DI ajuda a melhorar a modularidade do seu código, mais fácil de entender e manter
- Fácil de injetar dependências simuladas ou falsas durante o teste
- Flexibilidade e extensibilidade do seu aplicativo, permitindo que você substitua ou troque facilmente as dependências usadas por seus componentes.