SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
17.11.2024

Aula 55: Programação Orientada a Protocólos

Na linguagem Swift, a programação orientada a protocolos (POP) é um paradigma que enfatiza o uso de protocolos como um meio principal de estruturar e organizar seu código. Os protocolos permitem que você defina diretrizes para métodos, propriedades e outros requisitos que atendem a uma tarefa ou funcionalidade específica. Isso permite que você escreva um código mais modular, reutilizável e testável.

Nesta aula, vamos explorar os conceitos da programação orientada a protocolos com exemplos para ilustrar esses princípios.

O que é um Protocolo?

Um protocolo em Swift é um modelo para métodos, propriedades e outros requisitos que atendem a uma tarefa ou funcionalidade específica. Você pode pensar nos protocolos como a estrutura para como diferentes tipos devem interagir. Veja como você define um protocolo:

protocol Veículo {
    var quantidadeDeRodas: Int { get }
    func dirigir()
}

No exemplo acima, definimos um protocolo Veículo que exige que os tipos que o implementam forneçam uma propriedade inteira quantidadeDeRodas e um método dirigir().

Conformidade com Protocolos

Um tipo pode se conformar a um protocolo implementando seus requisitos. Veja como um tipo Carro pode se conformar ao protocolo Veículo:

struct Carro: Veículo {
    var quantidadeDeRodas: Int { return 4 }

    func dirigir() {
        print("Dirigindo um carro com \(quantidadeDeRodas) rodas.")
    }
}

let meuCarro = Carro()
meuCarro.dirigir()  // Saída: Dirigindo um carro com 4 rodas.

Neste exemplo, Carro implementa as propriedades e métodos exigidos pelo protocolo Veículo.

Herança de Protocolos

Os protocolos podem herdar de outros protocolos, permitindo que você crie versões mais especializadas. Aqui está um exemplo:

protocol VeículoElétrico: Veículo {
    var nívelDaBateria: Double { get }
    func carregar()
}

struct CarroElétrico: VeículoElétrico {
    var quantidadeDeRodas: Int { return 4 }
    var nívelDaBateria: Double

    func dirigir() {
        print("Dirigindo um carro elétrico com \(quantidadeDeRodas) rodas e nível de bateria em \(nívelDaBateria)%")
    }

    func carregar() {
        print("Carregando o carro elétrico...")
    }
}

let meuCarroElétrico = CarroElétrico(nívelDaBateria: 80.0)
meuCarroElétrico.dirigir() // Saída: Dirigindo um carro elétrico com 4 rodas e nível de bateria em 80.0%

Aqui, VeículoElétrico herda de Veículo, acrescentando um requisito para nívelDaBateria e carregar().

Extensões e Protocolos

Você também pode usar extensões para adicionar implementações padrão de métodos definidos em um protocolo. Isso permite a reutilização de código e implementações mais limpas. Por exemplo:

extension Veículo {
    func iniciarMotor() {
        print("Iniciando o motor...")
    }
}

let minhaBicicleta: Veículo = Bicicleta()
minhaBicicleta.iniciarMotor()  // Saída: Iniciando o motor...

Neste exemplo, fornecemos uma implementação padrão para o método iniciarMotor(). Qualquer tipo que se conformar a Veículo terá essa funcionalidade sem precisar implementá-la explicitamente.

Benefícios da Programação Orientada a Protocólos

  1. Desacoplamento do Código: Os protocolos ajudam a reduzir o acoplamento entre diferentes componentes. Isso leva a uma arquitetura mais limpa.

  2. Reutilização: Os protocolos permitem que programadores definam interfaces comuns que podem ser reutilizadas por múltiplos tipos.

  3. Flexibilidade: Os protocolos podem ser adotados por classes, structs e enums, oferecendo flexibilidade na forma como você projeta seus tipos.

  4. Teste: Os protocolos facilitam a criação de objetos simulados para testes unitários, melhorando a testabilidade.

Exemplo: Um Simples Sistema de Loja

Vamos criar um simples sistema de loja onde definimos protocolos para diferentes tipos de produtos.

protocol Produto {
    var nome: String { get }
    var preço: Double { get }
}

struct Alimento: Produto {
    var nome: String
    var preço: Double
}

struct Livro: Produto {
    var nome: String
    var preço: Double
}

func imprimirInfoDoProduto(produto: Produto) {
    print("Produto: \(produto.nome), Preço: R$\(produto.preço)")
}

let maçã = Alimento(nome: "Maçã", preço: 0.99)
let livroSwift = Livro(nome: "A Linguagem de Programação Swift", preço: 49.99)

imprimirInfoDoProduto(produto: maçã)     // Saída: Produto: Maçã, Preço: R$0.99
imprimirInfoDoProduto(produto: livroSwift) // Saída: Produto: A Linguagem de Programação Swift, Preço: R$49.99

Neste exemplo, usamos um protocolo Produto para definir os requisitos para diferentes tipos de produtos, demonstrando a flexibilidade da programação orientada a protocolos.

Conclusão

A programação orientada a protocolos em Swift incentiva a escrita de um código mais modular e reutilizável, maximizando a flexibilidade. Ao criar protocolos e fazer tipos se conformarem a eles, você pode construir aplicações robustas que são mais fáceis de manter e expandir. Seja construindo aplicações simples ou sistemas complexos, abraçar a programação orientada a protocolos pode ser uma estratégia chave na sua jornada de desenvolvimento em Swift.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!