Protolocos em Swift: Uma abordagem didática

Caio Santos
5 min readMar 17, 2023

--

Photo by Iker Urteaga on Unsplash

Nos primórdios da programação iOS os protocolos já existiam, mas eram muito mais usados por objetos nativos da plataforma, como UITableViews, UICollectionViews e afins. Não que os programadores não pudessem utilizar esta abordagem em suas implementações, porém, como o padrão de desenvolvimento mais difundido era o MVC, não havia tanta necessidade do uso extensivo dos protocolos.

Mas vamos lá, antes de mais nada, o que são protocolos e por que resolvi trazer esse assunto aqui, visto que temos diversos textos explicando sua utilização?

Protolocos, diferentes de Classes e Structs, são uma estrutura de definição, ou seja, não persistem dados, não possuem conteúdo e não armazenam estado. Antes de focarmos nos protocolos, vamos relembrar a grande diferença entre Classes e Structs:

  • Classes são estruturas que por natureza armazenam informação e são acessadas em memória por sua referência, ou seja, ao passar uma classe como parâmetro, estamos passando o endereço de memória em que aquele objeto se encontra, e qualquer alteração feita no mesmo irá afetar todos os contextos onde ele é usado.
Exemplo de uso de class no playground.
  • Structs são estruturas muito semelhantes às classes, pois também armazenam informação estruturada. No entanto, o acesso a seu conteúdo é feito por valor, ou seja, quando os dados de uma Struct são alterados dentro de um método, por exemplo, a Struct que existia fora do contexto do método não é afetada. Fisicamente, a cada momento que criamos uma nova variável e igualamos ela a uma Struct, estamos alocando outro espaço de memória para esta nova variável.
Exemplo de uso de structs no playground.

Fiz um vídeo explicando passo a passo as principais diferenças entre esse dois tipos de estrutura:

Ok, relembramos o básico sobre Structs e Classes, agora é hora de entender o funcionamento dos Protocolos.

Segundo a documentação oficial:

“Um protocolo define um esquema de métodos, propriedades e outros requisitos que atendem a uma determinada tarefa ou parte de funcionalidade. O protocolo pode então ser adotado por uma Class, Struct ou Enum para fornecer uma implementação real desses requisitos. Qualquer tipo que satisfaça os requisitos de um protocolo é considerado em conformidade com esse protocolo.”

Na prática, estamos falando de uma estrutura que serve como validadora. Dado um protocolo que define que um elemento precisa ter um nome, um método salvar e um método cancelar, qualquer que seja o elemento que tente implementar esse protocolo sem satisfazer esta REGRA, não deixará com que seu projeto compile. Para o pessoal que veio do .NET assim como eu, estamos falando de algo similar (para não dizer igual) as Interfaces do C#.

Meu primeiro contato com interfaces

Lá atrás, quando eu ainda não tinha tanta experiência com desenvolvimento, eu odiava o uso de Interfaces… Lembro como se fosse hoje quando estava codificando no Visual Studio e tentava navegar para uma classe e ele me mandava para a interface, e eu levava um tempo absurdo até encontrar de fato a implementação que eu estava buscando. Lembro de brincar com meus colegas que os arquitetos faziam isso só para complicar nossa vida.

Na verdade tínhamos dois problemas naquela época:

  • Minha ignorancia
  • IDEs ruins

O primeiro, era simples de ser resolvido, mas demandava vontade do indivíduo em estudar mais sobre abstração e desacoplamento. Sofri um longo tempo por não ter dado a devida atenção a estes estudos, mas hoje estou aqui compartilhando com vocês, para que não caiam na mesma cilada.

O segundo era mais complicado, pois na época fugia da nossa alçada de ação. Mas hoje em dia as IDEs estão mais robustas, e essa navegação ocorre de maneira mais inteligente.

Para que usamos protocolos e principais ganhos

Hoje consigo entender “para que dar tanta volta” e utilizar as interfaces ao invés das classes concretas. Na época faltava conhecimento, força de vontade para ir atrás e, talvez, alguém com vantade de explicar para quem ainda não tinha tanta facilidade de entender.

Como falamos no início do texto, no padrão MVC não temos tanta necessidade do uso de protocolos, visto que não existe tanta troca/passagem de dados entre as camadas, em tese, tudo acontece em nossas grandes Massive View Controllers. Você pode estar se perguntando:

“Mas Caio, uma das grandes vantagens do uso de protocolos é o desacoplamento e consequentemente facilitar os testes unitários. Isso é mais importante do que a troca de dados entre as camadas”

E eu respondo: Concordo que o maior benefício é o desacoplamento, bem como a flexibilidade de não precisar trabalhar com implementações concretas, porém, em um MVC onde o M era usado basicamente para mapear objetos das requisições REST, o V eram Xibs ou Storyboards e o C eram as Controllers que continham todo o resto, concorda que não havia espaço para desacoplamento?

Foi quando cabeças pensantes começaram a trazer novos padrões de desenvolvimento para o mundo iOS que a necessidade do uso de protocolos começou a ser mais difundida na comunidade. Em arquiteturas como VIP, VIPER e MVVM os protocolos são muito presentes (para não dizer indispensáveis) na comunicação entre as camadas.

Junto com estes novos padrões, nossa maturidade de testes unitários também começou a evoluir e foi mais um ponto em que os protocolos nos auxiliaram, pois é através deles que fazemos a tão falada injeção de dependência. E com esta última frase pode surgir outro questionamento:

“Caio, eu só posso injetar uma dependência se ela for um protocolo? Eu não poderia injetar uma implementação concreta que mesmo assim estaria fazendo uma DI?”

Concordo, o conceito da DI é deixar de instanciar os objetos internamente e passar a recebê-los via construtor ou propriedade. Pensando por esse lado perfeito, porém quando pensamos em testes de unidade, ao passarmos a implementação concreta para nosso SUT (System Under Test) estamos quebrando o conceito de UNIDADE, pois estamos trazendo mais implementações do que de fato precisaríamos para nosso cenário de teste. É ai que o Protocolo entra para nos ajudar a desacoplar (ainda mais) as camadas.

Agora que já listamos os pontos chave dos protocolos, o que acha de praticar um pouco, seguindo este vídeo que preparei sobre o assunto?

Já conhece o curso do Canal Comitando? Se ainda não, da uma olhadinha no material que preparamos para vocês. Toda semana tem vídeo novo 😉👊🏼

--

--

Caio Santos

Desenvolvedor Mobile que não larga o osso do .NET e do Javascript.