0Pricing
Swift Academy · Aula

Por que Usar Injeção de Dependências

Separe a construção do uso para facilitar os testes.

Por que Usar Injeção de Dependências é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Por Que Usar Injeção de Dependências

Injeção de dependências (DI) significa fornecer a um objeto aquilo de que ele precisa externamente, em vez de permitir que ele mesmo crie esses recursos. Isso desacopla os componentes e facilita a realização de testes.

O Problema: Acoplamento Forte

Quando um tipo constrói seus próprios colaboradores, ele fica preso a essas classes concretas e não pode ser reconfigurado nem testado de forma isolada.

class Logger {
    func log(_ m: String) { print("LOG: \(m)") }
}
class Service {
    let logger = Logger() // hard-coded dependency
    func run() { logger.log("running") }
}
Service().run()

O Acoplamento Prejudica os Testes

Como Service sempre cria um Logger real, um teste não consegue capturar nem simular a saída do registro. A dependência fica invisível externamente.

class Logger { func log(_ m: String) { print(m) } }
class Service {
    let logger = Logger()
    func run() { logger.log("hello") }
}
// No way to swap Logger here.
Service().run()

A Ideia: Injete a Dependência

Em vez disso, passe a dependência como argumento. Quem chama decide qual implementação fornecer, então Service deixa de se preocupar com isso.

class Logger { func log(_ m: String) { print("LOG: \(m)") } }
class Service {
    let logger: Logger
    init(logger: Logger) { self.logger = logger }
    func run() { logger.log("running") }
}
Service(logger: Logger()).run()

Benefícios do Desacoplamento

Com a injeção, o mesmo Service funciona com diferentes registradores, em produção ou em testes, sem alterar seu código.

class Logger { var lines: [String] = []
    func log(_ m: String) { lines.append(m) } }
class Service {
    let logger: Logger
    init(logger: Logger) { self.logger = logger }
    func run() { logger.log("event") }
}
let l = Logger()
Service(logger: l).run()
print(l.lines)

Responsabilidade Única

A DI apoia o princípio da responsabilidade única: um tipo se concentra em sua função e delega outras preocupações aos colaboradores injetados.

struct Mailer { func send(_ to: String) { print("Mail to \(to)") } }
struct SignupFlow {
    let mailer: Mailer
    func register(_ email: String) { mailer.send(email) }
}
SignupFlow(mailer: Mailer()).register("a@b.com")

Flexibilidade

Você pode recombinar objetos de novas maneiras. A ligação acontece nas extremidades do app, mantendo o núcleo flexível.

struct Engine { let power: Int }
struct Car {
    let engine: Engine
    func describe() { print("Power: \(engine.power)") }
}
Car(engine: Engine(power: 200)).describe()
Car(engine: Engine(power: 90)).describe()

Dependências Explícitas

Um inicializador que lista suas dependências documenta exatamente do que o tipo precisa. Dependências ocultas e criadas internamente escondem esse contrato.

struct Repo { func load() -> [Int] { [1, 2, 3] } }
struct Report {
    let repo: Repo // visible dependency
    func total() -> Int { repo.load().reduce(0, +) }
}
print(Report(repo: Repo()).total())

Composição em Vez de Construção

A DI favorece a composição de objetos externamente. Uma pequena raiz de composição monta o grafo; o restante do código apenas recebe aquilo de que precisa.

struct DB { func count() -> Int { 42 } }
struct Stats { let db: DB; func show() { print(db.count()) } }
// Composition root:
let app = Stats(db: DB())
app.show()

Não Apenas para Apps Grandes

Até programas pequenos se beneficiam: injetar uma dependência permite trocar o comportamento e deixa as intenções claras, sem frameworks adicionais.

struct Clock { func now() -> Int { 12 } }
struct Greeter {
    let clock: Clock
    func greet() { print(clock.now() < 12 ? "Morning" : "Afternoon") }
}
Greeter(clock: Clock()).greet()

Nenhum Framework é Necessário

A DI em Swift não precisa de biblioteca. Inicializadores simples e protocolos são suficientes. As próximas lições mostram a injeção pelo construtor, protocolos e simulações.

struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
    let adder: Adder
    func run() { print(adder.add(2, 3)) }
}
Calc(adder: Adder()).run()

Verificação Rápida

Qual é a ideia central da injeção de dependências?

Recapitulação

Injeção de dependências fornece colaboradores externamente, em vez de construí-los internamente, reduzindo o acoplamento, esclarecendo as dependências e possibilitando testes. No Swift, não é necessário usar um framework. A seguir, você verá a forma mais comum: a injeção pelo construtor.

Perguntas Frequentes

A aula “Por que Usar Injeção de Dependências” é grátis?

Sim — o texto completo de “Por que Usar Injeção de Dependências” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Por que Usar Injeção de Dependências”?

Separe a construção do uso para facilitar os testes. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Por que Usar Injeção de Dependências”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que Usar Injeção de Dependências
  2. Injeção pelo Inicializador
  3. Abstrações Baseadas em Protocolos
  4. Simulação de Dependências em Testes
← Voltar para Swift Academy